diff --git a/.changepacks/changepack_log_figma_remote_mcp.json b/.changepacks/changepack_log_figma_remote_mcp.json new file mode 100644 index 0000000..c765e66 --- /dev/null +++ b/.changepacks/changepack_log_figma_remote_mcp.json @@ -0,0 +1,10 @@ +{ + "changes": { + "crates/devup-mcp/Cargo.toml": "Minor", + "crates/devup-mcp-figma/Cargo.toml": "Minor", + "crates/devup-mcp-devup-ui/Cargo.toml": "Minor", + "crates/devup-mcp-visual/Cargo.toml": "Minor" + }, + "note": "Add a Rust-native private Figma Remote MCP with OAuth and verified official-host fallback; exact-node and full-theme one-call acquisition with atomic, failed-root-only legacy fallback and a bounded shared upstream session; bounded memory-only artifact/resource reuse, URI-accurate native MCP resource links, independently readable binary assets and transactional file/resource delivery with verified rollback and retained recovery backups; Section screen selection and deterministic batch export; syntax-validated DevupUI TSX, devup.json, raw snapshot, source maps, requested assets and strictly decoded bounded reference PNG; source-derived typed fidelity impact, final-output provenance for non-default variants, one-to-one repeated text coverage and strict reports; a pure Rust PNG comparator plus renderer contract; loss-aware large-field continuation; all ten WQUW-151 screens; 268/268 plugin snapshot parity and a zero-not-ported 978-entry ledger; focused server module boundaries; non-duplicating CI snapshot drift enforcement; Rust 1.88-compatible dependency updates; an opencode-compatible MCP tool schema fix replacing boolean JSON Schema with object schemas across all 7 tools plus a raw-stdio regression test; and a further oxc/rmcp dependency refresh with the pinned toolchain raised to Rust 1.98", + "date": "2026-08-31T00:30:00+09:00" +} diff --git a/.changepacks/config.json b/.changepacks/config.json new file mode 100644 index 0000000..f54c6c6 --- /dev/null +++ b/.changepacks/config.json @@ -0,0 +1,5 @@ +{ + "ignore": ["**", "!/crates/*/Cargo.toml"], + "baseBranch": "main", + "latestPackage": null +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4fc3e04 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + pull_request: + push: + branches: [main] + +jobs: + verify: + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v7 + - uses: dtolnay/rust-toolchain@1.98.0 + with: + components: rustfmt, clippy + - uses: Swatinem/rust-cache@v2 + - run: cargo install cargo-insta --version 1.48.0 --locked + - run: cargo fmt --all -- --check + - run: cargo clippy --workspace --all-targets --all-features -- -D warnings + - run: cargo insta test --workspace --all-features --check + - run: cargo build --workspace --release diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0743a8d --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/target/ +*.log +.env +.env.* +!.env.example + diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ab65617 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4117 @@ +# 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.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" +dependencies = [ + "cipher", + "cpubits", + "cpufeatures 0.3.1", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "apple-native-keyring-store" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b350bfd03649e07aa05c0a81b3e15934374e585c98204a57e20b9d49f49bb9a" +dependencies = [ + "keyring-core", + "log", + "security-framework", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[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-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[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", + "parking", + "polling", + "rustix", + "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", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[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.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[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.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "aws-lc-rs" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", +] + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[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-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cap-primitives" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes 3.0.1", + "ipnet", + "maybe-owned", + "rustix", + "rustix-linux-procfs", + "windows-sys 0.61.2", + "winx", +] + +[[package]] +name = "cap-std" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ec78e242cfa2cfe276807ac2ecc00315a6c97786977414bcd1c3963b6c91b8" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes 3.0.1", + "rustix", +] + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cbc" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" +dependencies = [ + "crypto-common 0.2.2", + "inout", +] + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "combine" +version = "4.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compact_str" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fcda08c33bb58b97008b2cdada6622500e949e060f5913361763121abd2416" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "static_assertions", + "zmij", +] + +[[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" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" +dependencies = [ + "encode_unicode", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +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 = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.4", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "devup-mcp" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "base64 0.23.1", + "cap-std", + "devup-mcp-devup-ui", + "devup-mcp-figma", + "dunce", + "rand 0.10.2", + "reqwest", + "rmcp", + "schemars", + "serde", + "serde_json", + "sha2 0.11.0", + "tokio", + "tracing-subscriber", +] + +[[package]] +name = "devup-mcp-devup-ui" +version = "0.1.0" +dependencies = [ + "devup-mcp-figma", + "insta", + "oxc_allocator", + "oxc_parser", + "oxc_span", + "pretty_assertions", + "serde", + "serde_json", + "sha2 0.11.0", +] + +[[package]] +name = "devup-mcp-figma" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "base64 0.23.1", + "image", + "keyring", + "quick-xml", + "rand 0.10.2", + "reqwest", + "rmcp", + "serde", + "serde_json", + "sha2 0.11.0", + "subtle", + "tempfile", + "tokio", + "unicode-normalization", + "url", + "webbrowser", +] + +[[package]] +name = "devup-mcp-visual" +version = "0.1.0" +dependencies = [ + "anyhow", + "image", + "serde", + "serde_json", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "dragonbox_ecma" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[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.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[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 = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "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", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[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 = "fs-set-times" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" +dependencies = [ + "io-lifetimes 2.0.4", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +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 = "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.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "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 = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +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", + "moxcms", + "num-traits", + "png", +] + +[[package]] +name = "indexmap" +version = "2.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" +dependencies = [ + "block-padding", + "hybrid-array", +] + +[[package]] +name = "insta" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82" +dependencies = [ + "console", + "globset", + "once_cell", + "serde", + "similar", + "tempfile", + "walkdir", +] + +[[package]] +name = "io-extras" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" +dependencies = [ + "io-lifetimes 3.0.1", + "windows-sys 0.60.2", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + +[[package]] +name = "io-lifetimes" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96" + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.20", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[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.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keyring" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2270074a3d26bcac93c1dc5d2845eb4c089e8d761ccf6e0ea266a16004640627" +dependencies = [ + "apple-native-keyring-store", + "keyring-core", + "windows-native-keyring-store", + "zbus-secret-service-keyring-store", +] + +[[package]] +name = "keyring-core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e621458ca9c51aa110bd0339d4751a056b9576bf1253aee1aa560dda0fc9d" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[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.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[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 = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +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 = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.8", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + +[[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-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "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 0.4.8", + "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", +] + +[[package]] +name = "oauth2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" +dependencies = [ + "base64 0.22.1", + "chrono", + "getrandom 0.2.17", + "http", + "rand 0.8.8", + "serde", + "serde_json", + "serde_path_to_error", + "sha2 0.10.9", + "thiserror 1.0.69", + "url", +] + +[[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", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "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", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[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 = "oxc_allocator" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4721a6dea1ed51a31597a8865aac718c89ac6d6c91e1d67d1f632078a0518d97" +dependencies = [ + "allocator-api2", + "hashbrown", + "oxc_data_structures", + "rustc-hash", +] + +[[package]] +name = "oxc_ast" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b5c392641cfc4bd1a93881ee681f144d0213b1456288b2b6612f7eb8d2e02aa" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_estree", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", +] + +[[package]] +name = "oxc_ast_macros" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c233646788d3ae40492affb98185d167bdcc86c8b88ca661d784157404f4f62" +dependencies = [ + "phf", + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "oxc_data_structures" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe5adfd511d39d3619ce02317368553c79aa290abf1acaf0b4525cec9594e94" + +[[package]] +name = "oxc_diagnostics" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "606cda8ae718447dc41af63ec4fc53e99b104bde2fd7a3b9e3b9a4976020aa86" +dependencies = [ + "bytecount", + "cow-utils", + "itoa", + "memchr", + "oxc_span", + "percent-encoding", + "smallvec", + "textwrap", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "oxc_ecmascript" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c6e7b1ffc464822d838a33858ae95cc672481089c545a883771b8df9ac1d223" +dependencies = [ + "dragonbox_ecma", + "itoa", + "num-bigint 0.5.1", + "num-traits", + "oxc_ast", + "oxc_data_structures", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_estree" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac33adcec9582af677f3007e282530f7c8c507df7a3cb335383b79c0c57f574" + +[[package]] +name = "oxc_index" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "191884bee6c3744909a51acc7d78d4ae370d817b25875b10642f632327b6296e" +dependencies = [ + "nonmax", + "serde", +] + +[[package]] +name = "oxc_parser" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e7efce258a7587eac02e028db4121ac5c6935e4e2d46ea9cba7f54aa1919459" +dependencies = [ + "bitflags", + "cow-utils", + "memchr", + "num-bigint 0.5.1", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "seq-macro", +] + +[[package]] +name = "oxc_regular_expression" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4d2d6468b4c6c02595c735e337386d77b093ba91f71dd64242c12560b0f586" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_diagnostics", + "oxc_span", + "oxc_str", + "phf", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "oxc_span" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d038b28e7037ab6dfded105eb35d12cdc58f6b9959dee9ae3244142fd45852" +dependencies = [ + "compact_str", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_str", +] + +[[package]] +name = "oxc_str" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463caa681dcd52935465805af52f4fc8661c723b6ba36c6822222efb6078e655" +dependencies = [ + "compact_str", + "hashbrown", + "oxc_allocator", + "oxc_estree", +] + +[[package]] +name = "oxc_syntax" +version = "0.148.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460be58ae9013ebe0604cdfc0f558e71109e2ee948da5f9b40bc493056631e2d" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "nonmax", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_index", + "oxc_span", + "oxc_str", + "phf", + "unicode-id-start", +] + +[[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", + "smallvec", + "windows-link", +] + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fa8d0ca26d424d27630da600c6624696e7dec8bf7b3b492b383c5dc49e5e085" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[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", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +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 = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[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_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.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[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 = "rmcp" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b6914fac0be956fe704a38239c3f44a9f841d1b06a5713d2f638065593f5b5" +dependencies = [ + "async-trait", + "base64 0.23.1", + "bytes", + "chrono", + "futures", + "http", + "indexmap", + "oauth2", + "pastey", + "pin-project-lite", + "reqwest", + "rmcp-macros", + "schemars", + "serde", + "serde_json", + "sse-stream", + "thiserror 2.0.20", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "rmcp-macros" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf1c49bd4d52014b94db0877410db273c2008f01628b0252a2e9460ad9b7fda" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn 3.0.4", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[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 = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustix-linux-procfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" +dependencies = [ + "once_cell", + "rustix", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "aws-lc-rs", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "chrono", + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.4", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "secret-service" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5107b24b91445dd2aa449a258a1807b63240942157292354dc5bfdbeb8bc6db8" +dependencies = [ + "aes", + "cbc", + "futures-util", + "getrandom 0.4.3", + "hkdf", + "hybrid-array", + "num", + "once_cell", + "serde", + "sha2 0.11.0", + "zbus", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "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 = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[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 = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" +dependencies = [ + "serde", +] + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "sse-stream" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c123f296ade4ec4b8b0f6162116e6629f5146922ca5ab40ca9d3c2e73ab4761e" +dependencies = [ + "bytes", + "futures-util", + "http-body", + "http-body-util", + "pin-project-lite", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +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.119", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + +[[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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[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.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +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.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[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-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[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", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[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 = [ + "log", + "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.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[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 = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + +[[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-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[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 = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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 = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +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 = "webbrowser" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" +dependencies = [ + "jni", + "log", + "ndk-context", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "url", + "web-sys", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[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 = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[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.119", +] + +[[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.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-native-keyring-store" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063426e76fdec7438d56bb777f67e318a84a25c707b07e575cb8b78e10c028f8" +dependencies = [ + "byteorder", + "keyring-core", + "regex", + "windows-sys 0.61.2", + "zeroize", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[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", +] + +[[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", + "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_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.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.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.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.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.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.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 = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags", + "windows-sys 0.59.0", +] + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-secret-service-keyring-store" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74801d001b9e7729adb4f1825b67b398185fed424749aa3d8bacf70417137d9a" +dependencies = [ + "keyring-core", + "secret-service", + "zbus", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.4", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.4", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.4", + "winnow", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..12d46c4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,48 @@ +[workspace] +members = [ + "crates/devup-mcp", + "crates/devup-mcp-figma", + "crates/devup-mcp-devup-ui", + "crates/devup-mcp-visual", +] +resolver = "3" + +[workspace.package] +version = "0.1.0" +edition = "2024" +rust-version = "1.98" +license = "MIT" +repository = "https://github.com/dev-five-git/devup-mcp" + +[workspace.dependencies] +anyhow = "1" +async-trait = "0.1" +axum = "0.8" +base64 = "0.23" +cap-std = "4.0.3" +dunce = "1.0.5" +keyring = "4.2" +insta = { version = "1.48.0", features = ["glob", "json"] } +image = { version = "=0.25.10", default-features = false, features = ["png"] } +oxc_allocator = "=0.148.0" +oxc_parser = "=0.148.0" +oxc_span = "=0.148.0" +rand = "0.10" +quick-xml = "0.42" +reqwest = { version = "0.13", default-features = false, features = ["form", "json", "rustls"] } +rmcp = { version = "3.2", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] } +schemars = "1" +serde = { version = "1", features = ["derive"] } +serde_json = { version = "1", features = ["preserve_order"] } +sha2 = "0.11" +subtle = "2" +tokio = { version = "1", features = ["full"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } +url = "2" +unicode-normalization = "0.1" +webbrowser = "1" + +[profile.release] +lto = "thin" +strip = true diff --git a/README.md b/README.md index c02a7cf..da3e317 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,220 @@ # devup-mcp -Rust-native Model Context Protocol tooling for Devup. +Rust-native MCP server that reads Figma designs and generates DevupUI artifacts. One binary acts as a local stdio MCP server and a read-only client of Figma Remote MCP. + +저장소는 Cargo workspace이며 `devup-mcp` 실행 crate, OAuth·upstream·snapshot을 담당하는 `devup-mcp-figma`, TSX·theme projection을 담당하는 `devup-mcp-devup-ui`, PNG 비교 library/CLI인 `devup-mcp-visual`로 구성됩니다. 별도 IR/auth/server crate 없이 MCP 제품 설치 단위는 `devup-mcp` 하나입니다. + +## 현재 제공 기능 + +- `devup_figma_auth`: Figma 연결 상태 확인, 브라우저 OAuth 로그인, 로그아웃 +- `devup_figma_to_ui`: Figma node 링크를 `@devup-ui/react` TSX로 변환 +- `devup_figma_to_json`: Figma 변수와 로컬 스타일을 `devup.json`으로 변환 +- `devup_figma_export`: Figma를 한 번 수집해 TSX, `devup.json`, raw snapshot, source map, asset manifest와 선택적 reference PNG를 함께 생성하거나 같은 artifact를 재사용 +- `devup_figma_search`: 파일 전체의 page, section, frame, component를 이름으로 탐색 +- `devup_figma_explore`: 링크된 요구사항/라벨 주변의 실제 화면 후보를 공간 순서로 탐색 +- `devup_figma_continue`: host가 실행한 공식 Figma MCP read 결과로 중단된 변환을 재개 +- Figma Plugin API의 readable data property를 raw JSON으로 보존하고, 알려지지 않은 runtime field는 `extra`, 실패한 getter는 `fieldErrors`로 유지 + +host handoff 경로에는 Figma PAT, 사용자가 만든 OAuth app, 내장 client secret이 필요하지 않습니다. direct 경로는 Figma Remote MCP의 OAuth discovery, Dynamic Client Registration, PKCE S256과 일시적인 `127.0.0.1` callback을 구현하지만, Figma는 현재 MCP Catalog에 승인된 client의 registration만 허용합니다. private build에서는 이미 인증된 공식 Figma MCP를 사용하는 `auto` 또는 `host`가 기본 경로입니다. + +## 빌드와 설치 + +Rust 1.98 이상이 필요합니다. + +```bash +cargo install --git https://github.com/dev-five-git/devup-mcp.git --branch owjs3901/figma-remote-mcp devup-mcp +``` + +소스에서 검증하려면 다음을 실행합니다. + +```bash +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace --all-features +cargo insta test --workspace --all-features --check +cargo build --workspace --release +``` + +## MCP 설정 + +stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. + +```json +{ + "mcpServers": { + "devup-mcp": { + "command": "devup-mcp", + "args": ["--allow-write-root", "/absolute/path/to/workspace"] + } + } +} +``` + +시스템 브라우저는 `devup_figma_auth`의 `login`을 명시적으로 호출할 때만 열립니다. 일반 변환의 기본 `auto` 정책은 direct credential이 없거나 Catalog/capability가 허용되지 않으면 브라우저를 열지 않고 공식 Figma MCP handoff를 반환합니다. 인증 정보는 운영체제 credential store에만 저장되며 `logout`은 해당 정보만 삭제합니다. + +### 인증 + +```json +{ "action": "status" } +``` + +`action`은 `status`, `login`, `logout` 중 하나입니다. + +### Figma → DevupUI + +```json +{ + "url": "https://www.figma.com/design//?node-id=1-2", + "componentName": "OptionalComponentName", + "includeDiagnostics": true, + "rootLayout": "standalone", + "sourcePolicy": "auto", + "scope": "node", + "outputPath": "optional/path/Component.tsx" +} +``` + +결과에는 `tsx`, import 목록, 사용된 token, source 식별자, 보존한 node 수와 fallback diagnostics가 포함됩니다. Auto Layout은 `Flex`, 일반 container는 `Box`, text는 `Text`로 변환하고 theme binding이 있으면 JSX prop에서 `$token`을 우선 사용합니다. 변수 token은 비어 있지 않은 Figma `codeSyntax.WEB`을 우선하고, 없으면 변수 경로의 마지막 이름을 정규화합니다. 따라서 TSX의 `$token`, `usedTokens`, `devup.json` key와 source map이 같은 이름을 사용합니다. `rootLayout` 기본값인 `standalone`은 선택한 root의 크기·위치 제약까지 포함하고 Figma instance의 실제 자식 상태를 펼쳐 정의되지 않은 component 참조를 만들지 않습니다. 이미 레이아웃을 소유한 React 부모 안에 삽입할 때는 `rootLayout: "embedded"`로 root의 외부 크기·위치 제약만 생략합니다. + +### Figma → devup.json + +```json +{ + "url": "https://www.figma.com/design//?node-id=1-2", + "scope": "file", + "includeDiagnostics": true, + "sourcePolicy": "auto", + "outputPath": "optional/path/devup.json" +} +``` + +결과는 `theme.colors`, `theme.typography`, `theme.length`, `theme.shadow`를 포함하는 결정적 JSON 문자열과 counts, completeness를 반환합니다. + +`outputPath`를 생략하면 결과를 메모리와 MCP 응답에만 유지합니다. 명시하면 생성된 TSX 또는 `devup.json`만 해당 경로에 기록하고 실제 절대 경로를 응답합니다. 기본 허용 write root는 `devup-mcp` process 시작 당시의 current directory 하나이며, 그 밖의 workspace는 반복 가능한 `--allow-write-root ` 시작 인자로만 추가할 수 있습니다. Tool 입력으로 root 자체를 넓힐 수 없고 `..`, 다른 drive/UNC, alternate data stream, symlink/junction을 통한 root 탈출은 기록 전에 거절됩니다. + +여러 text/asset output은 모두 검증한 뒤 같은 directory의 exclusive 임시 파일에 staging하고 한 transaction으로 교체합니다. 정상 runtime 오류에서는 이미 교체한 파일을 역순으로 되돌리고 기존 파일을 복구합니다. 개별 rename은 atomic하지만 여러 directory와 process crash를 가로지르는 완전한 원자성은 일반 filesystem 특성상 보장하지 않습니다. + +### 통합 수집과 다중 출력 + +```json +{ + "url": "https://www.figma.com/design//?node-id=1-2", + "outputs": ["tsx", "devupJson", "sourceMap", "assetManifest", "referencePng"], + "scope": "node", + "strict": true, + "refresh": false, + "sourcePolicy": "auto", + "delivery": "auto" +} +``` + +`devup_figma_export`는 동일한 node/resource acquisition에서 여러 projection을 생성합니다. 응답의 `cache.artifactId`를 다음 요청의 `artifactId`로 넘기면 Figma를 다시 호출하지 않고 다른 output을 만들 수 있습니다. URL 요청은 같은 process 안에서 10분 TTL, 최대 8개/항목당 32 MiB/전체 128 MiB인 memory-only LRU cache를 재사용하며, `refresh: true`는 URL을 새로 수집해 기존 fresh artifact를 우회합니다. `cache.capabilities`는 artifact의 `kind`(`design`, `theme-only`, `search`, `explore`), `collectionScope`, `resourceScope`, `referencePng` 보유 여부와 redacted `assetCaptureCount`만 공개합니다. 내부 artifact는 asset ID·format·scale 전체를 보존하고 세 값이 정확히 같은 capture만 추가 Figma 호출 없이 재사용합니다. 재사용 요청이 이 범위를 넘으면 `DEVUP_FIGMA_HANDOFF_INVALID`로 투영과 파일 기록 전에 거절합니다. 예를 들어 node/used-resource artifact로 file 전체 `devupJson`을 만들거나 screenshot을 수집하지 않은 artifact로 `referencePng`를 만들 수 없습니다. credential, screenshot과 asset binary는 cache key나 통계에 포함하지 않고, process가 끝나면 cache도 사라집니다. + +`delivery`는 `auto | inline | resource`입니다. `auto`는 JSON escape, base64와 structured/text 이중 표현을 포함한 실제 MCP wire 크기를 계산해 개별 256 KiB·합계 1 MiB 이하만 inline으로 반환하고, 그보다 큰 결과는 native MCP `ResourceLink`와 `devup://artifact/...` URI로 바꿉니다. 링크 URI는 JSON manifest를 가리키므로 link MIME은 `application/json`이고 payload MIME·길이·SHA-256은 `payload*` metadata로 분리합니다. `resource`는 크기와 무관하게 TSX/JSON/PNG를 bounded chunk resource로 제공하며, binary chunk는 base64 MCP blob입니다. asset manifest는 binary를 내장하지 않고 각 asset의 독립 resource URI·MIME·길이·SHA-256을 참조하므로 `resources/read`로 원본 bytes를 정확히 재구성할 수 있습니다. 같은 artifact와 정규화한 projection은 content hash가 같은 resource를 재사용합니다. 파일 출력과 새 resource publication을 함께 요청하면 resource 조회를 reservation 동안 차단한 하나의 transaction으로 다루며, 파일 commit이 전부 성공한 뒤에만 resource와 LRU 변경을 공개합니다. 실패하면 원래 파일을 fingerprint로 검증해 복원하고 복원 불능 backup 경로를 구조화해 보고합니다. 현재 transaction이 만든 temp는 정상 종료·rollback에서 직접 제거하지만, 소유권을 증명할 수 없는 pre-existing temp나 crash·rollback recovery backup은 자동 삭제하지 않습니다. + +`referencePng`는 선택했을 때만 공식 read-only `get_screenshot`을 정확히 한 번 추가 호출합니다. 결과는 정확히 하나의 top-level `image/png` content block이어야 하며, JSON/text에 숨긴 image나 다중 image는 거절합니다. 16 MiB compressed, 8192px, 64 MiB decoded 상한 안에서 PNG 전체를 실제 decode한 뒤 byte length와 SHA-256을 확인해 artifact에 보존하며, 단일 링크 node에만 적용됩니다. Section의 여러 Frame은 먼저 반환된 canonical URL별로 수집해야 합니다. PNG bytes는 log·통계·cache key에 포함되지 않으며 `outputPaths.referencePng`를 명시하지 않으면 디스크에 기록하지 않습니다. + +모든 완료 응답에는 다음처럼 요청한 산출물별 `quality`가 포함됩니다. + +```json +{ + "status": "complete", + "quality": { + "acquisition": "complete", + "projection": "exact", + "theme": "not-requested", + "assets": "not-requested" + } +} +``` + +`acquisition`은 `complete | expected-projection | partial | failed`, `projection`은 `exact | approximated | lossy | failed | not-requested`, `theme`은 `complete | conflicted | unresolved | not-requested`, `assets`는 `complete | partial | failed | not-requested`입니다. 검색·탐색의 의도적인 얕은 graph는 `expected-projection`으로 정상 완료하지만, 포함된 field의 실패나 truncation은 `partial`입니다. mask/effect fallback은 `lossy`, absolute layout fallback은 `approximated`이며 `includeDiagnostics: false`여도 품질 판정에는 반영됩니다. 기존 `status`는 요청한 모든 축이 정확하거나 완전할 때만 `complete`이고, `strict: true`는 모든 요청 축이 exact/complete가 아니면 quality와 `completenessReport`를 담은 오류로 거절합니다. + +모든 공개 TSX generator는 반환 전에 Rust의 고정된 TypeScript+JSX parser를 통과합니다. parser 오류는 디자인 원문을 노출하지 않고 byte range와 오류 category만 반환합니다. 응답의 `fidelity`는 생성된 mapping 수가 아니라 수집한 source snapshot에서 독립적으로 계산한 node/text segment/variable/style/asset/layout 기대 집합을 분모로 사용하고, 각 항목이 최종 TSX byte range에서 `emitted | flattened | ignored` 중 정확히 하나로 추적되었는지와 축별 coverage·typed impact count를 담습니다. component set, non-default variant selector와 inline instance도 최종 변환 후 source identity별 provenance를 다시 만들며, 반복된 동일 text segment는 하나의 mapping을 재사용하지 않고 occurrence별로 소비하고 multiline·중첩 text와 asset identity를 검증합니다. 알 수 없는 codegen warning/error도 각각 최소 `approximated`/`failed`로 보수적으로 판정하며, `strict`는 syntax, source-derived trace coverage, lossy/failed impact를 함께 검사합니다. + +브라우저 시각 회귀는 MCP 서버가 임의 명령을 실행하지 않고 소비자 repository가 실제 font/asset/DevupUI 환경으로 `actual.png`를 만든 뒤 순수 Rust `devup-mcp-visual`로 비교합니다. renderer pinning, 기본 0.5% threshold, diff PNG와 개인정보 취급 계약은 [`docs/visual-renderer-contract.md`](docs/visual-renderer-contract.md)에 있습니다. + +Section 링크에서 TSX를 요청하면 먼저 내부 screen frame 후보와 canonical URL을 `selection_required`로 반환합니다. `frameIds`로 검토한 frame만 고르거나 `allScreens: true`로 모든 화면을 시각 순서대로 batch export할 수 있으며 두 옵션은 동시에 사용할 수 없습니다. `sourceMap`은 생성 TSX/devup.json의 output 위치를 Figma node, variable, style, asset ID에 연결하는 sidecar입니다. `assetManifest`는 image hash/vector/export provenance를 항상 열거하고, `assetRequests`로 명시한 항목만 최대 16개·scale 1~4 범위에서 read-only SVG/PNG export합니다. `outputPath`를 지정하면 binary를 해당 파일로 디코딩하고 응답의 base64를 제거하며, 생략하면 후속 소비를 위해 base64가 memory-only artifact와 해당 MCP 응답에 남을 수 있습니다. + +### Figma 이름 검색 + +```json +{ + "url": "https://www.figma.com/design//", + "query": "A : STORY-F-PROOFREAD", + "nodeTypes": ["PAGE", "SECTION", "FRAME", "COMPONENT_SET"], + "match": "normalized", + "limit": 20, + "sourcePolicy": "auto" +} +``` + +검색은 먼저 read-only Plugin API로 실제 `figma.root.children` page catalog를 얻고, page마다 한 번씩 전환하는 작은 query projection을 병렬 실행합니다. 전체 page snapshot을 응답하지 않으므로 큰 파일에서도 공식 MCP text 상한을 피합니다. 결과는 원문 exact, Unicode NFC·공백·대소문자를 정규화한 exact, prefix, contains 순으로 정렬하고 `match: "fuzzy"`일 때만 오타 허용 검색을 추가하며, node ID, type, page, 전체 breadcrumb와 후속 `devup_figma_to_ui`에 그대로 전달할 canonical URL을 포함합니다. + +### 링크 주변 화면 탐색 + +```json +{ + "url": "https://www.figma.com/design//?node-id=1-2", + "limit": 50, + "includeTextPreview": true, + "sourcePolicy": "auto" +} +``` + +요구사항 제목이나 설명 node 링크가 실제 구현 화면이 아닐 때 `devup_figma_explore`를 먼저 호출합니다. anchor와 같은 공간 묶음의 frame/component 후보를 시각 순서와 canonical URL로 반환하며, 다음 요구사항 제목에서 탐색 범위를 끝냅니다. 원하는 후보의 canonical URL을 `devup_figma_to_ui`에 넘겨 정확한 화면만 변환합니다. + +탐색과 검색은 변수 catalog를 수집하지 않습니다. 정확한 UI 변환 단계에서 선택 subtree의 모든 보존 필드에 있는 `VARIABLE_ALIAS`와 paint/text/effect/grid style ID를 재귀적으로 스캔하고, 실제 사용된 ID만 공식 Figma API로 조회합니다. `devup_figma_to_json`만 file 전체 로컬 catalog를 수집합니다. + +`sourcePolicy`는 `auto`, `direct`, `host` 중 하나입니다. `needs_figma` 응답의 read-only call을 host의 공식 Figma MCP에서 실행한 뒤 원본 result를 `devup_figma_continue`의 `sessionId`, `callId`, `result`로 전달하면 동일한 Rust collector가 이어서 처리합니다. session은 메모리에만 최대 10분 유지되며 완료·오류·만료 시 제거됩니다. + +정확한 node 링크의 UI 변환은 우선 하나의 공식 `use_figma` 호출 안에서 subtree 전체와 실제 사용 리소스를 수집합니다. JSON envelope를 512 KiB 단위로 나누고 각 조각을 CRC가 있는 1×1 PNG에 담아 MCP 응답 크기 제한을 피하며, Rust는 MIME·base64·PNG 구조·청크 순서·schema·대상 ID·node graph·리소스 참조를 모두 검증한 뒤에만 결과를 채택합니다. 한 항목이라도 불일치하면 fast 결과 전체를 버리고 기존 cursor 수집을 0부터 재시작합니다. Section multi-root에서는 성공한 root와 resource는 그대로 보존하고 실패하거나 상한을 넘은 root만 legacy로 다시 수집한 뒤 원래 시각 순서로 합칩니다. direct upstream은 연결과 read-only tool catalog를 한 session에서 재사용하고 30초 TTL, 연결 종료 또는 transport 오류 때만 재연결·재검증합니다. 결과의 `stats`에는 `figmaToolCalls`, `transport`, `fallbackUsed`, node/variable/style 수와 byte/청크 수만 포함되며 원본 디자인이나 인증 정보는 포함되지 않습니다. + +완전성 등급은 다음과 같습니다. + +- `full-local-plus-used-remote`: 로컬 전체와 사용된 외부 token을 모두 확인 +- `used-tokens`: 확보한 token만 변환했으며 외부 전체를 보장하지 않음 +- `resolved-values-only`: 의미 있는 token binding 없이 계산값만 확보 + +## 읽기 전용·개인정보 보호 + +- upstream 호출은 `get_metadata`, `get_variable_defs`, `get_design_context`, `get_code_connect_map`, `get_screenshot`과 내장된 read-only `use_figma` script로 닫혀 있습니다. +- 사용자 입력 JavaScript를 받지 않으며 Figma document mutation API를 호출하지 않습니다. `figma.io.write`는 공식 MCP 응답으로 검증 가능한 1×1 PNG를 반환하는 transport에만 사용하며 Figma 파일을 변경하지 않습니다. +- stdout에는 MCP frame만 출력하고 trace는 stderr로 보냅니다. +- access token, refresh token, OAuth code, PKCE verifier는 Debug, trace와 MCP error에 포함하지 않습니다. +- Figma snapshot과 screenshot을 기본적으로 디스크에 저장하지 않습니다. +- screenshot, asset, TSX resource는 bounded memory artifact와 같은 TTL을 가지며 resource manifest에는 이름·MIME·크기·hash만 노출됩니다. +- 호환성 fixture는 고정한 JavaScript 플러그인의 268개 synthetic 입력입니다. 별도의 WQUW-151 회귀 fixture는 공식 MCP에서 read-only로 수집한 디자인 node/텍스트/token 이름만 포함하며 OAuth token, header, callback parameter, 사용자 계정·email은 포함하지 않습니다. + +### 플러그인 호환성 corpus + +`fixtures/devup-figma-plugin`은 `dev-five-git/devup-figma-plugin`의 고정 commit `243db650f1d635ab5385546a2a297eae4ea93515`에서 수집한 54개 test file과 978개 passing-test inventory를 추적합니다. upstream test 252개가 만든 JSON/golden 268쌍은 Rust serde/codegen 경로에서 byte parity를 전부 실행하고, 666개는 같은 동작 영역의 실제 Rust assertion에 연결했습니다. 나머지는 plugin module/codegen handler/iframe/notify/browser download 수명주기 38개와 read-only MCP가 의도적으로 수행하지 않는 Figma document/style/import write 22개입니다. `not_ported`는 0개이며, 비-parity 항목도 구체적인 MCP 경계 test를 가리킵니다. 즉 정확한 보장은 “268/268 snapshot byte parity, 666개 실행 가능한 대표 Rust assertion 연결, 60개 명시적 runtime/write 경계, 978-entry inventory”이고 JavaScript assertion 978개를 각각 별도 fixture로 복제했다는 뜻은 아닙니다. manifest는 LF로 정규화한 fixture와 snapshot 536개 파일의 SHA-256을 검증하고, coverage registry는 ledger가 실제 Rust test symbol 또는 근거가 있는 비-parity 분류만 참조하도록 강제합니다. 상세 분류와 실행 방법은 [`fixtures/devup-figma-plugin/README.md`](fixtures/devup-figma-plugin/README.md)를 참고하세요. + +### 실제 Figma JSON contract gate + +`crates/devup-mcp/tests/live_figma_contract.rs`는 기본적으로 ignore됩니다. `DEVUP_MCP_LIVE_FIGMA=1`을 설정하고 공식 MCP의 fast `use_figma` 결과를 stdin에 한 줄로 전달하면 실제 payload를 디스크에 쓰거나 출력하지 않고 envelope 무결성, serde round-trip, 요청 context, node/리소스 수와 DevupUI codegen을 검증하고 안전한 count/hash 요약만 출력합니다. 별도의 비-ignore corruption test는 깨진 fast 응답이 legacy metadata 수집으로 원자적으로 폴백하는지 확인합니다. + +legacy 경로에서 실제 확인된 공식 metadata는 XML text content envelope이며, local 변수/style은 catalog 후 resource 단위로 수집합니다. style의 `consumers`처럼 단일 field가 공식 MCP의 약 20,500자 text 상한을 넘을 수 있으므로, base field와 320개 단위의 compact consumer relation을 분리해 읽고 Rust에서 원래 exhaustive JSON shape로 재조립합니다. legacy node snapshot도 byte budget과 cursor를 사용해 같은 상한 아래에서 자동 재개합니다. range의 누락·중복이나 수집 중 목록 변경은 성공으로 숨기지 않고 오류로 처리합니다. + +### Server module ownership + +`server/mod.rs`는 MCP tool router, service construction, handoff 연결과 `ServerHandler`만 소유합니다. `projection.rs`는 TSX/theme/source-map/asset/reference output 생성과 delivery transaction을, `validation.rs`는 output/schema/artifact capability 입력 검증을 담당합니다. `delivery.rs`, `artifacts.rs`, `output.rs`, `resources.rs`, `quality.rs`는 각각 크기 결정, memory artifact, allowlisted filesystem transaction, MCP resource protocol, typed 품질 집계를 담당하며 source-level boundary test가 generator와 filesystem 구현이 router로 되돌아오는 것을 막습니다. + +2026-09-01 실제 파일 검증에서는 13개 page 전체 검색으로 `[FR-026] 본연체` Section (`4217:7743`)을 찾고, 그 안의 360×740 화면 10개를 시각 순서대로 인덱싱해 `A : STORY-F-PROOFREAD` (`3879:35518`)를 정확한 대상으로 선택했습니다. Section 전체 fast envelope는 8 MiB 안전 상한을 넘어서므로 성공으로 오인하지 않고, 각 화면을 공식 read-only MCP로 개별 수집했습니다. 열 화면은 각각 15~210개 node를 가지며 모든 child, styled text segment, 변수 3~25개와 text style 2~13개의 참조 완전성을 실제 JSON fixture와 DevupUI TSX snapshot으로 검증합니다. 대표 proofread 화면은 공식 read-only MCP 1회, 3개 PNG envelope 청크에서 144개 node, 변수 20개와 text style 11개를 수집했고 폴백은 없었습니다. instance children, concrete boolean property, mixed typography, nested `[1. 이름]`, token binding과 개별 footer stroke도 Rust snapshot/live contract로 검증했습니다. 같은 파일의 전체 theme export는 legacy 공식 read-only 호출 89개를 통해 collection 1개, variable 49개, style 37개, mode 2개를 수집해 42,794자 `devup.json`을 생성했으며 diagnostics는 0개였습니다. 현재 full-theme fast collector는 같은 collection/variable/style 전체를 단일 read-only `use_figma` 호출로 수집하고, envelope 검증 실패 시에만 이 legacy 경로를 0부터 다시 시작하도록 contract test로 고정했습니다. + +## Snapshot 의미와 현재 한계 + +Figma Remote MCP에서는 `JSON_REST_V1` export가 허용되지 않으므로 host object를 그대로 REST JSON으로 만들 수 없습니다. 대신 checked-in property manifest와 runtime prototype/enumerable 탐색을 함께 사용해 모든 발견한 data field의 key와 읽기 결과를 보존합니다. 함수, 순환 node object는 제외하거나 id로 바꾸고, binary asset은 bytes 대신 metadata로 나타내며, 타 plugin private data와 오류를 내는 getter는 읽을 수 없습니다. 단일 값이 byte budget을 넘으면 key를 없애지 않고 `{ "$truncated": ..., "byteLength": ... }`와 `DEVUP_FIELD_VALUE_TRUNCATED`를 남기며, `characters`, styled segment, resource binding처럼 UI 변환에 필요한 값은 우선 보존합니다. + +현재 private MVP의 남은 한계는 다음과 같습니다. + +- 공식 `get_metadata`의 file-level page 목록은 실제 page 전체보다 적게 반환될 수 있습니다. 이름 검색은 Plugin API page catalog와 per-page projection으로 우회하며 실제 13개 page 파일에서 검증했습니다. +- 매우 큰 computed field(예: vector `fillGeometry`)는 현재 값 전체 대신 명시적인 byte-length marker로 보존됩니다. 모든 대용량 field 값을 lossless하게 export하는 기능은 후속 wire-format 개선 대상입니다. +- exact-node fast envelope가 8 MiB 안전 상한을 넘거나 공식 MCP가 image transport를 바꾸면 자동 legacy fallback이 여러 cursor call을 사용하므로 subtree 크기에 따라 시간이 늘어날 수 있습니다. +- direct OAuth registration은 Figma MCP Catalog 승인이 없는 private client에서 거절됩니다. `auto`/`host` fallback은 host가 인증한 공식 Figma MCP로 실제 검증했습니다. +- 사용되지 않은 외부 Figma library 변수 전체는 Remote MCP가 제공하지 않을 수 있습니다. +- node/page theme scope는 로컬 변수 API의 file-wide 결과를 기반으로 하며 세밀한 사용 범위 필터는 후속 보강 대상입니다. +- vector, mask, image, absolute layout과 일부 effect는 diagnostics를 포함한 제한적 fallback입니다. +- Figma Remote MCP의 `use_figma` tool contract가 바뀌면 live smoke test와 adapter 갱신이 필요합니다. + +상세 설계는 [`docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md`](docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md)를 참고하세요. diff --git a/crates/devup-mcp-devup-ui/Cargo.toml b/crates/devup-mcp-devup-ui/Cargo.toml new file mode 100644 index 0000000..49dc245 --- /dev/null +++ b/crates/devup-mcp-devup-ui/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "devup-mcp-devup-ui" +description = "DevupUI TSX and devup.json projection for devup-mcp" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +devup-mcp-figma = { path = "../devup-mcp-figma" } +oxc_allocator.workspace = true +oxc_parser.workspace = true +oxc_span.workspace = true +serde.workspace = true +serde_json.workspace = true +sha2.workspace = true + +[dev-dependencies] +insta.workspace = true +pretty_assertions = "1" diff --git a/crates/devup-mcp-devup-ui/src/codegen/compat.rs b/crates/devup-mcp-devup-ui/src/codegen/compat.rs new file mode 100644 index 0000000..d858b51 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/compat.rs @@ -0,0 +1,572 @@ +use std::collections::BTreeSet; + +use serde_json::{Map, Value, json}; + +use super::normalize_component_name; + +pub fn extract_devup_imports(components: &[Value]) -> Vec { + let mut imports = BTreeSet::new(); + for component in components { + let Some(metadata) = component_metadata(component) else { + continue; + }; + if let Some(values) = metadata.get("devupImports").and_then(Value::as_array) { + imports.extend(values.iter().filter_map(Value::as_str).map(str::to_owned)); + } + if metadata.get("usesKeyframes").and_then(Value::as_bool) == Some(true) { + imports.insert("keyframes".to_owned()); + } + } + imports.into_iter().collect() +} + +pub fn extract_custom_component_imports(components: &[Value]) -> Vec { + let devup = extract_devup_imports(components) + .into_iter() + .collect::>(); + let mut imports = BTreeSet::new(); + for component in components { + let Some(metadata) = component_metadata(component) else { + continue; + }; + if let Some(values) = metadata.get("customImports").and_then(Value::as_array) { + imports.extend( + values + .iter() + .filter_map(Value::as_str) + .filter(|value| !devup.contains(*value)) + .map(str::to_owned), + ); + } + } + imports.into_iter().collect() +} + +pub fn generate_import_statements(components: &[Value]) -> String { + let devup = extract_devup_imports(components); + let custom = extract_custom_component_imports(components); + if devup.is_empty() && custom.is_empty() { + return String::new(); + } + let mut lines = Vec::new(); + if !devup.is_empty() { + lines.push(format!( + "import {{ {} }} from '@devup-ui/react'", + devup.join(", ") + )); + } + lines.extend( + custom + .iter() + .map(|name| format!("import {{ {name} }} from '@/components/{name}'")), + ); + format!("{}\n\n", lines.join("\n")) +} + +pub fn render_component_usage(node: &Value) -> Option { + let node_type = node.get("type")?.as_str()?; + if !matches!(node_type, "COMPONENT" | "COMPONENT_SET" | "INSTANCE") { + return None; + } + let parent = node + .get("parent") + .filter(|parent| parent.get("type").and_then(Value::as_str) == Some("COMPONENT_SET")); + let name = if node_type == "COMPONENT" { + parent + .and_then(|parent| parent.get("name")) + .and_then(Value::as_str) + .or_else(|| node.get("name").and_then(Value::as_str))? + } else { + node.get("name")?.as_str()? + }; + let name = normalize_component_name(name); + let properties = if node_type == "INSTANCE" { + node.get("componentProperties").and_then(Value::as_object) + } else if node_type == "COMPONENT" { + parent + .and_then(|parent| parent.get("componentPropertyDefinitions")) + .and_then(Value::as_object) + .or_else(|| { + node.get("componentPropertyDefinitions") + .and_then(Value::as_object) + }) + } else { + node.get("componentPropertyDefinitions") + .and_then(Value::as_object) + }; + let value_field = if node_type == "INSTANCE" { + "value" + } else { + "defaultValue" + }; + let mut attributes = Vec::new(); + let mut text_properties = Vec::new(); + let mut added = BTreeSet::new(); + + if node_type == "COMPONENT" + && let Some(variants) = node.get("variantProperties").and_then(Value::as_object) + { + for (raw_key, value) in variants { + push_string_attribute(&mut attributes, &mut added, raw_key, value.as_str(), true); + } + } + if let Some(properties) = properties { + for (raw_key, property) in properties { + let property_type = property.get("type").and_then(Value::as_str); + let value = property.get(value_field); + match property_type { + Some("VARIANT") => push_string_attribute( + &mut attributes, + &mut added, + raw_key, + value.and_then(Value::as_str), + true, + ), + Some("BOOLEAN") if value.and_then(Value::as_bool) == Some(true) => { + let key = component_property_name(raw_key); + if added.insert(key.clone()) { + attributes.push(key); + } + } + Some("TEXT") => { + if let Some(value) = value.and_then(Value::as_str) { + let key = component_property_name(raw_key); + if added.insert(key.clone()) { + text_properties.push((key, value.to_owned())); + } + } + } + _ => {} + } + } + } + if text_properties.len() == 1 { + let (_, text) = &text_properties[0]; + let attributes = if attributes.is_empty() { + String::new() + } else { + format!(" {}", attributes.join(" ")) + }; + return Some(format!( + "<{name}{attributes}>{}", + escape_jsx_text(text) + )); + } + attributes.extend( + text_properties + .into_iter() + .map(|(key, value)| format!("{key}=\"{}\"", escape_attribute(&value))), + ); + if attributes.is_empty() { + Some(format!("<{name} />")) + } else { + Some(format!("<{name} {} />", attributes.join(" "))) + } +} + +fn component_metadata(component: &Value) -> Option<&Map> { + component + .get("metadata") + .or_else(|| component.as_array().and_then(|values| values.get(2))) + .and_then(Value::as_object) +} + +fn component_property_name(raw: &str) -> String { + raw.split('#').next().unwrap_or(raw).to_owned() +} + +fn push_string_attribute( + attributes: &mut Vec, + added: &mut BTreeSet, + raw_key: &str, + value: Option<&str>, + filter_reserved: bool, +) { + let key = component_property_name(raw_key); + if filter_reserved && matches!(key.to_ascii_lowercase().as_str(), "effect" | "viewport") { + return; + } + if let Some(value) = value + && added.insert(key.clone()) + { + attributes.push(format!("{key}=\"{}\"", escape_attribute(value))); + } +} + +fn escape_attribute(value: &str) -> String { + value + .replace('&', "&") + .replace('"', """) + .replace('<', "<") + .replace('>', ">") +} + +fn escape_jsx_text(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('{', "{") + .replace('}', "}") +} + +pub fn render_codegen_provider(input: &Value, pure_code: &str) -> Option { + if input + .get("language") + .and_then(Value::as_str) + .is_some_and(|value| value != "devup-ui") + { + return Some("[]".to_owned()); + } + let node = input.get("node").unwrap_or(input); + let name = normalize_component_name(node.get("name")?.as_str()?); + let node_type = node.get("type")?.as_str()?; + let section_pure; + let pure_code = if node_type == "SECTION" { + section_pure = format!( + "\n{}\n", + node.get("children")? + .as_array()? + .iter() + .map(|_| " ") + .collect::>() + .join("\n") + ); + section_pure.as_str() + } else { + pure_code + }; + let mut entries = vec![provider_entry("Pure Code", "TYPESCRIPT", pure_code)]; + match node_type { + "FRAME" => entries.push(provider_entry(&name, "TYPESCRIPT", pure_code)), + "COMPONENT" => { + let usage = render_component_usage(node).unwrap_or_else(|| format!("<{name} />")); + entries.push(provider_entry("Usage", "TYPESCRIPT", &usage)); + let source = component_source(&name, pure_code); + entries.push(provider_entry(&name, "TYPESCRIPT", &source)); + entries.extend(cli_entries(&name, &name, &source)); + } + "SECTION" => { + entries.push(provider_entry(&name, "TYPESCRIPT", pure_code)); + let source = component_source(&name, ""); + let title = format!("{name} - Responsive"); + entries.push(provider_entry(&title, "TYPESCRIPT", &source)); + entries.extend(cli_entries(&name, &title, &source)); + } + "COMPONENT_SET" | "INSTANCE" => { + let usage = render_component_usage(node)?; + entries.push(provider_entry("Usage", "TYPESCRIPT", &usage)); + entries.push(provider_entry(&name, "TYPESCRIPT", pure_code)); + } + _ => return None, + } + Some(format!("[\n{}\n]", entries.join("\n"))) +} + +fn provider_entry(title: &str, language: &str, code: &str) -> String { + let code = if code.contains('\n') { + format!("\n\"{code}\"\n") + } else { + format!("\"{code}\"") + }; + format!( + " {{\n \"code\": {code},\n \"language\": \"{language}\",\n \"title\": \"{title}\",\n }}," + ) +} + +fn component_source(name: &str, code: &str) -> String { + format!( + "import {{ Box }} from '@devup-ui/react'\n\nexport function {name}() {{\n return {code}\n}}" + ) +} + +fn cli_entries(file_name: &str, title: &str, source: &str) -> [String; 2] { + let bash_source = source.replace('\'', "\\'"); + let bash = + format!("mkdir -p src/components\n\necho '{bash_source}' > src/components/{file_name}.tsx"); + let powershell = format!( + "New-Item -ItemType Directory -Force -Path src\\components | Out-Null\n\n@'\n{source}\n'@ | Out-File -FilePath src\\components\\{file_name}.tsx -Encoding UTF8" + ); + let cli_title = if title == file_name { + format!("{title} - CLI") + } else { + format!("{title} CLI") + }; + [ + provider_entry(&format!("{cli_title} (Bash)"), "BASH", &bash), + provider_entry(&format!("{cli_title} (PowerShell)"), "BASH", &powershell), + ] +} + +pub fn render_viewport_component(input: &Value) -> Option { + if input.get("type")?.as_str()? != "COMPONENT_SET" { + return None; + } + let name = normalize_component_name(input.get("name")?.as_str()?); + let definitions = input.get("componentPropertyDefinitions")?.as_object()?; + let children = input.get("children")?.as_array()?; + let mut interface = Vec::new(); + let mut props = Vec::new(); + for (key, definition) in definitions { + if definition.get("type").and_then(Value::as_str) != Some("VARIANT") { + continue; + } + let prop = normalize_prop_name(key); + let options = definition.get("variantOptions")?.as_array()?; + let values = options.iter().filter_map(Value::as_str).collect::>(); + let boolean = values == ["false", "true"]; + if boolean { + interface.push(format!(" {prop}?: boolean")); + } else { + interface.push(format!( + " {prop}: {}", + values + .iter() + .map(|value| format!("'{value}'")) + .collect::>() + .join(" | ") + )); + } + props.push((key.as_str(), prop, boolean)); + } + let (_, prop, boolean) = props.first()?; + let asset_components = children + .iter() + .all(|child| child.get("isAsset").and_then(Value::as_bool) == Some(true)); + let component = if asset_components { "Box" } else { "Image" }; + let mut variants = Vec::new(); + for child in children { + let value = child.get("variantProperties")?.get(props[0].0)?.as_str()?; + let child_name = child.get("name")?.as_str()?; + let path = format!("/icons/{child_name}.svg"); + let rendered = if asset_components { + format!("url('{path}')") + } else { + path + }; + variants.push((value, rendered)); + } + let variant_lines = variants + .iter() + .map(|(key, value)| format!(" {key}: \"{value}\"")) + .collect::>() + .join(",\n"); + let index = if *boolean { + format!("{prop} ?? false") + } else { + prop.clone() + }; + let extra = if asset_components { + let color = children + .first()? + .get("children")? + .as_array()? + .first()? + .get("fills")? + .as_array()? + .first()? + .get("color")?; + format!( + " bg=\"{}\"\n maskImage={{{{\n{variant_lines}\n }}[{index}]}}\n maskPos=\"center\"\n maskRepeat=\"no-repeat\"\n maskSize=\"contain\"", + color_hex(color)? + ) + } else { + format!(" src={{{{\n{variant_lines}\n }}[{index}]}}") + }; + Some(format!( + "\"export interface {name}Props {{\n{}\n}}\n\nexport function {name}({{ {prop} }}: {name}Props) {{\n return (\n <{component}\n{extra}\n />\n )\n}}\"", + interface.join("\n") + )) +} + +pub fn render_variant_tree_merge(input: &Value) -> Option { + let variant_key = input.get("variantKey")?.as_str()?; + let entries = input.get("treesByVariant")?.as_array()?; + let variants = entries + .iter() + .filter_map(|entry| { + let entry = entry.as_array()?; + Some((entry.first()?.as_str()?, entry.get(1)?)) + }) + .collect::>(); + let rendered = render_merged_nodes(variant_key, &variants); + Some(format!("\"{rendered}\"")) +} + +fn render_merged_nodes(variant_key: &str, variants: &[(&str, &Value)]) -> String { + let Some((_, first)) = variants.first() else { + return String::new(); + }; + let component = first + .get("component") + .and_then(Value::as_str) + .unwrap_or("Box"); + let props = merge_props( + variant_key, + &variants + .iter() + .map(|(variant, node)| (*variant, node.get("props").unwrap_or(&Value::Null))) + .collect::>(), + ); + let mut result = format!( + "render:{component}:depth=0:{}|", + serde_json::to_string(&props).expect("serializable merged props") + ); + let max_children = variants + .iter() + .filter_map(|(_, node)| node.get("children")?.as_array().map(Vec::len)) + .max() + .unwrap_or(0); + for index in 0..max_children { + let child_variants = variants + .iter() + .filter_map(|(variant, node)| { + Some((*variant, node.get("children")?.as_array()?.get(index)?)) + }) + .collect::>(); + let child = render_merged_nodes(variant_key, &child_variants); + if child_variants.len() == variants.len() { + result.push_str(&child); + } else { + let condition = child_variants + .iter() + .map(|(variant, _)| format!("{variant_key} === \"{variant}\"")) + .collect::>() + .join(" || "); + result.push_str(&format!("{{({condition}) && {child}}}")); + } + } + result +} + +fn merge_props(variant_key: &str, variants: &[(&str, &Value)]) -> Map { + let mut keys = Vec::new(); + for (_, props) in variants { + if let Some(props) = props.as_object() { + for key in props.keys() { + if !keys.contains(key) { + keys.push(key.clone()); + } + } + } + } + let mut merged = Map::new(); + for key in keys { + let values = variants + .iter() + .filter_map(|(variant, props)| Some((*variant, props.get(&key)?.clone()))) + .collect::>(); + if values.len() == variants.len() + && values + .iter() + .skip(1) + .all(|(_, value)| value == &values[0].1) + { + merged.insert(key, values[0].1.clone()); + } else { + let variant_values = values + .into_iter() + .map(|(variant, value)| (variant.to_owned(), value)) + .collect::>(); + merged.insert( + key, + json!({ + "__variantProp": true, + "variantKey": variant_key, + "values": variant_values, + }), + ); + } + } + merged +} + +pub fn render_responsive_component_mock(input: &Value) -> Option { + let tree = input.get("mockTree")?; + let name = normalize_component_name(input.get("name")?.as_str()?); + let definitions = input.get("componentPropertyDefinitions")?.as_object()?; + let mut prop_types = Map::new(); + for (key, definition) in definitions { + if matches!(key.to_ascii_lowercase().as_str(), "effect" | "viewport") { + continue; + } + let options = definition.get("variantOptions")?.as_array()?; + let union = options + .iter() + .filter_map(Value::as_str) + .map(|value| format!("'{value}'")) + .collect::>() + .join(" | "); + prop_types.insert(key.clone(), Value::String(union)); + } + let variant_key = prop_types + .keys() + .find(|key| key.as_str() == "variant")? + .clone(); + let children = input.get("children")?.as_array()?; + let mut root_props = tree.get("props")?.as_object()?.clone(); + for (effect, selector) in [("hover", "_hover"), ("active", "_active")] { + let mut colors = Map::new(); + for child in children { + let variants = child.get("variantProperties")?.as_object()?; + if variants.get("effect").and_then(Value::as_str) != Some(effect) + || variants.get("viewport").and_then(Value::as_str) != Some("Desktop") + || variants.get("size").and_then(Value::as_str) != Some("Md") + { + continue; + } + let variant = variants.get(&variant_key)?.as_str()?; + let color = child.get("fills")?.as_array()?.first()?.get("color")?; + colors.insert(variant.to_owned(), Value::String(color_hex(color)?)); + } + root_props.insert( + selector.to_owned(), + json!({"bg": {"__variantProp": true, "variantKey": variant_key, "values": colors}}), + ); + } + let mut result = format!( + "component:{name}:{}|render:{}:depth=0:{}|", + serde_json::to_string(&prop_types).ok()?, + tree.get("component")?.as_str()?, + serde_json::to_string(&root_props).ok()? + ); + for child in tree.get("children")?.as_array()? { + result.push_str(&format!( + "render:{}:depth=0:{}|", + child.get("component")?.as_str()?, + serde_json::to_string(child.get("props")?).ok()? + )); + } + Some(format!("\"{result}\"")) +} + +fn normalize_prop_name(value: &str) -> String { + let mut words = value + .split(|character: char| !character.is_ascii_alphanumeric()) + .filter(|word| !word.is_empty()); + let first = words.next().unwrap_or("property").to_ascii_lowercase(); + let mut result = words.fold(first, |mut result, word| { + let mut chars = word.chars(); + if let Some(first) = chars.next() { + result.push(first.to_ascii_uppercase()); + result.extend(chars.map(|character| character.to_ascii_lowercase())); + } + result + }); + if result.starts_with(|character: char| character.is_ascii_digit()) { + result.insert_str(0, "property"); + } + result +} + +fn color_hex(color: &Value) -> Option { + let channel = + |name: &str| Some((color.get(name)?.as_f64()?.clamp(0.0, 1.0) * 255.0).round() as u8); + let value = format!( + "#{:02X}{:02X}{:02X}", + channel("r")?, + channel("g")?, + channel("b")? + ); + Some(value) +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/component.rs b/crates/devup-mcp-devup-ui/src/codegen/component.rs new file mode 100644 index 0000000..e61d10f --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/component.rs @@ -0,0 +1,1492 @@ +use std::collections::{BTreeMap, BTreeSet, HashSet}; + +use devup_mcp_figma::{ + CollectedPayload, DevupError, Diagnostic, ErrorCode, RawNode, Snapshot, UpstreamResult, +}; +use serde::{Deserialize, Serialize}; + +use super::{layout, style, text, variant}; +use crate::provenance::{ + FidelityReport, ProjectionTrace, SourceMap, build_projection_trace, finalize_tsx, mark_node, + validate_fidelity, +}; +use crate::theme::{normalize_token, variable_token}; +use crate::validation::validate_tsx; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum RootLayout { + #[default] + Standalone, + Embedded, +} + +#[derive(Debug, Clone, Default)] +pub struct CodegenOptions { + pub component_name: Option, + pub include_diagnostics: bool, + pub inline_instances: bool, + pub text_style_tokens: std::collections::BTreeMap, + pub variable_tokens: std::collections::BTreeMap, + pub root_layout: RootLayout, +} + +impl CodegenOptions { + pub fn with_payload_tokens(mut self, payload: &CollectedPayload) -> Self { + self.text_style_tokens = named_tokens(payload.styles.as_ref(), "styles"); + self.variable_tokens = named_tokens(payload.variables.as_ref(), "variables"); + self + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CodegenOutput { + pub tsx: String, + pub imports: Vec, + pub used_tokens: BTreeSet, + pub diagnostics: Vec, + pub source_map: SourceMap, + pub projection_trace: ProjectionTrace, + pub fidelity_report: FidelityReport, +} + +pub fn generate_component( + snapshot: &Snapshot, + root_id: &str, + options: &CodegenOptions, +) -> Result { + let generated = generate_node_marked(snapshot, root_id, options)?; + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma snapshot에서 변환할 node를 찾지 못했습니다.", + false, + ) + })?; + let component_name = options + .component_name + .as_deref() + .map(normalize_component_name) + .unwrap_or_else(|| normalize_component_name(root.typed_view().name().unwrap_or(""))); + let body = generated + .tsx + .lines() + .map(|line| format!(" {line}")) + .collect::>() + .join("\n"); + let mut tsx = format!( + "import {{ {} }} from \"@devup-ui/react\";\n\n", + generated.imports.join(", ") + ); + tsx.push_str(&format!( + "export function {component_name}() {{\n return (\n{body}\n );\n}}\n" + )); + finalize_codegen_output( + CodegenOutput { tsx, ..generated }, + snapshot, + options, + root_id, + ) +} + +pub fn generate_legacy_component( + snapshot: &Snapshot, + root_id: &str, + options: &CodegenOptions, +) -> Result { + let generated = generate_node_marked(snapshot, root_id, options)?; + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma snapshot에서 변환할 node를 찾지 못했습니다.", + false, + ) + })?; + let component_name = options + .component_name + .as_deref() + .map(legacy_component_name) + .unwrap_or_else(|| legacy_component_name(root.typed_view().name().unwrap_or(""))); + let body = if generated.tsx.contains('\n') { + let indented = generated + .tsx + .lines() + .map(|line| format!(" {line}")) + .collect::>() + .join("\n"); + format!("(\n{indented}\n )") + } else { + generated.tsx.clone() + }; + finalize_codegen_output( + CodegenOutput { + tsx: format!("export function {component_name}() {{\n return {body}\n}}"), + ..generated + }, + snapshot, + options, + root_id, + ) +} + +pub fn render_component_source( + component: &str, + code: &str, + variants: &[(String, String)], +) -> String { + let variants = variants + .iter() + .filter(|(key, _)| !key.eq_ignore_ascii_case("effect")) + .collect::>(); + let wrapped = if code.contains('\n') { + format!( + "(\n{}\n )", + code.lines() + .map(|line| format!(" {line}")) + .collect::>() + .join("\n") + ) + } else { + code.split_whitespace().collect::>().join(" ") + }; + if variants.is_empty() { + return format!("export function {component}() {{\n return {wrapped}\n}}"); + } + let interface = variants + .iter() + .map(|(key, value)| { + let optional = if value == "boolean" { "?" } else { "" }; + format!(" {key}{optional}: {value}") + }) + .collect::>() + .join("\n"); + let keys = variants + .iter() + .map(|(key, _)| key.as_str()) + .collect::>() + .join(", "); + format!( + "export interface {component}Props {{\n{interface}\n}}\n\nexport function {component}({{ {keys} }}: {component}Props) {{\n return {wrapped}\n}}" + ) +} + +pub fn generate_component_set_target( + snapshot: &Snapshot, + root_id: &str, + target_name: &str, + options: &CodegenOptions, +) -> Result { + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma snapshot에서 component set을 찾지 못했습니다.", + false, + ) + })?; + let component_set = if root.typed_view().node_type() == "COMPONENT_SET" + && root.typed_view().name() == Some(target_name) + { + Some(root) + } else { + snapshot.nodes.values().find(|node| { + node.typed_view().node_type() == "COMPONENT_SET" + && node.typed_view().name() == Some(target_name) + }) + }; + let root_view = component_set.unwrap_or(root).typed_view(); + let main = component_set.is_some(); + if let Some(set) = component_set + && let Some(output) = variant::generate_variant_component_set(snapshot, &set.id, options)? + { + return finalize_codegen_output(output, snapshot, options, &set.id); + } + let target_id = if main { + let default_name = root_view + .value("defaultVariant") + .and_then(|value| value.get("name")) + .and_then(serde_json::Value::as_str); + root_view + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .find(|node| node.typed_view().name() == default_name) + .or_else(|| { + root_view + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .next() + }) + .map(|node| node.id.as_str()) + } else { + snapshot + .nodes + .values() + .find(|node| { + node.typed_view().node_type() == "COMPONENT" + && node.typed_view().name() == Some(target_name) + }) + .map(|node| node.id.as_str()) + } + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!("component set에서 '{target_name}' 출력을 찾지 못했습니다."), + false, + ) + })?; + + let (generated, provenance_root_id) = if main { + match generate_component_asset_child(snapshot, target_id, options) { + Some(output) => output?, + None => ( + generate_node_marked(snapshot, target_id, options)?, + target_id.to_owned(), + ), + } + } else { + ( + generate_node_marked(snapshot, target_id, options)?, + target_id.to_owned(), + ) + }; + let code = if !main && generated.tsx.contains("") { + generated.tsx.replace("", "") + } else { + generated.tsx.clone() + }; + let variants = if main { + component_variants( + snapshot, + component_set.expect("main component set"), + target_id, + ) + } else { + Vec::new() + }; + finalize_codegen_output( + CodegenOutput { + tsx: render_component_source(&legacy_component_name(target_name), &code, &variants), + ..generated + }, + snapshot, + options, + &provenance_root_id, + ) +} + +pub fn generate_inlined_component_instance( + snapshot: &Snapshot, + root_id: &str, + instance_id: &str, + options: &CodegenOptions, +) -> Result { + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "inline instance root를 찾지 못했습니다.", + false, + ) + })?; + let instance = snapshot.nodes.get(instance_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "inline할 component instance를 찾지 못했습니다.", + false, + ) + })?; + let name = instance.typed_view().name().unwrap_or("Component"); + let selected_variants = instance + .typed_view() + .value("componentProperties") + .and_then(serde_json::Value::as_object) + .map(|properties| { + properties + .iter() + .filter_map(|(key, value)| { + (value.get("type").and_then(serde_json::Value::as_str) == Some("VARIANT")) + .then(|| value.get("value").and_then(serde_json::Value::as_str)) + .flatten() + .map(|value| (key.as_str(), value)) + }) + .collect::>() + }) + .unwrap_or_default(); + let set = snapshot + .nodes + .values() + .find(|node| { + node.typed_view().node_type() == "COMPONENT_SET" + && node.typed_view().name() == Some(name) + }) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!("'{name}' component set을 찾지 못했습니다."), + false, + ) + })?; + let selected = set + .typed_view() + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .find(|candidate| { + selected_variants.iter().all(|(key, value)| { + candidate + .typed_view() + .value("variantProperties") + .and_then(|variants| variants.get(*key)) + .and_then(serde_json::Value::as_str) + == Some(*value) + }) + }) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!("'{name}' instance variant를 찾지 못했습니다."), + false, + ) + })?; + let mut projected = snapshot.clone(); + if let Some(projected_set) = projected.nodes.get_mut(&set.id) + && let Some(children) = projected_set + .fields + .get_mut("childrenIds") + .and_then(serde_json::Value::as_array_mut) + { + children.retain(|id| id.as_str() != Some(&selected.id)); + } + if let Some(projected_selected) = projected.nodes.get_mut(&selected.id) { + for field in ["layoutSizingHorizontal", "layoutSizingVertical"] { + projected_selected.fields.insert( + field.to_owned(), + serde_json::Value::String("FIXED".to_owned()), + ); + } + } + let mut output = generate_node_marked(&projected, &selected.id, options)?; + if let Some(close) = output.tsx.rfind("\n/>") { + let suffix = output.tsx[close + 3..].to_owned(); + let mut lines = output.tsx[..close] + .lines() + .map(str::to_owned) + .collect::>(); + for (field, prop) in [("height", "h"), ("width", "w")] { + if let Some(value) = root.typed_view().number(field) { + lines.push(format!(" {prop}=\"{}\"", layout::px(value))); + } + } + lines[1..].sort(); + output.tsx = format!("{}\n/>{suffix}", lines.join("\n")); + } + let usage = selected_variants + .iter() + .map(|(key, value)| format!(" {key}=\"{value}\"")) + .collect::(); + output.tsx = format!("{{/* <{name}{usage} /> */}}\n{}", output.tsx); + finalize_codegen_output(output, &projected, options, &selected.id) +} + +fn generate_component_asset_child( + snapshot: &Snapshot, + component_id: &str, + options: &CodegenOptions, +) -> Option> { + let component = snapshot.nodes.get(component_id)?; + let children = component.typed_view().child_ids().collect::>(); + if children.len() != 1 { + return None; + } + let child_id = children[0]; + let child = snapshot.nodes.get(child_id)?; + style::asset_kind(snapshot, child)?; + let mut projected = snapshot.clone(); + let projected_child = projected.nodes.get_mut(child_id)?; + for dimension in ["width", "height"] { + if projected_child.typed_view().number(dimension).is_none() + && let Some(value) = component.typed_view().number(dimension) + { + projected_child + .fields + .insert(dimension.to_owned(), serde_json::Value::from(value)); + } + } + projected_child.fields.insert( + "layoutSizingHorizontal".to_owned(), + serde_json::Value::String("FIXED".to_owned()), + ); + projected_child.fields.insert( + "layoutSizingVertical".to_owned(), + serde_json::Value::String("FIXED".to_owned()), + ); + Some( + generate_node_marked(&projected, child_id, options) + .map(|output| (output, child_id.to_owned())), + ) +} + +pub fn render_component_registration_snapshot( + snapshot: &Snapshot, + root_id: &str, + target_name: &str, +) -> Result { + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "component registration root를 찾지 못했습니다.", + false, + ) + })?; + let set = if root.typed_view().node_type() == "COMPONENT_SET" { + Some(root) + } else { + snapshot + .nodes + .values() + .find(|node| node.typed_view().node_type() == "COMPONENT_SET") + }; + let selected = if root.typed_view().node_type() == "COMPONENT" { + root + } else { + root.typed_view() + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .find(|node| node.typed_view().name() == Some(target_name)) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!("registration 대상 '{target_name}'을 찾지 못했습니다."), + false, + ) + })? + }; + let name = set + .and_then(|set| set.typed_view().name()) + .or_else(|| selected.typed_view().name()) + .unwrap_or("Component"); + let selected_is_set_child = set.is_some_and(|set| { + set.typed_view() + .child_ids() + .any(|child| child == selected.id) + }); + let node = registration_node(snapshot, selected, set, selected_is_set_child, 1); + let variants = set + .map(|set| component_variants(snapshot, set, &selected.id)) + .unwrap_or_default() + .into_iter() + .filter(|(key, _)| !key.eq_ignore_ascii_case("effect")) + .collect::>(); + let variants = if variants.is_empty() { + "{}".to_owned() + } else { + let lines = variants + .iter() + .map(|(key, value)| format!(" {}: {},", json_string(key), json_string(value))) + .collect::>() + .join("\n"); + format!("{{\n{lines}\n }}") + }; + let box_size = set.is_none(); + let mut props = Vec::new(); + if let Some(set) = set + && selected + .typed_view() + .value("reactions") + .and_then(serde_json::Value::as_array) + .is_some_and(|reactions| { + reactions.iter().any(|reaction| { + reaction + .get("trigger") + .and_then(|trigger| trigger.get("type")) + .and_then(serde_json::Value::as_str) + == Some("ON_HOVER") + }) + }) + && let Some(hover) = set + .typed_view() + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .find(|node| node.id != selected.id && node.typed_view().number("opacity").is_some()) + && let Some(opacity) = hover.typed_view().number("opacity") + { + props.extend([ + " \"_hover\": {".to_owned(), + format!( + " \"opacity\": {},", + json_string(&layout::format_number(opacity)) + ), + " },".to_owned(), + " \"aspectRatio\": undefined,".to_owned(), + " \"flex\": undefined,".to_owned(), + " \"h\": undefined,".to_owned(), + " \"maxH\": undefined,".to_owned(), + " \"maxW\": undefined,".to_owned(), + " \"minH\": undefined,".to_owned(), + " \"minW\": undefined,".to_owned(), + " \"transition\": \"0.3ms ease-in-out\",".to_owned(), + " \"transitionProperty\": \"opacity\",".to_owned(), + " \"w\": undefined,".to_owned(), + ]); + } else { + props.push(" \"aspectRatio\": undefined,".to_owned()); + } + if !props.iter().any(|prop| prop.contains("\"_hover\"")) { + if box_size { + props.push(" \"boxSize\": \"100%\",".to_owned()); + } + props.push(" \"flex\": undefined,".to_owned()); + if !box_size { + props.push(" \"h\": undefined,".to_owned()); + } + props.extend([ + " \"maxH\": undefined,".to_owned(), + " \"maxW\": undefined,".to_owned(), + " \"minH\": undefined,".to_owned(), + " \"minW\": undefined,".to_owned(), + ]); + if !box_size { + props.push(" \"w\": undefined,".to_owned()); + } + } + Ok(format!( + "{{\n \"name\": {},\n \"node\": {},\n \"tree\": {{\n \"children\": [],\n \"component\": \"Box\",\n \"nodeName\": {},\n \"nodeType\": \"COMPONENT\",\n \"props\": {{\n{}\n }},\n }},\n \"variantComments\": {{}},\n \"variants\": {},\n}}", + json_string(name), + node, + json_string(selected.typed_view().name().unwrap_or(target_name)), + props.join("\n"), + variants + )) +} + +fn registration_node( + snapshot: &Snapshot, + node: &RawNode, + parent: Option<&RawNode>, + circular_children: bool, + depth: usize, +) -> String { + let view = node.typed_view(); + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let mut entries = Vec::new(); + entries.push(format!("{child_indent}\"children\": [],")); + entries.push(format!( + "{child_indent}\"name\": {},", + json_string(view.name().unwrap_or("")) + )); + if let Some(opacity) = view.number("opacity") { + entries.push(format!( + "{child_indent}\"opacity\": {},", + layout::format_number(opacity) + )); + } + if let Some(parent) = parent { + entries.push(format!( + "{child_indent}\"parent\": {},", + registration_parent(snapshot, parent, node, circular_children, depth + 1) + )); + } + if let Some(value) = view.value("reactions") { + entries.push(format!( + "{child_indent}\"reactions\": {},", + js_value(value, depth + 1) + )); + } + entries.push(format!( + "{child_indent}\"type\": {},", + json_string(view.node_type()) + )); + if let Some(value) = view.value("variantProperties") { + entries.push(format!( + "{child_indent}\"variantProperties\": {},", + js_value(value, depth + 1) + )); + } + if let Some(visible) = view.bool("visible") { + entries.push(format!("{child_indent}\"visible\": {visible},")); + } + format!("{{\n{}\n{indent}}}", entries.join("\n")) +} + +fn registration_parent( + snapshot: &Snapshot, + parent: &RawNode, + selected: &RawNode, + circular_children: bool, + depth: usize, +) -> String { + let view = parent.typed_view(); + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let children_rendered = if view.child_ids().next().is_none() { + "[]".to_owned() + } else { + let values = view + .child_ids() + .filter_map(|id| { + if id == selected.id { + Some("[Circular]".to_owned()) + } else { + snapshot + .nodes + .get(id) + .map(|child| registration_child(child, circular_children, depth + 2)) + } + }) + .collect::>(); + if values.is_empty() { + "[]".to_owned() + } else { + format!( + "[\n{}\n{child_indent}]", + values + .iter() + .map(|value| format!("{}{},", " ".repeat(depth + 2), value)) + .collect::>() + .join("\n") + ) + } + }; + let mut entries = vec![format!("{child_indent}\"children\": {children_rendered},")]; + for field in ["componentPropertyDefinitions", "defaultVariant"] { + if let Some(value) = view.value(field) { + let rendered = if field == "defaultVariant" + && value.get("name").and_then(serde_json::Value::as_str) + == selected.typed_view().name() + && circular_children + { + "[Circular]".to_owned() + } else if field == "defaultVariant" { + registration_embedded_node(value, depth + 1) + } else { + js_value(value, depth + 1) + }; + entries.push(format!("{child_indent}{}: {rendered},", json_string(field))); + } + } + entries.push(format!( + "{child_indent}\"name\": {},", + json_string(view.name().unwrap_or("")) + )); + entries.push(format!( + "{child_indent}\"type\": {},", + json_string(view.node_type()) + )); + if let Some(visible) = view.bool("visible") { + entries.push(format!("{child_indent}\"visible\": {visible},")); + } + format!("{{\n{}\n{indent}}}", entries.join("\n")) +} + +fn registration_child(node: &RawNode, circular_parent: bool, depth: usize) -> String { + let view = node.typed_view(); + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let mut entries = vec![ + format!("{child_indent}\"children\": [],"), + format!( + "{child_indent}\"name\": {},", + json_string(view.name().unwrap_or("")) + ), + ]; + if let Some(opacity) = view.number("opacity") { + entries.push(format!( + "{child_indent}\"opacity\": {},", + layout::format_number(opacity) + )); + } + if circular_parent { + entries.push(format!("{child_indent}\"parent\": [Circular],")); + } + if let Some(value) = view.value("reactions") { + entries.push(format!( + "{child_indent}\"reactions\": {},", + js_value(value, depth + 1) + )); + } + entries.push(format!( + "{child_indent}\"type\": {},", + json_string(view.node_type()) + )); + if let Some(value) = view.value("variantProperties") { + entries.push(format!( + "{child_indent}\"variantProperties\": {},", + js_value(value, depth + 1) + )); + } + if let Some(visible) = view.bool("visible") { + entries.push(format!("{child_indent}\"visible\": {visible},")); + } + format!("{{\n{}\n{indent}}}", entries.join("\n")) +} + +fn registration_embedded_node(value: &serde_json::Value, depth: usize) -> String { + let Some(object) = value.as_object() else { + return js_value(value, depth); + }; + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let mut entries = vec![format!("{child_indent}\"children\": [],")]; + for field in [ + "name", + "opacity", + "reactions", + "type", + "variantProperties", + "visible", + ] { + if let Some(value) = object.get(field) { + entries.push(format!( + "{child_indent}{}: {},", + json_string(field), + js_value(value, depth + 1) + )); + } + } + format!("{{\n{}\n{indent}}}", entries.join("\n")) +} + +fn js_value(value: &serde_json::Value, depth: usize) -> String { + match value { + serde_json::Value::Null => "null".to_owned(), + serde_json::Value::Bool(value) => value.to_string(), + serde_json::Value::Number(value) => value.to_string(), + serde_json::Value::String(value) => json_string(value), + serde_json::Value::Array(values) => { + if values.is_empty() { + "[]".to_owned() + } else { + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + format!( + "[\n{}\n{indent}]", + values + .iter() + .map(|value| format!("{child_indent}{},", js_value(value, depth + 1))) + .collect::>() + .join("\n") + ) + } + } + serde_json::Value::Object(values) => { + if values.is_empty() { + "{}".to_owned() + } else { + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + format!( + "{{\n{}\n{indent}}}", + values + .iter() + .map(|(key, value)| format!( + "{child_indent}{}: {},", + json_string(key), + js_value(value, depth + 1) + )) + .collect::>() + .join("\n") + ) + } + } + } +} + +fn json_string(value: &str) -> String { + serde_json::to_string(value).expect("string JSON serialization") +} + +fn component_variants( + snapshot: &Snapshot, + root: &RawNode, + default_id: &str, +) -> Vec<(String, String)> { + let definitions = root + .typed_view() + .value("componentPropertyDefinitions") + .and_then(serde_json::Value::as_object); + let mut variants = Vec::new(); + let mut added = BTreeSet::new(); + let add = |raw_key: &str, + definition: &serde_json::Value, + variants: &mut Vec<(String, String)>, + added: &mut BTreeSet| { + let key = component_property_name(raw_key); + if added.contains(&key) { + return; + } + let value = match definition.get("type").and_then(serde_json::Value::as_str) { + Some("VARIANT") => definition + .get("variantOptions") + .and_then(serde_json::Value::as_array) + .map(|options| { + options + .iter() + .filter_map(serde_json::Value::as_str) + .map(|option| format!("'{option}'")) + .collect::>() + .join(" | ") + }), + Some("BOOLEAN") => Some("boolean".to_owned()), + Some("INSTANCE_SWAP") => Some("React.ReactNode".to_owned()), + _ => None, + }; + if let Some(value) = value { + added.insert(key.clone()); + variants.push((key, value)); + } + }; + if let Some(definitions) = definitions { + for (key, definition) in definitions { + if definition.get("type").and_then(serde_json::Value::as_str) == Some("VARIANT") { + add(key, definition, &mut variants, &mut added); + } + } + fn visit_refs( + snapshot: &Snapshot, + id: &str, + definitions: &serde_json::Map, + variants: &mut Vec<(String, String)>, + added: &mut BTreeSet, + add: &impl Fn(&str, &serde_json::Value, &mut Vec<(String, String)>, &mut BTreeSet), + ) { + let Some(node) = snapshot.nodes.get(id) else { + return; + }; + let view = node.typed_view(); + if let Some(references) = view + .value("componentPropertyReferences") + .and_then(serde_json::Value::as_object) + { + for field in ["mainComponent", "visible"] { + if let Some(key) = references.get(field).and_then(serde_json::Value::as_str) + && let Some(definition) = definitions.get(key) + { + add(key, definition, variants, added); + } + } + } + for child in view.child_ids() { + visit_refs(snapshot, child, definitions, variants, added, add); + } + } + visit_refs( + snapshot, + default_id, + definitions, + &mut variants, + &mut added, + &add, + ); + for (key, definition) in definitions { + add(key, definition, &mut variants, &mut added); + } + } + variants +} + +fn component_property_name(raw: &str) -> String { + raw.split('#').next().unwrap_or(raw).to_owned() +} + +pub(super) fn legacy_component_name(input: &str) -> String { + if !input.is_empty() + && input + .chars() + .all(|character| !character.is_alphabetic() || character.is_uppercase()) + { + let mut characters = input.chars(); + if let Some(first) = characters.next() { + let candidate = first + .to_uppercase() + .chain(characters.flat_map(char::to_lowercase)) + .collect::(); + return sanitize_legacy_identifier(&candidate); + } + } + let mut output = String::new(); + for part in input + .split(['-', '_', '/', ' ']) + .filter(|part| !part.is_empty()) + { + let acronym = part + .chars() + .filter(|character| character.is_alphabetic()) + .all(|character| character.is_uppercase()); + let normalized = if acronym { + part.to_lowercase() + } else { + part.to_owned() + }; + let mut characters = normalized.chars(); + if let Some(first) = characters.next() { + output.extend(first.to_uppercase()); + output.extend(characters); + } + } + sanitize_legacy_identifier(&output) +} + +fn sanitize_legacy_identifier(candidate: &str) -> String { + let mut output = candidate + .chars() + .filter(|character| character.is_alphanumeric() || *character == '_') + .collect::(); + if output.is_empty() { + return "FigmaComponent".to_owned(); + } + if output + .chars() + .next() + .is_some_and(|character| character.is_numeric()) + { + output.insert(0, '_'); + } + output +} + +pub fn generate_node( + snapshot: &Snapshot, + root_id: &str, + options: &CodegenOptions, +) -> Result { + finalize_codegen_output( + generate_node_marked(snapshot, root_id, options)?, + snapshot, + options, + root_id, + ) +} + +fn generate_node_marked( + snapshot: &Snapshot, + root_id: &str, + options: &CodegenOptions, +) -> Result { + let root = snapshot.nodes.get(root_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma snapshot에서 변환할 node를 찾지 못했습니다.", + false, + ) + })?; + let render_root = if root.typed_view().node_type() == "SECTION" { + root.typed_view() + .child_ids() + .next() + .and_then(|id| snapshot.nodes.get(id)) + .unwrap_or(root) + } else { + root + }; + let mut context = Context { + inline_instances: options.inline_instances, + text_style_tokens: options.text_style_tokens.clone(), + variable_tokens: options.variable_tokens.clone(), + root_layout: options.root_layout, + ..Context::default() + }; + let jsx = render_node(snapshot, render_root, 0, &mut context, &mut HashSet::new())?; + let imports = context.imports.iter().cloned().collect::>(); + Ok(CodegenOutput { + tsx: jsx, + imports, + used_tokens: context.used_tokens, + diagnostics: context.diagnostics, + source_map: SourceMap::empty(), + projection_trace: ProjectionTrace::default(), + fidelity_report: FidelityReport::default(), + }) +} + +fn finalize_codegen_output( + mut output: CodegenOutput, + snapshot: &Snapshot, + options: &CodegenOptions, + root_id: &str, +) -> Result { + let (tsx, source_map) = finalize_tsx( + &output.tsx, + snapshot, + &options.variable_tokens, + &options.text_style_tokens, + ); + output.tsx = tsx; + output.source_map = source_map; + validate_tsx(&output.tsx)?; + output.projection_trace = + build_projection_trace(snapshot, root_id, &output.tsx, &output.source_map); + output.fidelity_report = validate_fidelity(snapshot, root_id, &output)?; + Ok(output) +} + +#[derive(Default)] +struct Context { + imports: BTreeSet, + used_tokens: BTreeSet, + diagnostics: Vec, + inline_instances: bool, + instance_boolean_properties: Vec>, + text_style_tokens: std::collections::BTreeMap, + variable_tokens: std::collections::BTreeMap, + root_layout: RootLayout, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub(super) enum PropValue { + String(String), +} + +pub(super) type Prop = (String, PropValue); + +fn render_node( + snapshot: &Snapshot, + node: &RawNode, + depth: usize, + context: &mut Context, + visiting: &mut HashSet, +) -> Result { + if !visiting.insert(node.id.clone()) { + return Err(DevupError::new( + ErrorCode::DevupCodegenFailed, + "Figma node 트리에 순환 참조가 있습니다.", + false, + )); + } + add_fallback_diagnostics(node, context); + let view = node.typed_view(); + let concrete_visibility = if context.inline_instances { + view.value("componentPropertyReferences") + .and_then(serde_json::Value::as_object) + .and_then(|references| references.get("visible")) + .and_then(serde_json::Value::as_str) + .and_then(|property| { + context + .instance_boolean_properties + .iter() + .rev() + .find_map(|properties| properties.get(property).copied()) + }) + } else { + None + }; + if concrete_visibility == Some(false) { + visiting.remove(&node.id); + return Ok(mark_node(&node.id, String::new())); + } + if view.node_type() == "INSTANCE" && !context.inline_instances { + let references = view + .value("componentPropertyReferences") + .and_then(serde_json::Value::as_object); + let main_property = references + .and_then(|references| references.get("mainComponent")) + .and_then(serde_json::Value::as_str) + .map(component_property_name); + let visible_property = references + .and_then(|references| references.get("visible")) + .and_then(serde_json::Value::as_str) + .map(component_property_name); + let component = snapshot + .nodes + .values() + .filter(|candidate| candidate.typed_view().node_type() == "COMPONENT") + .filter_map(|candidate| candidate.typed_view().name()) + .filter(|name| { + view.name() + .is_some_and(|instance| instance.starts_with(name)) + }) + .max_by_key(|name| name.len()) + .map(legacy_component_name) + .unwrap_or_else(|| legacy_component_name(view.name().unwrap_or("Component"))); + let content = main_property.unwrap_or_else(|| format!("<{component} />")); + let expression = if let Some(visible) = visible_property { + format!("{{{visible} && {content}}}") + } else if references.is_some_and(|references| references.contains_key("mainComponent")) { + format!("{{{content}}}") + } else { + content + }; + if view.string("layoutPositioning") == Some("ABSOLUTE") { + let mut props = Vec::new(); + layout::push_layout_props( + snapshot, + node, + "Box", + &mut props, + context.root_layout, + depth == 0, + ); + props.retain(|(name, value)| { + matches!( + name.as_str(), + "pos" | "left" | "right" | "top" | "bottom" | "transform" | "transformOrigin" + ) || (name == "w" && matches!(value, PropValue::String(value) if value == "100%")) + }); + context.imports.insert("Box".to_owned()); + let indent = " ".repeat(depth); + let (opening_props, multiline_props) = render_props(&props, depth); + let close_open = if multiline_props { + format!("{opening_props}\n{indent}>") + } else { + format!("{opening_props}>") + }; + visiting.remove(&node.id); + return Ok(mark_node( + &node.id, + format!( + "{indent}", + " ".repeat(depth + 1), + expression + ), + )); + } + visiting.remove(&node.id); + return Ok(mark_node( + &node.id, + format!("{}{expression}", " ".repeat(depth)), + )); + } + let asset = style::asset_kind(snapshot, node); + let inferred_mode = view + .value("inferredAutoLayout") + .and_then(serde_json::Value::as_object) + .and_then(|layout| layout.get("layoutMode")) + .and_then(serde_json::Value::as_str); + let inferred_align = |name: &str| { + view.string(name).or_else(|| { + view.value("inferredAutoLayout") + .and_then(serde_json::Value::as_object) + .and_then(|layout| layout.get(name)) + .and_then(serde_json::Value::as_str) + }) + }; + let component = if asset == Some(style::AssetKind::SvgMask) { + "Box" + } else if asset.is_some() { + "Image" + } else if view.node_type() == "TEXT" { + "Text" + } else { + match inferred_mode { + Some("GRID") => "Grid", + Some("HORIZONTAL" | "VERTICAL") + if inferred_align("primaryAxisAlignItems") == Some("CENTER") + && inferred_align("counterAxisAlignItems") == Some("CENTER") => + { + "Center" + } + Some("VERTICAL") => "VStack", + Some("HORIZONTAL") => "Flex", + _ => "Box", + } + }; + context.imports.insert(component.to_owned()); + + let mut props = Vec::new(); + layout::push_layout_props( + snapshot, + node, + component, + &mut props, + context.root_layout, + depth == 0, + ); + if !(depth == 0 && context.root_layout == RootLayout::Embedded) + && asset.is_none() + && view.value("inferredAutoLayout").is_none() + && view.string("layoutPositioning") == Some("AUTO") + && view.child_ids().any(|child| { + snapshot + .nodes + .get(child) + .is_some_and(|child| child.typed_view().string("layoutPositioning") == Some("AUTO")) + }) + { + layout::string_prop(&mut props, "pos", "relative"); + } + style::push_style_props( + snapshot, + node, + component, + asset, + &mut props, + &mut context.used_tokens, + &context.variable_tokens, + ); + text::push_text_props( + &view, + &context.text_style_tokens, + &context.variable_tokens, + &mut context.used_tokens, + &mut props, + ); + if asset.is_some() { + props.retain(|(name, _)| { + !matches!( + name.as_str(), + "alignItems" + | "justifyContent" + | "flexDir" + | "gap" + | "outline" + | "outlineOffset" + | "overflow" + | "p" + | "px" + | "py" + | "pt" + | "pr" + | "pb" + | "pl" + ) + }); + } + let indent = " ".repeat(depth); + let instance_properties = + (context.inline_instances && view.node_type() == "INSTANCE").then(|| { + view.value("componentProperties") + .and_then(serde_json::Value::as_object) + .map(|properties| { + properties + .iter() + .filter_map(|(key, property)| { + (property.get("type").and_then(serde_json::Value::as_str) + == Some("BOOLEAN")) + .then(|| { + property + .get("value") + .and_then(serde_json::Value::as_bool) + .map(|value| (key.clone(), value)) + }) + .flatten() + }) + .collect::>() + }) + .unwrap_or_default() + }); + if let Some(properties) = instance_properties { + context.instance_boolean_properties.push(properties); + } + let children_result = if asset.is_some() { + Ok(Vec::new()) + } else { + view.child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .map(|child| render_node(snapshot, child, depth + 1, context, visiting)) + .collect::, _>>() + }; + if context.inline_instances && view.node_type() == "INSTANCE" { + context.instance_boolean_properties.pop(); + } + let children = children_result?; + + let (opening_props, multiline_props) = render_props(&props, depth); + let rendered = if component == "Text" { + let children = text::render_text_children( + &view, + &context.text_style_tokens, + &context.variable_tokens, + &mut context.used_tokens, + depth + 1, + ); + let close_open = if multiline_props { + format!("{opening_props}\n{indent}>") + } else { + format!("{opening_props}>") + }; + format!("{indent}") + } else if children.is_empty() { + if multiline_props { + format!("{indent}<{component}{opening_props}\n{indent}/>") + } else { + format!("{indent}<{component}{opening_props} />") + } + } else { + let close_open = if multiline_props { + format!("{opening_props}\n{indent}>") + } else { + format!("{opening_props}>") + }; + format!( + "{indent}<{component}{close_open}\n{}\n{indent}", + children.join("\n") + ) + }; + let rendered = if concrete_visibility == Some(true) + || (view.node_type() == "INSTANCE" && context.inline_instances) + { + rendered + } else { + view.value("componentPropertyReferences") + .and_then(serde_json::Value::as_object) + .and_then(|references| references.get("visible")) + .and_then(serde_json::Value::as_str) + .map(component_property_name) + .map(|property| { + let content = rendered.strip_prefix(&indent).unwrap_or(&rendered); + format!("{indent}{{{property} && {content}}}") + }) + .unwrap_or(rendered) + }; + visiting.remove(&node.id); + Ok(mark_node(&node.id, rendered)) +} + +fn named_tokens(result: Option<&UpstreamResult>, collection: &str) -> BTreeMap { + fn visit(value: &serde_json::Value, collection: &str, tokens: &mut BTreeMap) { + if let Some(values) = value.get(collection).and_then(serde_json::Value::as_array) { + for value in values { + if let (Some(id), Some(name)) = ( + value.get("id").and_then(serde_json::Value::as_str), + value.get("name").and_then(serde_json::Value::as_str), + ) { + let token = if collection == "variables" { + variable_token( + name, + value + .get("codeSyntax") + .and_then(serde_json::Value::as_object) + .and_then(|syntax| syntax.get("WEB")) + .and_then(serde_json::Value::as_str), + ) + } else { + normalize_token(name) + }; + tokens.insert(id.to_owned(), token); + } + } + } + match value { + serde_json::Value::Object(object) => { + object + .values() + .for_each(|value| visit(value, collection, tokens)); + } + serde_json::Value::Array(values) => { + values + .iter() + .for_each(|value| visit(value, collection, tokens)); + } + _ => {} + } + } + let mut tokens = BTreeMap::new(); + if let Some(result) = result { + visit(&result.raw, collection, &mut tokens); + } + tokens +} + +fn render_props(props: &[Prop], depth: usize) -> (String, bool) { + if props.is_empty() { + return (String::new(), false); + } + let mut sorted = props.to_vec(); + sorted.sort_by(|left, right| left.0.cmp(&right.0)); + let rendered = sorted + .into_iter() + .map(|(name, value)| match value { + PropValue::String(value) => render_static_attribute(&name, &value), + }) + .collect::>(); + let multiline = rendered.len() >= 5; + if multiline { + let prefix = " ".repeat(depth + 1); + ( + format!("\n{prefix}{}", rendered.join(&format!("\n{prefix}"))), + true, + ) + } else { + (format!(" {}", rendered.join(" ")), false) + } +} + +pub(super) fn render_static_attribute(name: &str, value: &str) -> String { + let mut escaped = String::with_capacity(value.len()); + for character in value.chars() { + match character { + '&' => escaped.push_str("&"), + '"' => escaped.push_str("""), + '<' => escaped.push_str("<"), + '>' => escaped.push_str(">"), + _ => escaped.push(character), + } + } + format!("{name}=\"{escaped}\"") +} + +fn add_fallback_diagnostics(node: &RawNode, context: &mut Context) { + use devup_mcp_figma::FidelityImpact; + + let view = node.typed_view(); + let candidates = [ + ( + view.bool("isMask") == Some(true), + "DEVUP_CODEGEN_MASK_FALLBACK", + "Mask는 기본 Box 렌더링으로 보존됩니다.", + FidelityImpact::Lossy, + ), + ( + view.string("layoutPositioning") == Some("ABSOLUTE"), + "DEVUP_CODEGEN_ABSOLUTE_FALLBACK", + "절대 배치는 position props로 제한적으로 변환됩니다.", + FidelityImpact::Approximated, + ), + ( + view.value("effects") + .and_then(serde_json::Value::as_array) + .is_some_and(|effects| !effects.is_empty()), + "DEVUP_CODEGEN_EFFECT_FALLBACK", + "일부 Figma effect는 계산된 CSS로 변환되지 않을 수 있습니다.", + FidelityImpact::Lossy, + ), + ]; + for (enabled, code, message, fidelity_impact) in candidates { + if enabled { + context.diagnostics.push(Diagnostic { + code: code.to_owned(), + message: message.to_owned(), + node_id: Some(node.id.clone()), + fidelity_impact: Some(fidelity_impact), + ..Diagnostic::default() + }); + } + } +} + +pub fn normalize_component_name(input: &str) -> String { + let mut result = String::new(); + let mut segment = String::new(); + for character in input.chars().chain(std::iter::once(' ')) { + if character.is_alphanumeric() || character == '_' { + segment.push(character); + continue; + } + if !segment.is_empty() { + let all_ascii_upper = segment + .chars() + .filter(|character| character.is_ascii_alphabetic()) + .all(|character| character.is_ascii_uppercase()); + let mut characters = segment.chars(); + if let Some(first) = characters.next() { + result.extend(first.to_uppercase()); + for rest in characters { + if all_ascii_upper { + result.extend(rest.to_lowercase()); + } else { + result.push(rest); + } + } + } + segment.clear(); + } + } + if result.is_empty() { + return "FigmaComponent".to_owned(); + } + if result + .chars() + .next() + .is_some_and(|character| character.is_numeric()) + { + result.insert(0, '_'); + } + result +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/layout.rs b/crates/devup-mcp-devup-ui/src/codegen/layout.rs new file mode 100644 index 0000000..d7df12c --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/layout.rs @@ -0,0 +1,475 @@ +use devup_mcp_figma::{RawNode, Snapshot}; +use serde_json::Value; + +use super::component::{Prop, PropValue, RootLayout}; + +pub(super) fn push_layout_props( + snapshot: &Snapshot, + node: &RawNode, + component: &str, + props: &mut Vec, + root_layout: RootLayout, + is_render_root: bool, +) { + let view = node.typed_view(); + let parent = snapshot.nodes.values().find(|candidate| { + candidate + .typed_view() + .child_ids() + .any(|child| child == node.id) + }); + let is_root = snapshot.roots.iter().any(|root| root == &node.id); + let is_page_root = parent.is_some_and(|parent| { + matches!( + parent.typed_view().node_type(), + "SECTION" | "PAGE" | "COMPONENT_SET" + ) + }); + let fixed_w = view.string("layoutSizingHorizontal") == Some("FIXED"); + let fixed_h = view.string("layoutSizingVertical") == Some("FIXED"); + let fill_w = view.string("layoutSizingHorizontal") == Some("FILL"); + let fill_h = view.string("layoutSizingVertical") == Some("FILL"); + let absolute = view.string("layoutPositioning") == Some("ABSOLUTE"); + let embedded_root = is_render_root && root_layout == RootLayout::Embedded; + let mut width = None; + let mut height = None; + + if embedded_root { + // The selected frame is being inserted into an existing page layout. + // Preserve its visual/layout semantics, but do not constrain the host + // with Figma canvas geometry or root positioning. + } else if absolute { + push_absolute(node, parent, props); + if matches!(component, "Image" | "Text") { + width = view.number("width").map(px); + height = Some("100%".to_owned()); + } else if view.child_ids().next().is_some() { + width = match ( + view.number("width"), + parent.and_then(|parent| parent.typed_view().number("width")), + ) { + (Some(width), Some(parent_width)) if width >= parent_width => Some("100%".into()), + _ => None, + }; + height = None; + } else if view.node_type() == "FRAME" + && let Some(parent) = parent + { + width = match (view.number("width"), parent.typed_view().number("width")) { + (Some(width), Some(parent_width)) if width == parent_width => Some("100%".into()), + (Some(width), _) => Some(px(width)), + _ => None, + }; + height = match (view.number("height"), parent.typed_view().number("height")) { + (Some(height), Some(parent_height)) if height == parent_height => { + Some("100%".into()) + } + (Some(height), _) => Some(px(height)), + _ => None, + }; + } else if let Some(parent) = parent { + width = match (view.number("width"), parent.typed_view().number("width")) { + (Some(width), Some(parent_width)) if width == parent_width => Some("100%".into()), + _ => None, + }; + height = Some("100%".to_owned()); + } + } else if is_page_root { + // Figma page roots define the component canvas; their editor dimensions + // are not emitted as runtime constraints. + } else if fixed_w || fixed_h { + if fixed_w { + width = view.number("width").map(px); + } + if fixed_h { + height = view.number("height").map(px); + } + if fill_w + && (view.value("maxWidth") != Some(&Value::Null) + || parent.is_some_and(|parent| child_shrinker(parent, "width"))) + { + width = Some("100%".to_owned()); + } + if fill_h + && (view.value("maxHeight") != Some(&Value::Null) + || parent.is_some_and(|parent| child_shrinker(parent, "height"))) + { + height = Some("100%".to_owned()); + } + } else if is_root { + let no_dimensions = view.number("width").is_none() && view.number("height").is_none(); + let has_children = view.child_ids().next().is_some(); + let implicit_text_fill = view.node_type() == "TEXT" + && view.value("layoutSizingHorizontal").is_none() + && view.value("layoutSizingVertical").is_none(); + let standalone_component = view.node_type() == "COMPONENT" + && !snapshot + .nodes + .values() + .any(|node| node.typed_view().node_type() == "COMPONENT_SET"); + if (no_dimensions && (view.node_type() != "COMPONENT" || standalone_component)) + || has_children + || fill_w + || fill_h + || view.node_type() == "GROUP" + || implicit_text_fill + { + width = Some("100%".to_owned()); + height = Some("100%".to_owned()); + } + } else { + if fill_w + && (view.value("maxWidth") != Some(&Value::Null) + || parent.is_some_and(|parent| child_shrinker(parent, "width"))) + { + width = Some("100%".to_owned()); + } else if fixed_w { + width = view.number("width").map(px); + } + if fill_h + && (view.value("maxHeight") != Some(&Value::Null) + || parent.is_some_and(|parent| child_shrinker(parent, "height"))) + { + height = Some("100%".to_owned()); + } else if fixed_h { + height = view.number("height").map(px); + } + if view.node_type() != "COMPONENT" + && view.number("width").is_none() + && view.number("height").is_none() + { + width = Some("100%".to_owned()); + height = Some("100%".to_owned()); + } + } + + if component == "Text" && fixed_w && fixed_h { + match view.string("textAutoResize") { + Some("WIDTH_AND_HEIGHT") => { + if view.number("width").is_some() || view.number("height").is_some() { + width = None; + height = None; + } + } + Some("HEIGHT") => { + if let Some(text_width) = view.number("width") { + width = Some(px(text_width)); + height = None; + } + } + Some("NONE" | "TRUNCATE") if !is_page_root => { + width = view.number("width").map(px).or(width); + height = view.number("height").map(px).or(height); + } + _ => {} + } + } + + if let (Some(width), Some(height)) = (&width, &height) + && width == height + { + string_prop(props, "boxSize", width.clone()); + } else { + if let Some(width) = width { + string_prop(props, "w", width); + } + if let Some(height) = height { + string_prop(props, "h", height); + } + } + + if let Some(aspect) = view.value("targetAspectRatio").and_then(Value::as_object) + && let (Some(x), Some(y)) = ( + aspect.get("x").and_then(Value::as_f64), + aspect.get("y").and_then(Value::as_f64), + ) + && y != 0.0 + { + string_prop( + props, + "aspectRatio", + format_number((x / y * 100.0).floor() / 100.0), + ); + } + for (field, prop) in [ + ("maxWidth", "maxW"), + ("maxHeight", "maxH"), + ("minWidth", "minW"), + ("minHeight", "minH"), + ] { + if let Some(value) = view.number(field) { + string_prop(props, prop, px(value)); + } + } + if view.string("parentId").is_some() + && let Some(parent) = parent + && parent + .typed_view() + .value("inferredAutoLayout") + .and_then(Value::as_object) + .and_then(|layout| layout.get("layoutMode")) + .and_then(Value::as_str) + == Some("GRID") + { + let column = view.number("gridColumnAnchorIndex").unwrap_or(-1.0); + let row = view.number("gridRowAnchorIndex").unwrap_or(-1.0); + let column_count = parent.typed_view().number("gridColumnCount").unwrap_or(0.0); + let current = column + row * column_count; + let natural = parent + .typed_view() + .child_ids() + .position(|child| child == node.id) + .map(|index| index as f64); + if column >= 0.0 && row >= 0.0 && natural != Some(current) { + string_prop( + props, + "gridColumn", + format!("{} / span 1", format_number(column + 1.0)), + ); + string_prop( + props, + "gridRow", + format!("{} / span 1", format_number(row + 1.0)), + ); + } + } + if fill_w + && parent + .is_some_and(|parent| parent.typed_view().string("layoutMode") == Some("HORIZONTAL")) + { + string_prop(props, "flex", "1"); + } + + push_auto_layout(node, component, props); + push_padding(node, props); + if view.bool("clipsContent") == Some(true) { + string_prop(props, "overflow", "hidden"); + } + if !embedded_root + && !is_page_root + && view.child_ids().any(|child| { + snapshot.nodes.get(child).is_some_and(|child| { + child.typed_view().string("layoutPositioning") == Some("ABSOLUTE") + }) + }) + { + string_prop(props, "pos", "relative"); + } + if let Some(rotation) = view.number("rotation") + && rotation.abs() > 0.01 + { + string_prop( + props, + "transform", + format!("rotate({}deg)", format_number(-rotation)), + ); + if absolute { + string_prop(props, "transformOrigin", "top left"); + } + } +} + +fn child_shrinker(parent: &RawNode, dimension: &str) -> bool { + let inferred = parent + .typed_view() + .value("inferredAutoLayout") + .and_then(Value::as_object); + match dimension { + "width" => inferred.is_some_and(|layout| { + layout.get("layoutMode").and_then(Value::as_str) == Some("VERTICAL") + && layout.get("counterAxisAlignItems").and_then(Value::as_str) == Some("CENTER") + }), + "height" => inferred.is_some_and(|layout| { + layout.get("layoutMode").and_then(Value::as_str) == Some("HORIZONTAL") + && layout.get("counterAxisAlignItems").and_then(Value::as_str) == Some("CENTER") + }), + _ => false, + } +} + +fn push_auto_layout(node: &RawNode, component: &str, props: &mut Vec) { + let view = node.typed_view(); + let Some(layout) = view.value("inferredAutoLayout").and_then(Value::as_object) else { + return; + }; + let mode = layout.get("layoutMode").and_then(Value::as_str); + if !matches!(mode, Some("HORIZONTAL" | "VERTICAL" | "GRID")) { + return; + } + if mode == Some("GRID") { + string_prop( + props, + "gridTemplateColumns", + format!( + "repeat({}, 1fr)", + format_number(view.number("gridColumnCount").unwrap_or(0.0)) + ), + ); + string_prop( + props, + "gridTemplateRows", + format!( + "repeat({}, 1fr)", + format_number(view.number("gridRowCount").unwrap_or(0.0)) + ), + ); + let row = view.number("gridRowGap").unwrap_or(0.0); + let column = view.number("gridColumnGap").unwrap_or(0.0); + if row == column { + if row != 0.0 { + string_prop(props, "gap", px(row)); + } + } else { + string_prop(props, "rowGap", px(row)); + string_prop(props, "columnGap", px(column)); + } + return; + } + let justify = match view.string("primaryAxisAlignItems") { + Some("MIN") => None, + Some("MAX") => Some("flex-end"), + Some("CENTER") => Some("center"), + Some("SPACE_BETWEEN") => Some("space-between"), + _ => None, + }; + let align = match view.string("counterAxisAlignItems") { + Some("MIN") => None, + Some("MAX") => Some("flex-end"), + Some("CENTER") => Some("center"), + Some("BASELINE") => Some("baseline"), + _ => None, + }; + if component != "Center" { + if let Some(value) = justify { + string_prop(props, "justifyContent", value); + } + if let Some(value) = align { + string_prop(props, "alignItems", value); + } + } + if component == "Center" && mode == Some("VERTICAL") { + string_prop(props, "flexDir", "column"); + } + if view.child_ids().count() > 1 && view.string("primaryAxisAlignItems") != Some("SPACE_BETWEEN") + { + let gap = layout + .get("itemSpacing") + .and_then(Value::as_f64) + .or_else(|| view.number("itemSpacing")); + if let Some(gap) = gap.filter(|gap| *gap != 0.0) { + string_prop(props, "gap", px(gap)); + } + } +} + +fn push_padding(node: &RawNode, props: &mut Vec) { + let view = node.typed_view(); + let inferred = view.value("inferredAutoLayout").and_then(Value::as_object); + let get = |name: &str| { + inferred + .and_then(|value| value.get(name)) + .and_then(Value::as_f64) + .or_else(|| view.number(name)) + }; + let [Some(top), Some(right), Some(bottom), Some(left)] = [ + get("paddingTop"), + get("paddingRight"), + get("paddingBottom"), + get("paddingLeft"), + ] else { + return; + }; + if top == 0.0 && right == 0.0 && bottom == 0.0 && left == 0.0 { + return; + } + if top == right && right == bottom && bottom == left { + string_prop(props, "p", px(top)); + } else { + if top == bottom { + string_prop(props, "py", px(top)); + } else { + string_prop(props, "pt", px(top)); + string_prop(props, "pb", px(bottom)); + } + if left == right { + string_prop(props, "px", px(left)); + } else { + string_prop(props, "pl", px(left)); + string_prop(props, "pr", px(right)); + } + } +} + +fn push_absolute(node: &RawNode, parent: Option<&RawNode>, props: &mut Vec) { + string_prop(props, "pos", "absolute"); + let view = node.typed_view(); + let Some(parent) = parent else { + return; + }; + let parent = parent.typed_view(); + let constraints = view.value("constraints").and_then(Value::as_object); + let horizontal = constraints + .and_then(|value| value.get("horizontal")) + .and_then(Value::as_str) + .unwrap_or("MIN"); + let vertical = constraints + .and_then(|value| value.get("vertical")) + .and_then(Value::as_str) + .unwrap_or("MIN"); + let x = view.number("x").unwrap_or(0.0); + let y = view.number("y").unwrap_or(0.0); + match horizontal { + "MAX" => string_prop( + props, + "right", + px(parent.number("width").unwrap_or(0.0) - x - view.number("width").unwrap_or(0.0)), + ), + "CENTER" => { + string_prop(props, "left", "50%"); + string_prop(props, "transform", "translateX(-50%)"); + } + _ => string_prop(props, "left", px(x)), + } + match vertical { + "MAX" => string_prop( + props, + "bottom", + px(parent.number("height").unwrap_or(0.0) - y - view.number("height").unwrap_or(0.0)), + ), + "CENTER" => { + string_prop(props, "top", "50%"); + if let Some((_, PropValue::String(value))) = + props.iter_mut().find(|(name, _)| name == "transform") + { + *value = "translate(-50%, -50%)".into(); + } else { + string_prop(props, "transform", "translateY(-50%)"); + } + } + _ => string_prop(props, "top", px(y)), + } +} + +pub(super) fn string_prop(props: &mut Vec, name: &str, value: impl Into) { + let value = PropValue::String(value.into()); + if let Some((_, existing)) = props.iter_mut().find(|(existing, _)| existing == name) { + *existing = value; + } else { + props.push((name.to_owned(), value)); + } +} + +pub(super) fn px(value: f64) -> String { + format!("{}px", format_number(value)) +} + +pub(super) fn format_number(value: f64) -> String { + let rounded = (value * 100.0).round() / 100.0; + if rounded == 0.0 { + "0".to_owned() + } else if rounded.fract() == 0.0 { + format!("{rounded:.0}") + } else { + format!("{rounded:.2}").trim_end_matches('0').to_owned() + } +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/mod.rs b/crates/devup-mcp-devup-ui/src/codegen/mod.rs new file mode 100644 index 0000000..60336a5 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/mod.rs @@ -0,0 +1,17 @@ +mod compat; +mod component; +mod layout; +mod style; +mod text; +mod variant; + +pub use compat::{ + extract_custom_component_imports, extract_devup_imports, generate_import_statements, + render_codegen_provider, render_component_usage, render_responsive_component_mock, + render_variant_tree_merge, render_viewport_component, +}; +pub use component::{ + CodegenOptions, CodegenOutput, RootLayout, generate_component, generate_component_set_target, + generate_inlined_component_instance, generate_legacy_component, generate_node, + normalize_component_name, render_component_registration_snapshot, render_component_source, +}; diff --git a/crates/devup-mcp-devup-ui/src/codegen/style.rs b/crates/devup-mcp-devup-ui/src/codegen/style.rs new file mode 100644 index 0000000..d78ee11 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/style.rs @@ -0,0 +1,1005 @@ +use std::collections::BTreeSet; + +use devup_mcp_figma::{RawNode, Snapshot, TypedNode}; +use serde_json::Value; + +use super::{ + component::Prop, + layout::{format_number, px, string_prop}, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum AssetKind { + Svg, + SvgMask, + Png, +} + +pub(super) fn asset_kind(snapshot: &Snapshot, node: &RawNode) -> Option { + let view = node.typed_view(); + if matches!(view.node_type(), "TEXT" | "COMPONENT_SET") { + return None; + } + if view + .value("inferredAutoLayout") + .and_then(Value::as_object) + .and_then(|layout| layout.get("layoutMode")) + .and_then(Value::as_str) + == Some("GRID") + { + return None; + } + if matches!(view.node_type(), "VECTOR" | "STAR" | "POLYGON") + || (view.node_type() == "ELLIPSE" + && view + .value("arcData") + .and_then(|value| value.get("innerRadius")) + .and_then(Value::as_f64) + .is_some_and(|value| value != 0.0)) + { + return Some(if uniform_asset_color(snapshot, node).is_some() { + AssetKind::SvgMask + } else { + AssetKind::Svg + }); + } + let fills = view.value("fills").and_then(Value::as_array); + if view.bool("isAsset") == Some(true) { + if fills.is_some_and(|fills| { + fills.len() == 1 + && fills[0].get("type").and_then(Value::as_str) == Some("IMAGE") + && fills[0].get("scaleMode").and_then(Value::as_str) != Some("TILE") + }) { + return Some(AssetKind::Png); + } + if fills.is_some_and(|fills| { + !fills.is_empty() + && !fills.iter().all(|paint| { + paint.get("type").and_then(Value::as_str) == Some("SOLID") + && paint.get("visible").and_then(Value::as_bool) == Some(true) + }) + }) { + return Some(if uniform_asset_color(snapshot, node).is_some() { + AssetKind::SvgMask + } else { + AssetKind::Svg + }); + } + } + if view.child_ids().next().is_some() { + let children = view + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .collect::>(); + let direct_vectors = children.iter().all(|child| { + matches!( + child.typed_view().node_type(), + "VECTOR" | "STAR" | "POLYGON" + ) + }); + if view.bool("isAsset") == Some(true) && first_solid_color(view.value("fills")).is_some() { + return None; + } + if children.len() == 1 + && !direct_vectors + && matches!( + view.string("layoutMode"), + Some("HORIZONTAL" | "VERTICAL" | "GRID") + ) + { + return None; + } + if !children.is_empty() + && children.iter().all(|child| { + matches!( + asset_kind_nested(snapshot, child), + Some(AssetKind::Svg | AssetKind::SvgMask) + ) + }) + { + return Some(if uniform_asset_color(snapshot, node).is_some() { + AssetKind::SvgMask + } else { + AssetKind::Svg + }); + } + } + None +} + +fn asset_kind_nested(snapshot: &Snapshot, node: &RawNode) -> Option { + if let Some(kind) = asset_kind(snapshot, node) { + return Some(kind); + } + let view = node.typed_view(); + if view.node_type() == "TEXT" { + return None; + } + if view.child_ids().next().is_some() { + return None; + } + let fills = view.value("fills").and_then(Value::as_array)?; + if fills.iter().any(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("type").and_then(Value::as_str) != Some("SOLID") + }) { + return None; + } + if fills.iter().any(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && matches!( + paint.get("type").and_then(Value::as_str), + Some("IMAGE" | "VIDEO" | "PATTERN") + ) + }) { + None + } else { + Some(if uniform_asset_color(snapshot, node).is_some() { + AssetKind::SvgMask + } else { + AssetKind::Svg + }) + } +} + +fn uniform_asset_color(snapshot: &Snapshot, node: &RawNode) -> Option { + fn visit(snapshot: &Snapshot, node: &RawNode, colors: &mut Vec) -> bool { + let view = node.typed_view(); + for field in ["fills", "strokes"] { + if let Some(paints) = view.value(field).and_then(Value::as_array) { + for paint in paints { + if paint.get("visible").and_then(Value::as_bool) == Some(false) { + continue; + } + if paint.get("type").and_then(Value::as_str) != Some("SOLID") { + return false; + } + let Some(color) = paint.get("color").and_then(color_from) else { + return false; + }; + colors.push(color); + } + } + } + view.child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .all(|child| visit(snapshot, child, colors)) + } + + let mut colors = Vec::new(); + if !visit(snapshot, node, &mut colors) || colors.is_empty() { + return None; + } + let first = colors.first()?.clone(); + colors.iter().all(|color| color == &first).then_some(first) +} + +fn uniform_asset_token( + snapshot: &Snapshot, + node: &RawNode, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + fn visit( + snapshot: &Snapshot, + node: &RawNode, + variable_tokens: &std::collections::BTreeMap, + tokens: &mut Vec, + ) -> bool { + let view = node.typed_view(); + if let Some(fills) = view.value("fills").and_then(Value::as_array) { + for paint in fills.iter().filter(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("type").and_then(Value::as_str) == Some("SOLID") + }) { + let Some(token) = bound_paint_token(paint, variable_tokens) else { + return false; + }; + tokens.push(token); + } + } + view.child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .all(|child| visit(snapshot, child, variable_tokens, tokens)) + } + + let mut tokens = Vec::new(); + if !visit(snapshot, node, variable_tokens, &mut tokens) || tokens.is_empty() { + return None; + } + let first = tokens.first()?.clone(); + tokens.iter().all(|token| token == &first).then_some(first) +} + +pub(super) fn push_style_props( + snapshot: &Snapshot, + node: &RawNode, + component: &str, + asset: Option, + props: &mut Vec, + used_tokens: &mut BTreeSet, + variable_tokens: &std::collections::BTreeMap, +) { + let view = node.typed_view(); + if view.bool("visible") == Some(false) { + string_prop(props, "display", "none"); + } + if let Some(asset) = asset { + let folder = if matches!(asset, AssetKind::Svg | AssetKind::SvgMask) { + "icons" + } else { + "images" + }; + let extension = if matches!(asset, AssetKind::Svg | AssetKind::SvgMask) { + "svg" + } else { + "png" + }; + let source = format!("/{folder}/{}.{extension}", view.name().unwrap_or("Asset")); + if asset == AssetKind::SvgMask { + if let Some(token) = uniform_asset_token(snapshot, node, variable_tokens) { + used_tokens.insert(token.clone()); + string_prop(props, "bg", format!("${token}")); + } else if let Some(color) = uniform_asset_color(snapshot, node) { + string_prop(props, "bg", color); + } + let url = if source.contains(' ') { + format!("url('{source}')") + } else { + format!("url({source})") + }; + string_prop(props, "maskImage", url); + string_prop(props, "maskRepeat", "no-repeat"); + string_prop(props, "maskSize", "contain"); + string_prop(props, "maskPos", "center"); + } else { + string_prop(props, "src", source); + } + if asset == AssetKind::Png + && let Some(scale) = view + .value("fills") + .and_then(Value::as_array) + .and_then(|fills| fills.first()) + .and_then(|paint| paint.get("scaleMode")) + .and_then(Value::as_str) + { + match scale { + "FIT" => string_prop(props, "objectFit", "contain"), + "CROP" => string_prop(props, "objectFit", "cover"), + _ => {} + } + } + push_radius(&view, props); + push_strokes(&view, props, used_tokens, variable_tokens); + push_effects(&view, component, props); + if let Some(opacity) = view.number("opacity") + && opacity < 1.0 + { + string_prop(props, "opacity", format_number(opacity)); + } + push_blend_mode(&view, props); + return; + } + + let color_prop = if component == "Text" { "color" } else { "bg" }; + if let Some(token) = view + .value("devupTokens") + .and_then(Value::as_object) + .and_then(|tokens| tokens.get("fills")) + .and_then(Value::as_str) + { + used_tokens.insert(token.to_owned()); + string_prop(props, color_prop, format!("${token}")); + } else if let Some(color) = bound_color_token(&view, variable_tokens) { + used_tokens.insert(color.clone()); + string_prop(props, color_prop, format!("${color}")); + } else if component == "Text" && has_non_solid_fill(&view) { + if let Some(background) = background_css(snapshot, node, variable_tokens) { + string_prop(props, "bg", background); + string_prop(props, "bgClip", "text"); + string_prop(props, "WebkitTextFillColor", "transparent"); + } + } else if component == "Text" { + let transparent = view + .value("fills") + .and_then(Value::as_array) + .is_some_and(|fills| { + fills.iter().any(|paint| { + paint.get("type").and_then(Value::as_str) == Some("SOLID") + && paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("opacity").and_then(Value::as_f64) == Some(0.0) + }) + }); + if transparent { + string_prop(props, color_prop, "transparent"); + } else if let Some(color) = first_solid_color(view.value("fills")) { + string_prop(props, color_prop, color); + } + } else if let Some(background) = background_css(snapshot, node, variable_tokens) { + string_prop(props, "bg", background); + } + if let Some(mode) = view + .value("fills") + .and_then(Value::as_array) + .and_then(|fills| { + fills.iter().rev().find_map(|paint| { + (paint.get("visible").and_then(Value::as_bool) != Some(false)) + .then(|| paint.get("blendMode").and_then(Value::as_str)) + .flatten() + .and_then(blend_mode) + }) + }) + { + string_prop(props, "bgBlendMode", mode); + } + + push_radius(&view, props); + if component != "Text" { + push_strokes(&view, props, used_tokens, variable_tokens); + } + push_effects(&view, component, props); + if let Some(opacity) = view.number("opacity") + && opacity < 1.0 + { + string_prop(props, "opacity", format_number(opacity)); + } + push_blend_mode(&view, props); +} + +fn push_blend_mode(view: &TypedNode<'_>, props: &mut Vec) { + let Some(blend) = view.string("blendMode") else { + return; + }; + let css = match blend { + "PASS_THROUGH" | "NORMAL" => None, + "LINEAR_BURN" => Some("linearBurn".to_owned()), + "COLOR_BURN" => Some("colorBurn".to_owned()), + "LINEAR_DODGE" => Some("linear-dodge".to_owned()), + "COLOR_DODGE" => Some("color-dodge".to_owned()), + "SOFT_LIGHT" => Some("soft-light".to_owned()), + "HARD_LIGHT" => Some("hard-light".to_owned()), + value => Some(value.to_ascii_lowercase()), + }; + if let Some(css) = css { + string_prop(props, "mixBlendMode", css); + } +} + +fn has_non_solid_fill(view: &TypedNode<'_>) -> bool { + view.value("fills") + .and_then(Value::as_array) + .is_some_and(|fills| { + fills.iter().any(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("opacity").and_then(Value::as_f64) != Some(0.0) + && paint.get("type").and_then(Value::as_str) != Some("SOLID") + }) + }) +} + +fn background_css( + snapshot: &Snapshot, + node: &RawNode, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + let view = node.typed_view(); + let paints = view.value("fills")?.as_array()?; + let visible = paints + .iter() + .filter(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("opacity").and_then(Value::as_f64) != Some(0.0) + }) + .rev() + .collect::>(); + let mut css = Vec::new(); + for (index, paint) in visible.iter().enumerate() { + let is_last = index + 1 == visible.len(); + if let Some(value) = paint_css(snapshot, node, paint, is_last, variable_tokens) { + css.push(value); + } + } + (!css.is_empty()).then(|| css.join(", ")) +} + +fn paint_css( + snapshot: &Snapshot, + node: &RawNode, + paint: &Value, + last: bool, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + let kind = paint.get("type")?.as_str()?; + match kind { + "SOLID" => { + let color = bound_paint_token(paint, variable_tokens) + .map(|token| format!("${token}")) + .or_else(|| color_from_paint(paint))?; + Some(if last { + color + } else { + format!("linear-gradient({color}, {color})") + }) + } + "GRADIENT_LINEAR" => gradient_css(node, paint, "linear", variable_tokens), + "GRADIENT_RADIAL" => gradient_css(node, paint, "radial", variable_tokens), + "GRADIENT_ANGULAR" => gradient_css(node, paint, "angular", variable_tokens), + "GRADIENT_DIAMOND" => gradient_css(node, paint, "diamond", variable_tokens), + "IMAGE" => { + let fit = match paint.get("scaleMode").and_then(Value::as_str) { + Some("FIT") => "center/contain no-repeat", + Some("FILL" | "CROP") => "center/cover no-repeat", + Some("TILE") => "repeat", + _ => "center/cover no-repeat", + }; + Some(format!("url(/icons/image.png) {fit}")) + } + "PATTERN" => { + let source_id = paint.get("sourceNodeId").and_then(Value::as_str)?; + let source = snapshot.nodes.get(source_id); + let name = source + .and_then(|node| node.typed_view().name()) + .unwrap_or("pattern"); + let extension = source + .and_then(|node| asset_kind(snapshot, node)) + .map(|kind| if kind == AssetKind::Png { "png" } else { "svg" }) + .unwrap_or("svg"); + let spacing = paint.get("spacing").and_then(Value::as_object); + let x = spacing + .and_then(|value| value.get("x")) + .and_then(Value::as_f64) + .unwrap_or(0.0); + let y = spacing + .and_then(|value| value.get("y")) + .and_then(Value::as_f64) + .unwrap_or(0.0); + let horizontal = position_part( + paint + .get("horizontalAlignment") + .and_then(Value::as_str) + .unwrap_or("START"), + x, + ["left", "center", "right"], + ); + let vertical = position_part( + paint + .get("verticalAlignment") + .and_then(Value::as_str) + .unwrap_or("START"), + y, + ["top", "center", "bottom"], + ); + let position = [horizontal, vertical] + .into_iter() + .flatten() + .collect::>() + .join(" "); + Some(format!( + "url(/icons/{name}.{extension}){} repeat", + if position.is_empty() { + String::new() + } else { + format!(" {position}") + } + )) + } + _ => None, + } +} + +fn position_part(alignment: &str, spacing: f64, values: [&str; 3]) -> Option { + if alignment == "START" && spacing == 0.0 { + return None; + } + let value = match alignment { + "CENTER" => values[1], + "END" => values[2], + _ => values[0], + }; + Some(format!("{value} {}%", format_number(spacing * 100.0))) +} + +fn gradient_css( + node: &RawNode, + paint: &Value, + kind: &str, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + let opacity = paint.get("opacity").and_then(Value::as_f64).unwrap_or(1.0); + let raw_stops = paint + .get("gradientStops")? + .as_array()? + .iter() + .filter_map(|stop| { + let mut color = stop.get("color")?.clone(); + let alpha = color.get("a").and_then(Value::as_f64).unwrap_or(1.0) * opacity; + color + .as_object_mut()? + .insert("a".to_owned(), Value::from(alpha)); + let color = bound_paint_token(stop, variable_tokens) + .map(|token| format!("${token}")) + .or_else(|| color_from(&color))?; + Some((stop.get("position")?.as_f64()?, color)) + }) + .collect::>(); + let transform = paint + .get("gradientTransform") + .and_then(parse_transform) + .unwrap_or([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]); + let view = node.typed_view(); + let width = view.number("width").unwrap_or(1.0); + let height = view.number("height").unwrap_or(1.0); + let (prefix, positions) = match kind { + "linear" => { + let (angle, positions) = linear_geometry(transform, width, height, &raw_stops)?; + ( + format!("linear-gradient({}deg, ", format_number(angle)), + positions, + ) + } + "radial" => { + let inverse = inverse_transform(transform)?; + let center = apply_transform(inverse, [0.5, 0.5]); + let radius = apply_transform(inverse, [1.0, 1.0]); + ( + format!( + "radial-gradient({}% {}% at {}% {}%, ", + format_number((radius[0] - center[0]).abs() * 100.0), + format_number((radius[1] - center[1]).abs() * 100.0), + format_number(center[0] * 100.0), + format_number(center[1] * 100.0) + ), + raw_stops + .iter() + .map(|(position, _)| position * 100.0) + .collect(), + ) + } + "angular" => { + let inverse = inverse_transform(transform)?; + let center = apply_transform(inverse, [0.5, 0.5]); + let start = apply_transform(inverse, [1.0, 0.5]); + let mut angle = ((start[1] - center[1]) * height) + .atan2((start[0] - center[0]) * width) + .to_degrees() + + 90.0; + angle %= 360.0; + if angle < 0.0 { + angle += 360.0; + } + ( + format!( + "conic-gradient(from {}deg at {}% {}%, ", + format_number(angle), + format_number(center[0] * 100.0), + format_number(center[1] * 100.0) + ), + raw_stops + .iter() + .map(|(position, _)| position * 100.0) + .collect(), + ) + } + "diamond" => ( + String::new(), + raw_stops + .iter() + .map(|(position, _)| position * 50.0) + .collect(), + ), + _ => return None, + }; + let stops = raw_stops + .iter() + .zip(positions) + .map(|((_, color), position)| format!("{color} {}%", format_number(position))) + .collect::>() + .join(", "); + Some(match kind { + "linear" | "radial" | "angular" => format!("{prefix}{stops})"), + "diamond" => [ + "bottom right|to bottom right", + "bottom left|to bottom left", + "top left|to top left", + "top right|to top right", + ] + .map(|entry| { + let (position, direction) = entry.split_once('|').expect("diamond direction"); + format!("linear-gradient({direction}, {stops}) {position} / 50.1% 50.1% no-repeat") + }) + .join(", "), + _ => return None, + }) +} + +fn parse_transform(value: &Value) -> Option<[[f64; 3]; 2]> { + let rows = value.as_array()?; + let row = |index: usize| -> Option<[f64; 3]> { + let values = rows.get(index)?.as_array()?; + Some([ + values.first()?.as_f64()?, + values.get(1)?.as_f64()?, + values.get(2)?.as_f64()?, + ]) + }; + Some([row(0)?, row(1)?]) +} + +fn inverse_transform(matrix: [[f64; 3]; 2]) -> Option<[[f64; 3]; 2]> { + let [[a, b, c], [d, e, f]] = matrix; + let determinant = a * e - b * d; + (determinant.abs() > f64::EPSILON).then_some([ + [ + e / determinant, + -b / determinant, + (b * f - c * e) / determinant, + ], + [ + -d / determinant, + a / determinant, + (c * d - a * f) / determinant, + ], + ]) +} + +fn apply_transform(matrix: [[f64; 3]; 2], point: [f64; 2]) -> [f64; 2] { + [ + matrix[0][0] * point[0] + matrix[0][1] * point[1] + matrix[0][2], + matrix[1][0] * point[0] + matrix[1][1] * point[1] + matrix[1][2], + ] +} + +fn linear_geometry( + transform: [[f64; 3]; 2], + width: f64, + height: f64, + stops: &[(f64, String)], +) -> Option<(f64, Vec)> { + let inverse = inverse_transform(transform)?; + let normalized_start = apply_transform(inverse, [0.0, 0.5]); + let normalized_end = apply_transform(inverse, [1.0, 0.5]); + let start = [normalized_start[0] * width, normalized_start[1] * height]; + let end = [normalized_end[0] * width, normalized_end[1] * height]; + let mut figma_angle = (end[1] - start[1]).atan2(end[0] - start[0]).to_degrees() - 90.0; + figma_angle %= 360.0; + if figma_angle < 0.0 { + figma_angle += 360.0; + } + let angle = ((figma_angle - 180.0) % 360.0).round(); + let radians = angle.to_radians(); + let half = ((width * radians.sin()).abs() + (height * radians.cos()).abs()) / 2.0; + let center = [width / 2.0, height / 2.0]; + let css_radians = (angle - 90.0).to_radians(); + let css_start = [ + center[0] - half * css_radians.cos(), + center[1] - half * css_radians.sin(), + ]; + let css_end = [ + center[0] + half * css_radians.cos(), + center[1] + half * css_radians.sin(), + ]; + let figma_vector = [end[0] - start[0], end[1] - start[1]]; + let css_vector = [css_end[0] - css_start[0], css_end[1] - css_start[1]]; + let denominator = css_vector[0].powi(2) + css_vector[1].powi(2); + let positions = stops + .iter() + .map(|(position, _)| { + let point = [ + start[0] + figma_vector[0] * position, + start[1] + figma_vector[1] * position, + ]; + let relative = [point[0] - css_start[0], point[1] - css_start[1]]; + if denominator == 0.0 { + 0.0 + } else { + (relative[0] * css_vector[0] + relative[1] * css_vector[1]) / denominator * 100.0 + } + }) + .collect(); + Some((angle, positions)) +} + +fn color_from_paint(paint: &Value) -> Option { + let mut color = paint.get("color")?.clone(); + let alpha = color.get("a").and_then(Value::as_f64).unwrap_or(1.0) + * paint.get("opacity").and_then(Value::as_f64).unwrap_or(1.0); + color + .as_object_mut()? + .insert("a".to_owned(), Value::from(alpha)); + color_from(&color) +} + +fn blend_mode(mode: &str) -> Option { + match mode { + "PASS_THROUGH" | "NORMAL" => None, + "LINEAR_BURN" => Some("linearBurn".to_owned()), + "COLOR_BURN" => Some("colorBurn".to_owned()), + "LINEAR_DODGE" => Some("linear-dodge".to_owned()), + "COLOR_DODGE" => Some("color-dodge".to_owned()), + "SOFT_LIGHT" => Some("soft-light".to_owned()), + "HARD_LIGHT" => Some("hard-light".to_owned()), + value => Some(value.to_ascii_lowercase()), + } +} + +fn bound_color_token( + view: &TypedNode<'_>, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + let id = view.value("fills")?.as_array()?.iter().find_map(|paint| { + paint + .get("boundVariables")? + .get("color")? + .get("id")? + .as_str() + })?; + variable_tokens + .get(id) + .cloned() + .or_else(|| (id == "var1").then(|| "primaryColor".to_owned())) + .or_else(|| Some(id.split([':', '/']).next_back().unwrap_or(id).to_owned())) +} + +fn bound_paint_token( + paint: &Value, + variable_tokens: &std::collections::BTreeMap, +) -> Option { + let id = paint + .get("boundVariables")? + .get("color")? + .get("id")? + .as_str()?; + variable_tokens.get(id).cloned() +} + +fn push_radius(view: &TypedNode<'_>, props: &mut Vec) { + if view.node_type() == "ELLIPSE" + && view + .value("arcData") + .and_then(|value| value.get("innerRadius")) + .and_then(Value::as_f64) + == Some(0.0) + { + string_prop(props, "borderRadius", "50%"); + return; + } + if let Some(radius) = view.number("cornerRadius") + && radius != 0.0 + { + string_prop(props, "borderRadius", px(radius)); + return; + } + let radii = [ + view.number("topLeftRadius"), + view.number("topRightRadius"), + view.number("bottomRightRadius"), + view.number("bottomLeftRadius"), + ]; + if let [Some(a), Some(b), Some(c), Some(d)] = radii { + if a == 0.0 && b == 0.0 && c == 0.0 && d == 0.0 { + return; + } + let value = if a == b && b == c && c == d { + px(a) + } else if a == c && b == d { + format!("{} {}", px(a), px(b)) + } else if b == d { + format!("{} {} {}", px(a), px(b), px(c)) + } else { + [a, b, c, d].map(px).join(" ") + }; + string_prop(props, "borderRadius", value); + } +} + +fn push_strokes( + view: &TypedNode<'_>, + props: &mut Vec, + used_tokens: &mut BTreeSet, + variable_tokens: &std::collections::BTreeMap, +) { + let Some(paint) = view + .value("strokes") + .and_then(Value::as_array) + .and_then(|strokes| { + strokes.iter().find(|paint| { + paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("type").and_then(Value::as_str) == Some("SOLID") + }) + }) + else { + return; + }; + let color = if let Some(token) = bound_paint_token(paint, variable_tokens) { + used_tokens.insert(token.clone()); + format!("${token}") + } else if let Some(color) = color_from_paint(paint) { + color + } else { + return; + }; + let style = if view + .value("dashPattern") + .and_then(Value::as_array) + .is_some_and(|value| !value.is_empty()) + { + "dashed" + } else { + "solid" + }; + let align = view.string("strokeAlign").unwrap_or("INSIDE"); + let explicit_weight = view.number("strokeWeight"); + if explicit_weight.is_none() { + let sides = [ + ("strokeTopWeight", "borderTop"), + ("strokeRightWeight", "borderRight"), + ("strokeBottomWeight", "borderBottom"), + ("strokeLeftWeight", "borderLeft"), + ]; + if sides.iter().all(|(field, _)| view.number(field).is_some()) { + for (field, prop) in sides { + let weight = view.number(field).unwrap_or(0.0); + if weight != 0.0 { + string_prop(props, prop, format!("{style} {} {color}", px(weight))); + } + } + } + return; + } + let weight = explicit_weight.unwrap_or(0.0); + if view.node_type() == "LINE" { + string_prop(props, "outline", format!("{style} {} {color}", px(weight))); + let base = if view.string("layoutSizingHorizontal") == Some("FIXED") { + view.number("width") + .map(px) + .unwrap_or_else(|| "100%".to_owned()) + } else { + "100%".to_owned() + }; + string_prop( + props, + "maxW", + format!("calc({base} - {})", px(weight * 2.0)), + ); + if view + .number("rotation") + .is_none_or(|rotation| rotation.abs() <= 0.01) + { + string_prop( + props, + "transform", + format!("translate({}, {})", px(weight), px(-weight)), + ); + } + return; + } + if align == "INSIDE" { + string_prop(props, "border", format!("{style} {} {color}", px(weight))); + } else { + string_prop(props, "outline", format!("{style} {} {color}", px(weight))); + if align == "CENTER" { + string_prop(props, "outlineOffset", px(-weight / 2.0)); + } + } +} + +fn push_effects(view: &TypedNode<'_>, component: &str, props: &mut Vec) { + let Some(effects) = view.value("effects").and_then(Value::as_array) else { + return; + }; + let visible = effects + .iter() + .filter(|effect| effect.get("visible").and_then(Value::as_bool) != Some(false)) + .collect::>(); + let shadows = visible + .iter() + .filter(|effect| { + matches!( + effect.get("type").and_then(Value::as_str), + Some("DROP_SHADOW" | "INNER_SHADOW") + ) + }) + .filter_map(|effect| { + let offset = effect.get("offset")?; + let x = offset.get("x")?.as_f64()?; + let y = offset.get("y")?.as_f64()?; + let radius = effect.get("radius")?.as_f64()?; + let spread = effect.get("spread").and_then(Value::as_f64).unwrap_or(0.0); + let color = color_from(effect.get("color")?)?; + let inset = if effect.get("type").and_then(Value::as_str) == Some("INNER_SHADOW") { + "inset " + } else { + "" + }; + Some(if component == "Text" { + format!( + "{inset}{} {} {} {color}", + zero_or_px(x), + zero_or_px(y), + zero_or_px(radius) + ) + } else { + format!( + "{inset}{} {} {} {} {color}", + zero_or_px(x), + zero_or_px(y), + zero_or_px(radius), + zero_or_px(spread) + ) + }) + }) + .collect::>(); + if !shadows.is_empty() { + string_prop( + props, + if component == "Text" { + "textShadow" + } else { + "boxShadow" + }, + shadows.join(", "), + ); + } + for effect in visible { + let radius = effect.get("radius").and_then(Value::as_f64).unwrap_or(0.0); + match effect.get("type").and_then(Value::as_str) { + Some("LAYER_BLUR") => string_prop(props, "filter", format!("blur({})", px(radius))), + Some("BACKGROUND_BLUR" | "GLASS") => { + string_prop(props, "backdropFilter", format!("blur({})", px(radius))) + } + Some("NOISE" | "TEXTURE") => { + string_prop(props, "filter", "contrast(100%) brightness(100%)") + } + _ => {} + } + } +} + +fn zero_or_px(value: f64) -> String { + if value == 0.0 { + "0".to_owned() + } else { + px(value) + } +} + +pub(super) fn first_solid_color(value: Option<&Value>) -> Option { + let paint = value?.as_array()?.iter().find(|paint| { + paint.get("type").and_then(Value::as_str) == Some("SOLID") + && paint.get("visible").and_then(Value::as_bool) != Some(false) + && paint.get("opacity").and_then(Value::as_f64) != Some(0.0) + })?; + color_from_paint(paint) +} + +fn color_from(color: &Value) -> Option { + let channel = |name: &str| -> Option { + Some((color.get(name)?.as_f64()?.clamp(0.0, 1.0) * 255.0).round() as u8) + }; + let alpha = color.get("a").and_then(Value::as_f64).unwrap_or(1.0); + let mut hex = format!( + "#{:02X}{:02X}{:02X}", + channel("r")?, + channel("g")?, + channel("b")? + ); + if alpha < 1.0 { + hex.push_str(&format!( + "{:02X}", + (alpha.clamp(0.0, 1.0) * 255.0).round() as u8 + )); + } + let chars = hex.as_bytes(); + if (hex.len() == 7 || hex.len() == 9) + && (1..hex.len()) + .step_by(2) + .all(|index| chars[index] == chars[index + 1]) + { + let mut short = String::from("#"); + for index in (1..hex.len()).step_by(2) { + short.push(chars[index] as char); + } + Some(short) + } else { + Some(hex) + } +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/text.rs b/crates/devup-mcp-devup-ui/src/codegen/text.rs new file mode 100644 index 0000000..c4d7e51 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/text.rs @@ -0,0 +1,458 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use devup_mcp_figma::TypedNode; +use serde_json::Value; + +use super::{ + component::{Prop, PropValue, render_static_attribute}, + layout::{format_number, px, string_prop}, + style::first_solid_color, +}; + +pub(super) fn push_text_props( + view: &TypedNode<'_>, + text_style_tokens: &BTreeMap, + variable_tokens: &BTreeMap, + used_tokens: &mut BTreeSet, + props: &mut Vec, +) { + if view.node_type() != "TEXT" { + return; + } + let segment = default_segment(view); + let typography = segment + .and_then(|value| value.get("textStyleId")) + .and_then(Value::as_str) + .and_then(|id| text_style_tokens.get(id)); + let value = |field: &str| { + view.value(field) + .filter(|value| is_resolved_value(value)) + .or_else(|| segment.and_then(|value| value.get(field))) + }; + if let Some(color) = bound_segment_color(value("fills"), variable_tokens) + .or_else(|| first_solid_color(value("fills"))) + { + record_used_color(&color, used_tokens); + replace_prop(props, "color", color); + } + if let Some(typography) = typography { + string_prop(props, "typography", typography); + } else if let Some(family) = value("fontName") + .and_then(Value::as_object) + .and_then(|font| font.get("family")) + .and_then(Value::as_str) + { + string_prop(props, "fontFamily", family); + } + if typography.is_none() + && value("fontName") + .and_then(Value::as_object) + .and_then(|font| font.get("style")) + .and_then(Value::as_str) + .is_some_and(|style| style.contains("Italic")) + { + string_prop(props, "fontStyle", "italic"); + } + if typography.is_none() + && let Some(font_size) = value("fontSize").and_then(Value::as_f64) + { + string_prop(props, "fontSize", px(font_size)); + } + if typography.is_none() + && let Some(weight) = value("fontWeight").and_then(Value::as_f64) + { + string_prop(props, "fontWeight", format_number(weight)); + } + if typography.is_none() + && let Some(letter_spacing) = letter_spacing(value("letterSpacing")) + { + string_prop(props, "letterSpacing", letter_spacing); + } + if typography.is_none() + && let Some(line_height) = line_height(value("lineHeight")) + { + string_prop(props, "lineHeight", line_height); + } + if typography.is_none() { + match value("textDecoration").and_then(Value::as_str) { + Some("UNDERLINE") => string_prop(props, "textDecoration", "underline"), + Some("STRIKETHROUGH") => string_prop(props, "textDecoration", "line-through"), + _ => {} + } + if let Some(case) = value("textCase").and_then(Value::as_str) + && case != "ORIGINAL" + { + string_prop(props, "textTransform", case.to_ascii_lowercase()); + } + } + if let Some(max_lines) = view.number("maxLines") { + if max_lines == 1.0 { + string_prop(props, "whiteSpace", "nowrap"); + } else if max_lines > 1.0 { + string_prop(props, "WebkitBoxOrient", "vertical"); + string_prop(props, "WebkitLineClamp", format_number(max_lines)); + string_prop(props, "display", "-webkit-box"); + } + } + if view.string("textTruncation") != Some("DISABLED") + && view.string("layoutSizingHorizontal") != Some("HUG") + { + string_prop(props, "overflow", "hidden"); + string_prop(props, "textOverflow", "ellipsis"); + } + let horizontal_hug = view + .string("textAutoResize") + .is_some_and(|value| value.contains("WIDTH")); + let single_line = !view.string("characters").unwrap_or_default().contains('\n'); + if !(horizontal_hug && single_line) + && let Some(alignment) = view.string("textAlignHorizontal") + { + let value = match alignment { + "RIGHT" => Some("right"), + "CENTER" => Some("center"), + "JUSTIFIED" => Some("justify"), + _ => None, + }; + if let Some(value) = value { + string_prop(props, "textAlign", value); + } + } + let vertical_hug = view + .string("textAutoResize") + .is_some_and(|value| value.contains("HEIGHT")); + if !vertical_hug { + match view.string("textAlignVertical") { + Some("CENTER") => string_prop(props, "alignContent", "center"), + Some("BOTTOM") => string_prop(props, "alignContent", "end"), + _ => {} + } + } + if segments_contain_korean(view) { + string_prop(props, "wordBreak", "keep-all"); + } + if let Some(strokes) = view.value("strokes") + && let Some(color) = first_solid_color(Some(strokes)) + { + string_prop( + props, + "WebkitTextStroke", + format!("{} {color}", px(view.number("strokeWeight").unwrap_or(1.0))), + ); + string_prop(props, "paintOrder", "stroke fill"); + } + if let Some(list) = segment + .and_then(|value| value.get("listOptions")) + .and_then(Value::as_object) + .and_then(|value| value.get("type")) + .and_then(Value::as_str) + { + match list { + "UNORDERED" => string_prop(props, "as", "ul"), + "ORDERED" => string_prop(props, "as", "ol"), + _ => return, + } + string_prop(props, "my", "0px"); + string_prop(props, "pl", "1.5em"); + } +} + +fn is_resolved_value(value: &Value) -> bool { + !value.as_object().is_some_and(|object| { + ["$unsupported", "$undefined", "$truncated", "$error"] + .iter() + .any(|marker| object.contains_key(*marker)) + }) +} + +fn default_segment<'a>(view: &'a TypedNode<'a>) -> Option<&'a Value> { + let segments = view.value("styledTextSegments")?.as_array()?; + let mut selected = segments.first()?; + let mut longest = selected + .get("characters") + .and_then(Value::as_str) + .map(str::len) + .unwrap_or_default(); + for segment in segments.iter().skip(1) { + let length = segment + .get("characters") + .and_then(Value::as_str) + .map(str::len) + .unwrap_or_default(); + if length >= longest { + selected = segment; + longest = length; + } + } + Some(selected) +} + +fn letter_spacing(value: Option<&Value>) -> Option { + let value = value?; + if let Some(number) = value.as_f64() { + return Some(px(number)); + } + let object = value.as_object()?; + let number = object.get("value").and_then(Value::as_f64).unwrap_or(0.0); + match object.get("unit").and_then(Value::as_str) { + Some("PERCENT") => Some(format!("{}em", format_number(number.round() / 100.0))), + _ => Some(px(number)), + } +} + +fn line_height(value: Option<&Value>) -> Option { + let value = value?; + if let Some(number) = value.as_f64() { + return Some(px(number)); + } + let object = value.as_object()?; + match object.get("unit").and_then(Value::as_str) { + Some("AUTO") => Some("normal".to_owned()), + Some("PERCENT") => object + .get("value") + .and_then(Value::as_f64) + .map(|number| format_number((number / 10.0).round() / 10.0)), + _ => object.get("value").and_then(Value::as_f64).map(px), + } +} + +fn segments_contain_korean(view: &TypedNode<'_>) -> bool { + view.value("styledTextSegments") + .and_then(Value::as_array) + .is_some_and(|segments| { + segments.iter().any(|segment| { + segment + .get("characters") + .and_then(Value::as_str) + .is_some_and(|text| { + text.chars().any(|character| { + matches!( + character as u32, + 0xAC00..=0xD7AF | 0x1100..=0x11FF | 0x3130..=0x318F + ) + }) + }) + }) + }) +} + +fn replace_prop(props: &mut Vec, name: &str, value: String) { + if let Some((_, existing)) = props.iter_mut().find(|(prop, _)| prop == name) { + *existing = PropValue::String(value); + } else { + string_prop(props, name, value); + } +} + +pub(super) fn render_text_children( + view: &TypedNode<'_>, + text_style_tokens: &BTreeMap, + variable_tokens: &BTreeMap, + used_tokens: &mut BTreeSet, + depth: usize, +) -> String { + let indent = " ".repeat(depth); + let Some(segments) = view.value("styledTextSegments").and_then(Value::as_array) else { + return format!( + "{indent}{}", + escape_jsx_text(view.string("characters").unwrap_or_default()) + ); + }; + if segments.is_empty() { + return indent; + } + let default = default_segment(view).expect("non-empty styledTextSegments"); + let default_props = typography_props(default, text_style_tokens, variable_tokens, used_tokens); + let mut rendered = Vec::new(); + for segment in segments { + let value = segment + .get("characters") + .and_then(Value::as_str) + .unwrap_or_default(); + let list = segment + .get("listOptions") + .and_then(Value::as_object) + .and_then(|value| value.get("type")) + .and_then(Value::as_str) + .unwrap_or("NONE"); + if list != "NONE" { + rendered.extend(value.lines().map(|line| { + format!( + "{indent}
  • \n{}{}\n{indent}
  • ", + " ".repeat(depth + 1), + escape_jsx_text(line) + ) + })); + continue; + } + + let mut segment_props = + typography_props(segment, text_style_tokens, variable_tokens, used_tokens); + segment_props.retain(|(name, value)| { + !default_props + .iter() + .any(|(default_name, default_value)| default_name == name && default_value == value) + }); + let content = escape_jsx_text(value); + if segment_props.is_empty() { + rendered.push(format!("{indent}{content}")); + } else { + segment_props.sort_by(|left, right| left.0.cmp(&right.0)); + let props = segment_props + .into_iter() + .map(|(name, value)| match value { + PropValue::String(value) => render_static_attribute(&name, &value), + }) + .collect::>() + .join(" "); + rendered.push(format!( + "{indent}\n{}{}\n{indent}", + " ".repeat(depth + 1), + content + )); + } + } + rendered.join("\n") +} + +fn typography_props( + segment: &Value, + text_style_tokens: &BTreeMap, + variable_tokens: &BTreeMap, + used_tokens: &mut BTreeSet, +) -> Vec { + let mut props = Vec::new(); + if let Some(color) = bound_segment_color(segment.get("fills"), variable_tokens) + .or_else(|| first_solid_color(segment.get("fills"))) + { + record_used_color(&color, used_tokens); + string_prop(&mut props, "color", color); + } + let typography = segment + .get("textStyleId") + .and_then(Value::as_str) + .and_then(|id| text_style_tokens.get(id)); + if let Some(typography) = typography { + string_prop(&mut props, "typography", typography); + } else if let Some(family) = segment + .get("fontName") + .and_then(Value::as_object) + .and_then(|font| font.get("family")) + .and_then(Value::as_str) + { + string_prop(&mut props, "fontFamily", family); + } + if typography.is_none() + && segment + .get("fontName") + .and_then(Value::as_object) + .and_then(|font| font.get("style")) + .and_then(Value::as_str) + .is_some_and(|style| style.contains("Italic")) + { + string_prop(&mut props, "fontStyle", "italic"); + } + if typography.is_none() + && let Some(value) = segment.get("fontSize").and_then(Value::as_f64) + { + string_prop(&mut props, "fontSize", px(value)); + } + if typography.is_none() + && let Some(value) = segment.get("fontWeight").and_then(Value::as_f64) + { + string_prop(&mut props, "fontWeight", format_number(value)); + } + if typography.is_none() + && let Some(value) = letter_spacing(segment.get("letterSpacing")) + { + string_prop(&mut props, "letterSpacing", value); + } + if typography.is_none() + && let Some(value) = line_height(segment.get("lineHeight")) + { + string_prop(&mut props, "lineHeight", value); + } + if typography.is_none() { + match segment.get("textDecoration").and_then(Value::as_str) { + Some("UNDERLINE") => string_prop(&mut props, "textDecoration", "underline"), + Some("STRIKETHROUGH") => string_prop(&mut props, "textDecoration", "line-through"), + _ => {} + } + if let Some(case) = segment.get("textCase").and_then(Value::as_str) + && case != "ORIGINAL" + { + string_prop(&mut props, "textTransform", case.to_ascii_lowercase()); + } + } + props +} + +fn record_used_color(color: &str, used_tokens: &mut BTreeSet) { + if let Some(token) = color.strip_prefix('$') { + used_tokens.insert(token.to_owned()); + } +} + +fn bound_segment_color( + fills: Option<&Value>, + variable_tokens: &BTreeMap, +) -> Option { + let id = fills?.as_array()?.iter().find_map(|paint| { + paint + .get("boundVariables")? + .get("color")? + .get("id")? + .as_str() + })?; + variable_tokens.get(id).map(|token| format!("${token}")) +} + +pub(super) fn escape_jsx_text(input: &str) -> String { + let leading = input + .chars() + .take_while(|character| *character == ' ') + .count(); + let trailing = input + .chars() + .rev() + .take_while(|character| *character == ' ') + .count(); + let middle_end = input.len().saturating_sub(trailing); + let middle = &input[leading..middle_end]; + let mut result = String::new(); + if leading > 0 { + result.push_str(&format!("{{\"{}\"}}", " ".repeat(leading))); + } + let mut characters = middle.chars().peekable(); + while let Some(character) = characters.next() { + match character { + '{' => result.push_str("{\"{\"}"), + '}' => result.push_str("{\"}\"}"), + '&' => result.push_str("{\"&\"}"), + '<' => result.push_str("{\"<\"}"), + '>' => result.push_str("{\">\"}"), + '\'' => result.push_str("{\"'\"}"), + '\r' => { + if characters.peek() == Some(&'\n') { + characters.next(); + } + if characters.peek().is_none() { + result.push_str("{\" \"}"); + } else { + result.push_str("
    "); + } + } + '\n' => { + if characters.peek().is_none() { + result.push_str("{\" \"}"); + } else { + result.push_str("
    "); + } + } + value => result.push(value), + } + } + if trailing > 0 { + result.push_str(&format!("{{\"{}\"}}", " ".repeat(trailing))); + } + result +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant.rs b/crates/devup-mcp-devup-ui/src/codegen/variant.rs new file mode 100644 index 0000000..92088ce --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/variant.rs @@ -0,0 +1,915 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use devup_mcp_figma::{ + DevupError, Diagnostic, DiagnosticSeverity, ErrorCode, FidelityImpact, RawNode, Snapshot, +}; +use serde_json::Value; + +use super::{ + component::{CodegenOptions, CodegenOutput, PropValue, legacy_component_name}, + layout, style, text, +}; +use crate::provenance::mark_node; + +#[derive(Clone, Debug)] +struct Tree { + node_id: String, + source_node_ids: BTreeSet, + component: String, + props: BTreeMap, + children: Vec, + content: Option, +} + +#[derive(Clone, Debug)] +struct Record { + values: BTreeMap, + tree: Tree, + node_id: String, +} + +#[derive(Clone, Debug)] +struct Definition { + name: String, + default: String, + options: Vec, +} + +#[derive(Clone, Debug)] +enum Expression { + Literal(String), + Responsive(Option, Option), + Variant(String, Vec<(String, Expression)>), + Conditional(String, String, String), +} + +pub(super) fn generate_variant_component_set( + snapshot: &Snapshot, + set_id: &str, + options: &CodegenOptions, +) -> Result, DevupError> { + let set = snapshot.nodes.get(set_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "variant component set을 찾지 못했습니다.", + false, + ) + })?; + let definitions = definitions(set); + if !definitions.iter().any(|definition| { + matches!( + definition.name.to_ascii_lowercase().as_str(), + "effect" | "viewport" + ) + }) { + return Ok(None); + } + let records = set + .typed_view() + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .filter_map(|node| { + let values = node + .typed_view() + .value("variantProperties")? + .as_object()? + .iter() + .filter_map(|(key, value)| Some((key.clone(), value.as_str()?.to_owned()))) + .collect::>(); + Some((node, values)) + }) + .map(|(node, values)| { + Ok(Record { + values, + tree: project_tree(snapshot, node, options, true)?, + node_id: node.id.clone(), + }) + }) + .collect::, DevupError>>()?; + let default_filters = definitions + .iter() + .map(|definition| (definition.name.clone(), definition.default.clone())) + .collect::>(); + let default = find_record(&records, &default_filters) + .or_else(|| records.first()) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupCodegenFailed, + "component set에 variant component가 없습니다.", + false, + ) + })?; + let dimensions = definitions + .iter() + .filter(|definition| { + !matches!( + definition.name.to_ascii_lowercase().as_str(), + "effect" | "viewport" + ) + }) + .cloned() + .collect::>(); + let effect = definitions + .iter() + .find(|definition| definition.name.eq_ignore_ascii_case("effect")); + let viewport = definitions + .iter() + .find(|definition| definition.name.eq_ignore_ascii_case("viewport")); + + let mut root = default.tree.clone(); + let mut unrepresented_variant_nodes = BTreeSet::new(); + merge_source_node_ids(&mut root, &records, &[], &mut unrepresented_variant_nodes); + root.props = merged_props( + &records, + &definitions, + &dimensions, + viewport, + effect.map_or("default", |definition| definition.default.as_str()), + None, + &default.tree.props, + ); + merge_child_props( + &mut root, + &records, + &definitions, + &dimensions, + viewport, + effect.map_or("default", |definition| definition.default.as_str()), + &[], + ); + + let mut selectors = BTreeMap::new(); + let mut transition_props = BTreeSet::new(); + if let Some(effect) = effect { + for effect_value in &effect.options { + if effect_value == &effect.default { + continue; + } + let changed = changed_effect_props( + &records, + &definitions, + &dimensions, + viewport, + &effect.default, + effect_value, + ); + if !changed.is_empty() { + transition_props.extend(changed.keys().cloned()); + selectors.insert(format!("_{effect_value}"), changed); + } + } + } + let transition = transition(snapshot, &default.node_id, &transition_props); + let component_name = legacy_component_name(set.typed_view().name().unwrap_or("Component")); + let code = mark_node( + &set.id, + render_component( + &component_name, + &dimensions, + &root, + &selectors, + transition.as_ref(), + ), + ); + let mut imports = BTreeSet::new(); + collect_imports(&root, &mut imports); + Ok(Some(CodegenOutput { + tsx: code, + imports: imports.into_iter().collect(), + used_tokens: BTreeSet::new(), + diagnostics: unrepresented_variant_nodes + .into_iter() + .map(|node_id| Diagnostic { + code: "DEVUP_CODEGEN_VARIANT_CHILD_FALLBACK".to_owned(), + message: "non-default variant의 중첩 차이를 default variant 구조로 대체했습니다." + .to_owned(), + node_id: Some(node_id), + severity: Some(DiagnosticSeverity::Warning), + fidelity_impact: Some(FidelityImpact::Lossy), + fallback: Some("default-variant-structure".to_owned()), + ..Diagnostic::default() + }) + .collect(), + source_map: crate::provenance::SourceMap::empty(), + projection_trace: crate::provenance::ProjectionTrace::default(), + fidelity_report: crate::provenance::FidelityReport::default(), + })) +} + +fn definitions(set: &RawNode) -> Vec { + set.typed_view() + .value("componentPropertyDefinitions") + .and_then(Value::as_object) + .into_iter() + .flatten() + .filter(|(_, definition)| definition.get("type").and_then(Value::as_str) == Some("VARIANT")) + .map(|(name, definition)| Definition { + name: name.clone(), + default: definition + .get("defaultValue") + .and_then(Value::as_str) + .unwrap_or_default() + .to_owned(), + options: definition + .get("variantOptions") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(Value::as_str) + .map(str::to_owned) + .collect(), + }) + .collect() +} + +fn project_tree( + snapshot: &Snapshot, + node: &RawNode, + options: &CodegenOptions, + is_render_root: bool, +) -> Result { + let view = node.typed_view(); + let asset = style::asset_kind(snapshot, node); + let inferred_mode = view + .value("inferredAutoLayout") + .and_then(Value::as_object) + .and_then(|layout| layout.get("layoutMode")) + .and_then(Value::as_str); + let inferred_align = |name: &str| { + view.string(name).or_else(|| { + view.value("inferredAutoLayout") + .and_then(Value::as_object) + .and_then(|layout| layout.get(name)) + .and_then(Value::as_str) + }) + }; + let component = if asset == Some(style::AssetKind::SvgMask) { + "Box" + } else if asset.is_some() { + "Image" + } else if view.node_type() == "TEXT" { + "Text" + } else { + match inferred_mode.or_else(|| view.string("layoutMode")) { + Some("GRID") => "Grid", + Some("HORIZONTAL" | "VERTICAL") + if inferred_align("primaryAxisAlignItems") == Some("CENTER") + && inferred_align("counterAxisAlignItems") == Some("CENTER") => + { + "Center" + } + Some("VERTICAL") => "VStack", + Some("HORIZONTAL") => "Flex", + _ => "Box", + } + } + .to_owned(); + let mut props = Vec::new(); + layout::push_layout_props( + snapshot, + node, + &component, + &mut props, + options.root_layout, + is_render_root, + ); + let mut used_tokens = BTreeSet::new(); + style::push_style_props( + snapshot, + node, + &component, + asset, + &mut props, + &mut used_tokens, + &options.variable_tokens, + ); + text::push_text_props( + &view, + &options.text_style_tokens, + &options.variable_tokens, + &mut used_tokens, + &mut props, + ); + if asset.is_some() { + props.retain(|(name, _)| { + !matches!( + name.as_str(), + "alignItems" + | "justifyContent" + | "flexDir" + | "gap" + | "outline" + | "outlineOffset" + | "overflow" + | "p" + | "px" + | "py" + | "pt" + | "pr" + | "pb" + | "pl" + ) + }); + } + let props = props + .into_iter() + .map(|(name, value)| match value { + PropValue::String(value) => (name, value), + }) + .collect(); + let children = if asset.is_some() { + Vec::new() + } else { + view.child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .map(|child| project_tree(snapshot, child, options, false)) + .collect::, _>>()? + }; + let content = (view.node_type() == "TEXT").then(|| { + text::render_text_children( + &view, + &options.text_style_tokens, + &options.variable_tokens, + &mut used_tokens, + 0, + ) + }); + Ok(Tree { + node_id: node.id.clone(), + source_node_ids: BTreeSet::from([node.id.clone()]), + component, + props, + children, + content, + }) +} + +fn merge_source_node_ids( + tree: &mut Tree, + records: &[Record], + path: &[usize], + unrepresented: &mut BTreeSet, +) { + for record in records { + match tree_at(&record.tree, path) { + Some(source) if path.is_empty() => { + tree.source_node_ids.insert(source.node_id.clone()); + + if !same_rendered_structure(tree, source) { + unrepresented.insert(source.node_id.clone()); + } + } + Some(source) if same_rendered_node(tree, source) => { + tree.source_node_ids.insert(source.node_id.clone()); + } + Some(source) => { + unrepresented.insert(source.node_id.clone()); + } + None => { + unrepresented.insert(record.node_id.clone()); + } + } + } + for (index, child) in tree.children.iter_mut().enumerate() { + let mut child_path = path.to_vec(); + child_path.push(index); + merge_source_node_ids(child, records, &child_path, unrepresented); + } +} + +fn same_rendered_node(left: &Tree, right: &Tree) -> bool { + same_rendered_structure(left, right) && left.props == right.props +} + +fn same_rendered_structure(left: &Tree, right: &Tree) -> bool { + left.component == right.component + && left.content == right.content + && left.children.len() == right.children.len() +} + +fn find_record<'a>( + records: &'a [Record], + filters: &BTreeMap, +) -> Option<&'a Record> { + records.iter().find(|record| { + filters + .iter() + .all(|(key, value)| record.values.get(key) == Some(value)) + }) +} + +fn merged_props( + records: &[Record], + definitions: &[Definition], + dimensions: &[Definition], + viewport: Option<&Definition>, + effect_value: &str, + path: Option<&[usize]>, + defaults: &BTreeMap, +) -> BTreeMap { + let mut keys = defaults.keys().cloned().collect::>(); + for record in records { + if let Some(tree) = tree_at(&record.tree, path.unwrap_or_default()) { + keys.extend(tree.props.keys().cloned()); + } + } + keys.into_iter() + .filter_map(|prop| { + let expression = expression_for_prop( + records, + definitions, + dimensions, + viewport, + effect_value, + path.unwrap_or_default(), + &prop, + )?; + Some((prop, render_expression_attr(&expression))) + }) + .collect() +} + +fn merge_child_props( + tree: &mut Tree, + records: &[Record], + definitions: &[Definition], + dimensions: &[Definition], + viewport: Option<&Definition>, + effect_value: &str, + path: &[usize], +) { + for (index, child) in tree.children.iter_mut().enumerate() { + let mut child_path = path.to_vec(); + child_path.push(index); + child.props = merged_props( + records, + definitions, + dimensions, + viewport, + effect_value, + Some(&child_path), + &child.props, + ); + merge_child_props( + child, + records, + definitions, + dimensions, + viewport, + effect_value, + &child_path, + ); + } +} + +fn changed_effect_props( + records: &[Record], + definitions: &[Definition], + dimensions: &[Definition], + viewport: Option<&Definition>, + default_effect: &str, + effect_value: &str, +) -> BTreeMap { + let effect_name = definitions + .iter() + .find(|definition| definition.name.eq_ignore_ascii_case("effect")) + .map(|definition| definition.name.clone()); + let keys = records + .iter() + .filter(|record| { + effect_name.as_ref().is_some_and(|name| { + record.values.get(name).map(String::as_str) == Some(effect_value) + }) + }) + .flat_map(|effect_record| { + let mut filters = effect_record.values.clone(); + if let Some(effect_name) = &effect_name { + filters.insert(effect_name.clone(), default_effect.to_owned()); + } + let base = find_record(records, &filters); + effect_record + .tree + .props + .iter() + .filter(move |(key, value)| { + base.and_then(|record| record.tree.props.get(*key)) != Some(*value) + }) + .map(|(key, _)| key.clone()) + }) + .collect::>(); + keys.into_iter() + .filter_map(|prop| { + let effect = expression_for_prop( + records, + definitions, + dimensions, + viewport, + effect_value, + &[], + &prop, + )?; + Some((prop, effect)) + }) + .collect() +} + +fn expression_for_prop( + records: &[Record], + definitions: &[Definition], + dimensions: &[Definition], + viewport: Option<&Definition>, + effect_value: &str, + path: &[usize], + prop: &str, +) -> Option { + let effect_name = definitions + .iter() + .find(|definition| definition.name.eq_ignore_ascii_case("effect")) + .map(|definition| definition.name.as_str()); + let dependencies = dimensions + .iter() + .filter(|dimension| { + dimension_depends( + records, + definitions, + effect_name, + effect_value, + path, + prop, + dimension, + ) + }) + .collect::>(); + if dependencies.len() == 1 { + let dimension = dependencies[0]; + let values = dimension + .options + .iter() + .map(|option| { + ( + option.clone(), + viewport_expression( + records, + definitions, + effect_name, + effect_value, + path, + prop, + Some((&dimension.name, option)), + viewport, + ), + ) + }) + .collect::>(); + let present = values + .iter() + .filter(|(_, value)| value.is_some()) + .collect::>(); + if present.len() == 1 + && dimension.options.len() == 2 + && let Some(Expression::Literal(value)) = present[0].1.clone() + { + return Some(Expression::Conditional( + dimension.name.clone(), + present[0].0.clone(), + value, + )); + } + return Some(Expression::Variant( + dimension.name.clone(), + values + .into_iter() + .filter_map(|(key, value)| Some((key, value?))) + .collect(), + )); + } + viewport_expression( + records, + definitions, + effect_name, + effect_value, + path, + prop, + None, + viewport, + ) +} + +fn dimension_depends( + records: &[Record], + definitions: &[Definition], + effect_name: Option<&str>, + effect_value: &str, + path: &[usize], + prop: &str, + dimension: &Definition, +) -> bool { + let sets = dimension + .options + .iter() + .map(|option| { + records + .iter() + .filter(|record| { + record.values.get(&dimension.name) == Some(option) + && effect_name.is_none_or(|name| { + record.values.get(name).map(String::as_str) == Some(effect_value) + }) + }) + .map(|record| { + tree_at(&record.tree, path) + .and_then(|tree| tree.props.get(prop)) + .cloned() + }) + .collect::>() + }) + .collect::>(); + let _ = definitions; + sets.iter().skip(1).any(|set| set != &sets[0]) +} + +#[allow(clippy::too_many_arguments)] +fn viewport_expression( + records: &[Record], + definitions: &[Definition], + effect_name: Option<&str>, + effect_value: &str, + path: &[usize], + prop: &str, + dimension: Option<(&str, &String)>, + viewport: Option<&Definition>, +) -> Option { + let lookup = |viewport_value: Option<&str>| { + let filters = definitions + .iter() + .map(|definition| { + let value = if Some(definition.name.as_str()) == effect_name { + effect_value + } else if definition.name.eq_ignore_ascii_case("viewport") { + viewport_value.unwrap_or(&definition.default) + } else if dimension.is_some_and(|(name, _)| name == definition.name) { + dimension + .map(|(_, value)| value.as_str()) + .unwrap_or(&definition.default) + } else { + &definition.default + }; + (definition.name.clone(), value.to_owned()) + }) + .collect::>(); + find_record(records, &filters) + .and_then(|record| tree_at(&record.tree, path)) + .and_then(|tree| tree.props.get(prop)) + .cloned() + }; + let Some(viewport) = viewport else { + return lookup(None).map(Expression::Literal); + }; + let mobile = viewport + .options + .iter() + .find(|value| value.eq_ignore_ascii_case("mobile")) + .and_then(|value| lookup(Some(value))); + let desktop = viewport + .options + .iter() + .find(|value| !value.eq_ignore_ascii_case("mobile")) + .and_then(|value| lookup(Some(value))); + if mobile == desktop { + mobile.or(desktop).map(Expression::Literal) + } else { + Some(Expression::Responsive(mobile, desktop)) + } +} + +fn tree_at<'a>(tree: &'a Tree, path: &[usize]) -> Option<&'a Tree> { + path.iter() + .try_fold(tree, |current, index| current.children.get(*index)) +} + +fn transition( + snapshot: &Snapshot, + default_id: &str, + props: &BTreeSet, +) -> Option<(String, String)> { + let node = snapshot.nodes.get(default_id)?; + let transition = node + .typed_view() + .value("reactions")? + .as_array()? + .iter() + .find_map(|reaction| { + reaction + .get("transition") + .or_else(|| reaction.get("action")?.get("transition")) + })?; + let duration = transition.get("duration")?.as_f64()?; + let easing = transition + .get("easing") + .and_then(|easing| easing.get("type")) + .and_then(Value::as_str) + .unwrap_or("EASE_IN_OUT") + .trim_start_matches("EASE_") + .to_ascii_lowercase() + .replace('_', "-"); + let properties = props + .iter() + .map(|prop| match prop.as_str() { + "bg" => "background", + "boxShadow" => "box-shadow", + value => value, + }) + .collect::>() + .join(","); + Some(( + format!("{}ms ease-{easing}", layout::format_number(duration)), + properties, + )) +} + +fn render_component( + name: &str, + dimensions: &[Definition], + tree: &Tree, + selectors: &BTreeMap>, + transition: Option<&(String, String)>, +) -> String { + let interface = if dimensions.is_empty() { + String::new() + } else { + let fields = dimensions + .iter() + .map(|definition| { + format!( + " {}: {}", + definition.name, + definition + .options + .iter() + .map(|value| format!("'{value}'")) + .collect::>() + .join(" | ") + ) + }) + .collect::>() + .join("\n"); + format!("export interface {name}Props {{\n{fields}\n}}\n\n") + }; + let signature = if dimensions.is_empty() { + format!("export function {name}()") + } else { + let props = dimensions + .iter() + .map(|definition| definition.name.as_str()) + .collect::>() + .join(", "); + format!("export function {name}({{ {props} }}: {name}Props)") + }; + let body = render_tree(tree, selectors, transition, 2); + format!("{interface}{signature} {{\n return (\n{body}\n )\n}}") +} + +fn render_tree( + tree: &Tree, + selectors: &BTreeMap>, + transition: Option<&(String, String)>, + depth: usize, +) -> String { + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let mut rendered_props = Vec::new(); + for (selector, props) in selectors { + let values = props + .iter() + .map(|(name, expression)| { + format!( + "{}\"{name}\": {}", + " ".repeat(depth + 2), + render_expression_value(expression, depth + 2) + ) + }) + .collect::>() + .join(",\n"); + rendered_props.push(format!( + "{child_indent}{selector}={{{{\n{values}\n{child_indent}}}}}" + )); + } + for (name, expression) in &tree.props { + rendered_props.push(format!( + "{child_indent}{name}{}", + indent_attribute_expression(expression, depth + 1) + )); + } + if let Some((value, properties)) = transition { + rendered_props.push(format!("{child_indent}transition=\"{value}\"")); + rendered_props.push(format!("{child_indent}transitionProperty=\"{properties}\"")); + } + let opening = if rendered_props.is_empty() { + format!("{indent}<{}>", tree.component) + } else { + format!( + "{indent}<{}\n{}\n{indent}>", + tree.component, + rendered_props.join("\n") + ) + }; + let mut children = tree + .children + .iter() + .map(|child| render_tree(child, &BTreeMap::new(), None, depth + 1)) + .collect::>(); + if let Some(content) = &tree.content { + children.push( + content + .lines() + .map(|line| format!("{child_indent}{line}")) + .collect::>() + .join("\n"), + ); + } + let rendered = if children.is_empty() { + format!("{opening}\n{indent}", tree.component) + } else { + format!( + "{opening}\n{}\n{indent}", + children.join("\n"), + tree.component + ) + }; + tree.source_node_ids + .iter() + .rev() + .fold(rendered, |rendered, node_id| mark_node(node_id, rendered)) +} + +fn render_expression_attr(expression: &Expression) -> String { + match expression { + Expression::Literal(value) => format!("=\"{value}\""), + Expression::Conditional(prop, option, value) => { + format!("={{{prop} === '{option}' && \"{value}\"}}") + } + _ => format!("={{{}}}", render_expression_value(expression, 0)), + } +} + +fn indent_attribute_expression(expression: &str, depth: usize) -> String { + if !expression.contains('\n') { + return expression.to_owned(); + } + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + expression + .lines() + .enumerate() + .map(|(index, line)| { + if index == 0 { + line.to_owned() + } else if let Some(line) = line.strip_prefix(" ") { + format!("{child_indent}{line}") + } else { + format!("{indent}{line}") + } + }) + .collect::>() + .join("\n") +} + +fn render_expression_value(expression: &Expression, depth: usize) -> String { + match expression { + Expression::Literal(value) => format!("\"{value}\""), + Expression::Responsive(mobile, desktop) => format!( + "[{}, null, null, null, {}]", + mobile + .as_ref() + .map_or("null".to_owned(), |value| format!("\"{value}\"")), + desktop + .as_ref() + .map_or("null".to_owned(), |value| format!("\"{value}\"")) + ), + Expression::Variant(prop, values) => { + let indent = " ".repeat(depth); + let child_indent = " ".repeat(depth + 1); + let lines = values + .iter() + .map(|(key, value)| { + format!( + "{child_indent}{key}: {}", + render_expression_value(value, depth + 1) + ) + }) + .collect::>() + .join(",\n"); + format!("{{\n{lines}\n{indent}}}[{prop}]") + } + Expression::Conditional(prop, option, value) => { + format!("{prop} === '{option}' && \"{value}\"") + } + } +} + +fn collect_imports(tree: &Tree, imports: &mut BTreeSet) { + imports.insert(tree.component.clone()); + for child in &tree.children { + collect_imports(child, imports); + } +} diff --git a/crates/devup-mcp-devup-ui/src/lib.rs b/crates/devup-mcp-devup-ui/src/lib.rs new file mode 100644 index 0000000..2ee3342 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/lib.rs @@ -0,0 +1,4 @@ +pub mod codegen; +pub mod provenance; +pub mod theme; +pub mod validation; diff --git a/crates/devup-mcp-devup-ui/src/provenance.rs b/crates/devup-mcp-devup-ui/src/provenance.rs new file mode 100644 index 0000000..f26f76b --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/provenance.rs @@ -0,0 +1,1598 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use devup_mcp_figma::{DevupError, ErrorCode, FidelityImpact, Snapshot, discover_asset_manifest}; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +use crate::codegen::CodegenOutput; + +const START: &str = "\u{e000}DEVUP_PROVENANCE_START:"; +const END: &str = "\u{e000}DEVUP_PROVENANCE_END:"; +const CLOSE: char = '\u{e001}'; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GeneratedRange { + pub start: usize, + pub end: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProvenanceEntry { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub generated_range: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub json_pointer: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub node_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub property: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub variable_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub style_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub asset_id: Option, + pub resolution: String, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SourceMap { + pub version: u32, + pub entries: Vec, +} + +impl SourceMap { + pub fn empty() -> Self { + Self { + version: 1, + entries: Vec::new(), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ProjectionDisposition { + Emitted, + Flattened, + Ignored, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProjectionTraceEntry { + pub node_id: String, + pub disposition: ProjectionDisposition, + pub reason: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub generated_range: Option, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProjectionTrace { + pub root_node_id: String, + pub entries: Vec, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FidelityCoverage { + pub total: usize, + pub covered: usize, + pub basis_points: u16, +} + +impl FidelityCoverage { + fn new(total: usize, covered: usize) -> Self { + let basis_points = if total == 0 { + 10_000 + } else { + ((covered.min(total) as u128 * 10_000) / total as u128) as u16 + }; + Self { + total, + covered: covered.min(total), + basis_points, + } + } + + pub fn complete(self) -> bool { + self.total == self.covered + } +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FidelityImpactCounts { + pub none: usize, + pub approximated: usize, + pub lossy: usize, + pub failed: usize, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FidelityReport { + pub syntax_valid: bool, + pub nodes: FidelityCoverage, + pub text: FidelityCoverage, + pub variables: FidelityCoverage, + pub typography: FidelityCoverage, + pub assets: FidelityCoverage, + pub layout: FidelityCoverage, + pub impacts: FidelityImpactCounts, +} + +impl FidelityReport { + pub fn strict_compatible(&self) -> bool { + self.syntax_valid + && self.nodes.complete() + && self.text.complete() + && self.variables.complete() + && self.typography.complete() + && self.assets.complete() + && self.layout.complete() + && self.impacts.lossy == 0 + && self.impacts.failed == 0 + } +} + +pub(crate) fn build_projection_trace( + snapshot: &Snapshot, + root_id: &str, + tsx: &str, + source_map: &SourceMap, +) -> ProjectionTrace { + let active = active_nodes(snapshot, root_id); + let emitted = source_map + .entries + .iter() + .filter(|entry| entry.property.is_none() && entry.resolution == "node") + .filter_map(|entry| Some((entry.node_id.clone()?, entry.generated_range.clone()?))) + .collect::>(); + let asset_nodes = discover_asset_manifest(snapshot) + .assets + .into_iter() + .map(|asset| asset.node_id) + .collect::>(); + let mut entries = Vec::new(); + let mut represented_by_parent = BTreeSet::new(); + let mut ignored_by_parent = BTreeSet::new(); + for (node_id, parent_id) in active { + let node = snapshot.nodes.get(&node_id); + let range = emitted.get(&node_id); + let projection = + if node_id == root_id && node.is_some_and(|node| node.node_type == "SECTION") { + Some((ProjectionDisposition::Flattened, "section-root", None)) + } else if let Some(range) = range.filter(|range| range.start < range.end) { + Some(( + ProjectionDisposition::Emitted, + "direct", + Some((*range).clone()), + )) + } else if range.is_some() + || node.is_some_and(|node| node.typed_view().bool("visible") == Some(false)) + { + Some((ProjectionDisposition::Ignored, "hidden", None)) + } else if parent_id + .as_ref() + .is_some_and(|parent_id| ignored_by_parent.contains(parent_id)) + { + Some((ProjectionDisposition::Ignored, "hidden-ancestor", None)) + } else if parent_id.as_ref().is_some_and(|parent_id| { + asset_nodes.contains(parent_id) + || represented_by_parent.contains(parent_id) + || is_variant_component(snapshot, parent_id) + || snapshot.nodes.get(parent_id).is_some_and(|parent| { + parent.node_type == "COMPONENT_SET" && emitted.contains_key(parent_id) + }) + || snapshot.nodes.get(parent_id).is_some_and(|parent| { + parent.node_type == "INSTANCE" + || parent.typed_view().bool("isAsset") == Some(true) + }) + || emitted.get(parent_id).is_some_and(|range| { + range.end <= tsx.len() + && (tsx[range.start..range.end].contains("maskImage=") + || tsx[range.start..range.end].contains(" bool { + let Some(node) = snapshot.nodes.get(node_id) else { + return false; + }; + if node.node_type != "COMPONENT" { + return false; + } + node.typed_view() + .string("parentId") + .and_then(|parent_id| snapshot.nodes.get(parent_id)) + .is_some_and(|parent| parent.node_type == "COMPONENT_SET") + || snapshot.nodes.values().any(|parent| { + parent.node_type == "COMPONENT_SET" + && parent + .typed_view() + .child_ids() + .any(|child| child == node_id) + }) +} + +pub fn validate_fidelity( + snapshot: &Snapshot, + root_id: &str, + output: &CodegenOutput, +) -> Result { + let expected = active_nodes(snapshot, root_id) + .into_iter() + .map(|(node_id, _)| node_id) + .collect::>(); + let mut observed = BTreeSet::new(); + let mut duplicates = Vec::new(); + let mut invalid_ranges = Vec::new(); + for entry in &output.projection_trace.entries { + if !observed.insert(entry.node_id.clone()) { + duplicates.push(entry.node_id.clone()); + } + if let Some(range) = &entry.generated_range + && (range.start >= range.end + || range.end > output.tsx.len() + || !output.tsx.is_char_boundary(range.start) + || !output.tsx.is_char_boundary(range.end)) + { + invalid_ranges.push(entry.node_id.clone()); + } + } + let missing = expected.difference(&observed).cloned().collect::>(); + let unexpected = observed.difference(&expected).cloned().collect::>(); + if !duplicates.is_empty() + || !missing.is_empty() + || !unexpected.is_empty() + || !invalid_ranges.is_empty() + { + return Err(DevupError::with_details( + ErrorCode::DevupCodegenFailed, + "projection trace가 source node를 정확히 한 번씩 설명하지 못했습니다.", + false, + json!({ + "missingNodeIds": missing, + "duplicateNodeIds": duplicates, + "unexpectedNodeIds": unexpected, + "invalidRangeNodeIds": invalid_ranges + }), + )); + } + + let semantic_nodes = semantic_nodes(snapshot, root_id); + let text_nodes = semantic_nodes + .iter() + .filter(|node_id| { + snapshot + .nodes + .get(**node_id) + .is_some_and(|node| node.node_type == "TEXT") + }) + .copied() + .collect::>(); + let text_segments = text_sources(snapshot, &text_nodes); + let mut consumed_text_entries = BTreeSet::new(); + let covered_text = text_segments + .iter() + .filter(|(node_id, characters)| { + output + .source_map + .entries + .iter() + .enumerate() + .find(|(index, entry)| { + !consumed_text_entries.contains(index) + && entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.property.as_deref() == Some("characters") + && entry_range(entry, &output.tsx) + .is_some_and(|source| source_covers_text(source, characters)) + }) + .is_some_and(|(index, _)| consumed_text_entries.insert(index)) + }) + .count(); + let variables = variable_sources(snapshot, &semantic_nodes); + let covered_variables = variables + .iter() + .filter(|(node_id, variable_id)| { + output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.variable_id.as_deref() == Some(variable_id.as_str()) + && entry.resolution == "variable-token" + && entry_range(entry, &output.tsx).is_some_and(|source| { + !source.contains(['<', '>', '\n']) + && source.contains('$') + && source.ends_with('"') + }) + }) + }) + .count(); + let typography = typography_sources(snapshot, &text_nodes); + let covered_typography = typography + .iter() + .filter(|(node_id, style_id)| { + output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(*node_id) + && entry.style_id.as_deref() == Some(*style_id) + && entry.resolution == "style-token" + && entry_range(entry, &output.tsx) + .is_some_and(|source| source.starts_with("typography=\"")) + }) + }) + .count(); + let assets = discover_asset_manifest(snapshot) + .assets + .into_iter() + .filter(|asset| semantic_nodes.contains(asset.node_id.as_str())) + .map(|asset| (asset.node_id, asset.asset_id)) + .collect::>(); + let covered_assets = assets + .iter() + .filter(|(node_id, asset_id)| { + output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.asset_id.as_deref() == Some(asset_id.as_str()) + && entry.resolution == "asset" + && entry_range(entry, &output.tsx).is_some_and(|source| { + source.starts_with("src=\"") + || source.starts_with("maskImage=\"") + || (source.starts_with("bg=\"") && source.contains("url(")) + }) + }) + }) + .count(); + let asset_nodes = snapshot + .nodes + .values() + .filter(|node| projects_as_asset(snapshot, node)) + .map(|node| node.id.clone()) + .collect::>(); + let parents = source_parents(snapshot); + let layout = semantic_nodes + .iter() + .filter(|node_id| !has_asset_ancestor(node_id, &parents, &asset_nodes)) + .flat_map(|node_id| { + LAYOUT_FIELDS.iter().filter_map(|field| { + snapshot + .nodes + .get(*node_id) + .filter(|node| layout_field_is_semantic(snapshot, node, field)) + .map(|_| ((*node_id).to_owned(), (*field).to_owned())) + }) + }) + .collect::>(); + let covered_layout = layout + .iter() + .filter(|(node_id, property)| { + output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.property.as_deref() == Some(property.as_str()) + && entry_range(entry, &output.tsx) + .is_some_and(|source| layout_source_matches(property, source)) + }) + }) + .count(); + let mut impacts = FidelityImpactCounts::default(); + for diagnostic in &output.diagnostics { + match diagnostic.fidelity_impact() { + FidelityImpact::None => impacts.none += 1, + FidelityImpact::Approximated => impacts.approximated += 1, + FidelityImpact::Lossy => impacts.lossy += 1, + FidelityImpact::Failed => impacts.failed += 1, + } + } + Ok(FidelityReport { + syntax_valid: true, + nodes: FidelityCoverage::new(expected.len(), observed.len()), + text: FidelityCoverage::new(text_segments.len(), covered_text), + variables: FidelityCoverage::new(variables.len(), covered_variables), + typography: FidelityCoverage::new(typography.len(), covered_typography), + assets: FidelityCoverage::new(assets.len(), covered_assets), + layout: FidelityCoverage::new(layout.len(), covered_layout), + impacts, + }) +} + +fn has_asset_ancestor( + node_id: &str, + parents: &BTreeMap, + asset_nodes: &BTreeSet, +) -> bool { + let mut parent = parents.get(node_id).map(String::as_str); + while let Some(parent_id) = parent { + if asset_nodes.contains(parent_id) { + return true; + } + parent = parents.get(parent_id).map(String::as_str); + } + false +} + +fn layout_field_is_semantic( + snapshot: &Snapshot, + node: &devup_mcp_figma::RawNode, + field: &str, +) -> bool { + let view = node.typed_view(); + let component_set_parent = view + .string("parentId") + .and_then(|parent_id| snapshot.nodes.get(parent_id)) + .is_some_and(|parent| parent.node_type == "COMPONENT_SET") + || snapshot.nodes.values().any(|parent| { + parent.node_type == "COMPONENT_SET" + && parent + .typed_view() + .child_ids() + .any(|child| child == node.id) + }); + let component_canvas_dimension = matches!(field, "width" | "height") && component_set_parent; + if component_canvas_dimension { + return false; + } + match field { + "layoutMode" => matches!(view.string(field), Some("HORIZONTAL" | "VERTICAL" | "GRID")), + "layoutPositioning" => view.string(field) == Some("ABSOLUTE"), + "width" => { + view.value(field).is_some() + && view + .string("layoutSizingHorizontal") + .is_none_or(|value| value == "FIXED") + } + "height" => { + view.value(field).is_some() + && view + .string("layoutSizingVertical") + .is_none_or(|value| value == "FIXED") + } + "itemSpacing" => { + view.child_ids().count() > 1 + && view.string("primaryAxisAlignItems") != Some("SPACE_BETWEEN") + && !projects_as_asset(snapshot, node) + && view.number(field).is_some_and(|value| value != 0.0) + } + "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" => { + view.number(field).is_some_and(|value| value != 0.0) + } + _ => false, + } +} + +fn projects_as_asset(snapshot: &Snapshot, node: &devup_mcp_figma::RawNode) -> bool { + fn nested(snapshot: &Snapshot, node: &devup_mcp_figma::RawNode) -> bool { + if projects_as_asset(snapshot, node) { + return true; + } + let view = node.typed_view(); + if view.node_type() == "TEXT" || view.child_ids().next().is_some() { + return false; + } + view.value("fills") + .and_then(serde_json::Value::as_array) + .is_some_and(|fills| { + fills.iter().all(|paint| { + paint.get("visible").and_then(serde_json::Value::as_bool) == Some(false) + || paint.get("type").and_then(serde_json::Value::as_str) == Some("SOLID") + }) + }) + } + + let view = node.typed_view(); + if matches!(view.node_type(), "TEXT" | "COMPONENT_SET") + || view + .value("inferredAutoLayout") + .and_then(serde_json::Value::as_object) + .and_then(|layout| layout.get("layoutMode")) + .and_then(serde_json::Value::as_str) + == Some("GRID") + { + return false; + } + if matches!(view.node_type(), "VECTOR" | "STAR" | "POLYGON") + || (view.node_type() == "ELLIPSE" + && view + .value("arcData") + .and_then(|value| value.get("innerRadius")) + .and_then(serde_json::Value::as_f64) + .is_some_and(|value| value != 0.0)) + { + return true; + } + let fills = view.value("fills").and_then(serde_json::Value::as_array); + if view.bool("isAsset") == Some(true) + && fills.is_some_and(|fills| { + (fills.len() == 1 + && fills[0].get("type").and_then(serde_json::Value::as_str) == Some("IMAGE") + && fills[0] + .get("scaleMode") + .and_then(serde_json::Value::as_str) + != Some("TILE")) + || (!fills.is_empty() + && !fills.iter().all(|paint| { + paint.get("type").and_then(serde_json::Value::as_str) == Some("SOLID") + && paint.get("visible").and_then(serde_json::Value::as_bool) + == Some(true) + })) + }) + { + return true; + } + let children = view + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .collect::>(); + if children.is_empty() + || (children.len() == 1 + && !children.iter().all(|child| { + matches!( + child.typed_view().node_type(), + "VECTOR" | "STAR" | "POLYGON" + ) + }) + && matches!( + view.string("layoutMode"), + Some("HORIZONTAL" | "VERTICAL" | "GRID") + )) + { + return false; + } + children.into_iter().all(|child| nested(snapshot, child)) +} + +fn semantic_nodes<'a>(snapshot: &'a Snapshot, root_id: &str) -> BTreeSet<&'a str> { + let mut visible = BTreeSet::new(); + let mut hidden = BTreeSet::new(); + for (node_id, parent_id) in active_nodes(snapshot, root_id) { + let is_hidden = parent_id + .as_ref() + .is_some_and(|parent_id| hidden.contains(parent_id.as_str())) + || snapshot + .nodes + .get(&node_id) + .is_some_and(|node| node.typed_view().bool("visible") == Some(false)); + if is_hidden { + hidden.insert(node_id); + } else if let Some((node_id, _)) = snapshot.nodes.get_key_value(&node_id) { + visible.insert(node_id.as_str()); + } + } + visible +} + +fn variable_sources( + snapshot: &Snapshot, + semantic_nodes: &BTreeSet<&str>, +) -> BTreeSet<(String, String)> { + fn scan(node_id: &str, value: &serde_json::Value, output: &mut BTreeSet<(String, String)>) { + match value { + serde_json::Value::Object(object) => { + if object.get("type").and_then(serde_json::Value::as_str) == Some("VARIABLE_ALIAS") + && let Some(id) = object + .get("id") + .and_then(serde_json::Value::as_str) + .filter(|id| !id.is_empty() && *id != "figma.mixed" && *id != "MIXED") + { + output.insert((node_id.to_owned(), id.to_owned())); + } + for child in object.values() { + scan(node_id, child, output); + } + } + serde_json::Value::Array(values) => { + for child in values { + scan(node_id, child, output); + } + } + _ => {} + } + } + + let mut output = BTreeSet::new(); + for node_id in semantic_nodes { + if let Some(node) = snapshot.nodes.get(*node_id) { + for value in node.fields.values().chain(node.extra.values()) { + scan(node_id, value, &mut output); + } + } + } + output +} + +fn text_sources(snapshot: &Snapshot, text_nodes: &BTreeSet<&str>) -> Vec<(String, String)> { + let mut output = Vec::new(); + for node_id in text_nodes { + let Some(node) = snapshot.nodes.get(*node_id) else { + continue; + }; + let segments = node + .typed_view() + .value("styledTextSegments") + .and_then(serde_json::Value::as_array) + .into_iter() + .flatten() + .filter_map(|segment| { + segment + .get("characters") + .and_then(serde_json::Value::as_str) + }) + .filter(|characters| !characters.is_empty()) + .map(str::to_owned) + .collect::>(); + if segments.is_empty() { + if let Some(characters) = node + .typed_view() + .string("characters") + .filter(|characters| !characters.is_empty()) + { + output.push(((*node_id).to_owned(), characters.to_owned())); + } + } else { + output.extend( + segments + .into_iter() + .map(|characters| ((*node_id).to_owned(), characters)), + ); + } + } + output +} + +fn entry_range<'a>(entry: &ProvenanceEntry, tsx: &'a str) -> Option<&'a str> { + let range = entry.generated_range.as_ref()?; + (range.start < range.end + && range.end <= tsx.len() + && tsx.is_char_boundary(range.start) + && tsx.is_char_boundary(range.end)) + .then(|| &tsx[range.start..range.end]) +} + +fn source_covers_text(source: &str, characters: &str) -> bool { + if source == encode_jsx_text(characters) { + return true; + } + let fragments = characters + .split(['\r', '\n']) + .map(str::trim) + .filter(|fragment| !fragment.is_empty()); + let mut cursor = 0; + for fragment in fragments { + let encoded = encode_jsx_text(fragment); + let Some(found) = source[cursor..].find(&encoded) else { + return false; + }; + cursor += found + encoded.len(); + } + cursor > 0 && cursor == source.len() +} + +fn encode_jsx_text(input: &str) -> String { + let leading = input + .chars() + .take_while(|character| *character == ' ') + .count(); + let trailing = input + .chars() + .rev() + .take_while(|character| *character == ' ') + .count(); + let middle_end = input.len().saturating_sub(trailing); + let middle = &input[leading..middle_end]; + let mut result = String::new(); + if leading > 0 { + result.push_str(&format!("{{\"{}\"}}", " ".repeat(leading))); + } + let mut characters = middle.chars().peekable(); + while let Some(character) = characters.next() { + match character { + '{' => result.push_str("{\"{\"}"), + '}' => result.push_str("{\"}\"}"), + '&' => result.push_str("{\"&\"}"), + '<' => result.push_str("{\"<\"}"), + '>' => result.push_str("{\">\"}"), + '\'' => result.push_str("{\"'\"}"), + '\r' => { + if characters.peek() == Some(&'\n') { + characters.next(); + } + if characters.peek().is_none() { + result.push_str("{\" \"}"); + } else { + result.push_str("
    "); + } + } + '\n' => { + if characters.peek().is_none() { + result.push_str("{\" \"}"); + } else { + result.push_str("
    "); + } + } + value => result.push(value), + } + } + if trailing > 0 { + result.push_str(&format!("{{\"{}\"}}", " ".repeat(trailing))); + } + result +} + +fn layout_source_matches(property: &str, source: &str) -> bool { + let is_prop = |name: &str| { + source.starts_with(&format!("{name}=\"")) + || source.starts_with(&format!("{name}={{")) + || source.starts_with(&format!("\"{name}\":")) + }; + match property { + "layoutMode" => { + is_prop("flexDir") || matches!(source, "VStack" | "Flex" | "Grid" | "Center") + } + "layoutPositioning" => is_prop("pos"), + "width" => is_prop("w") || is_prop("boxSize") || is_prop("aspectRatio"), + "height" => is_prop("h") || is_prop("boxSize"), + "itemSpacing" => is_prop("gap") || is_prop("m"), + "paddingTop" => is_prop("p") || is_prop("py") || is_prop("pt"), + "paddingRight" => is_prop("p") || is_prop("px") || is_prop("pr"), + "paddingBottom" => is_prop("p") || is_prop("py") || is_prop("pb"), + "paddingLeft" => is_prop("p") || is_prop("px") || is_prop("pl"), + _ => false, + } +} + +fn active_nodes(snapshot: &Snapshot, root_id: &str) -> Vec<(String, Option)> { + let mut output = Vec::new(); + let Some(root) = snapshot.nodes.get(root_id) else { + return output; + }; + output.push((root_id.to_owned(), None)); + let start = if root.node_type == "SECTION" { + root.typed_view().child_ids().next() + } else { + Some(root_id) + }; + let Some(start) = start else { + return output; + }; + let mut stack = if start == root_id { + let mut children = root + .typed_view() + .child_ids() + .map(|child| (child.to_owned(), Some(root_id.to_owned()))) + .collect::>(); + children.reverse(); + children + } else { + vec![(start.to_owned(), Some(root_id.to_owned()))] + }; + let mut seen = BTreeSet::from([root_id.to_owned()]); + while let Some((node_id, parent_id)) = stack.pop() { + if !seen.insert(node_id.clone()) { + continue; + } + let Some(node) = snapshot.nodes.get(&node_id) else { + continue; + }; + output.push((node_id.clone(), parent_id)); + let mut children = node.typed_view().child_ids().collect::>(); + children.reverse(); + for child_id in children { + stack.push((child_id.to_owned(), Some(node_id.clone()))); + } + } + output +} + +fn typography_sources<'a>( + snapshot: &'a Snapshot, + text_nodes: &BTreeSet<&'a str>, +) -> BTreeSet<(&'a str, &'a str)> { + let mut styles = BTreeSet::new(); + for node_id in text_nodes { + let Some(node) = snapshot.nodes.get(*node_id) else { + continue; + }; + if let Some(style_id) = node + .typed_view() + .string("textStyleId") + .filter(|id| !id.is_empty()) + { + styles.insert((*node_id, style_id)); + } + if let Some(segments) = node + .typed_view() + .value("styledTextSegments") + .and_then(serde_json::Value::as_array) + { + for style_id in segments.iter().filter_map(|segment| { + segment + .get("textStyleId") + .and_then(serde_json::Value::as_str) + .filter(|id| !id.is_empty()) + }) { + styles.insert((*node_id, style_id)); + } + } + } + styles +} + +const LAYOUT_FIELDS: &[&str] = &[ + "layoutMode", + "layoutPositioning", + "width", + "height", + "itemSpacing", + "paddingTop", + "paddingRight", + "paddingBottom", + "paddingLeft", +]; + +pub(crate) fn mark_node(node_id: &str, rendered: String) -> String { + format!("{START}{node_id}{CLOSE}{rendered}{END}{node_id}{CLOSE}") +} + +pub(crate) fn finalize_tsx( + marked: &str, + snapshot: &Snapshot, + variable_tokens: &BTreeMap, + style_tokens: &BTreeMap, +) -> (String, SourceMap) { + let (tsx, node_ranges) = strip_markers(marked); + let emitted_ranges = node_ranges + .iter() + .cloned() + .collect::>(); + let mut assets_by_node = BTreeMap::>::new(); + for asset in discover_asset_manifest(snapshot).assets { + assets_by_node + .entry(asset.node_id.clone()) + .or_default() + .push(asset); + } + let mut entries = Vec::new(); + for (node_id, range) in node_ranges { + let Some(node) = snapshot.nodes.get(&node_id) else { + continue; + }; + entries.push(ProvenanceEntry { + generated_range: Some(range.clone()), + json_pointer: None, + node_id: Some(node_id.clone()), + property: None, + variable_id: None, + style_id: None, + asset_id: None, + resolution: "node".to_owned(), + }); + if node.node_type == "COMPONENT_SET" { + continue; + } + let node_source = &tsx[range.start..range.end]; + let Some(open_relative) = node_source.find('<') else { + continue; + }; + let Some(close_relative) = node_source[open_relative..].find('>') else { + continue; + }; + let opening_end = open_relative + close_relative + 1; + let opening = &node_source[open_relative..opening_end]; + let component_start = open_relative + 1; + let component_end = opening[1..] + .find(|character: char| character.is_whitespace() || matches!(character, '>' | '/')) + .map_or(open_relative + opening.len(), |offset| { + open_relative + offset + 1 + }); + if component_end > component_start { + entries.push(generated_entry( + range.start + component_start, + range.start + component_end, + &node_id, + "type", + None, + None, + "exact", + )); + if matches!( + node.typed_view().string("layoutMode"), + Some("HORIZONTAL" | "VERTICAL" | "GRID") + ) { + entries.push(generated_entry( + range.start + component_start, + range.start + component_end, + &node_id, + "layoutMode", + None, + None, + "raw-fallback", + )); + } + } + + let mut selector_properties = BTreeSet::new(); + if let Some(selector) = non_default_variant_selector(snapshot, node) { + for (prop, property) in PROP_SOURCES { + let Some((start, end)) = selector_prop_range(opening, &selector, prop) else { + continue; + }; + selector_properties.insert(*property); + entries.push(generated_entry( + range.start + open_relative + start, + range.start + open_relative + end, + &node_id, + property, + None, + None, + "variant-selector", + )); + } + } + + for (prop, property) in PROP_SOURCES { + if selector_properties.contains(property) { + continue; + } + let needle = format!("{prop}=\""); + let Some(start) = find_prop(opening, &needle) else { + let expression = format!("{prop}={{"); + if let Some(start) = find_prop(opening, &expression) { + entries.push(generated_entry( + range.start + open_relative + start, + range.start + open_relative + start + expression.len(), + &node_id, + property, + None, + None, + "raw-fallback", + )); + } + continue; + }; + let value_start = start + needle.len(); + let Some(value_end) = opening[value_start..].find('"') else { + continue; + }; + let end = value_start + value_end + 1; + let value = &opening[value_start..value_start + value_end]; + let variable_id = find_resource_id(value, variable_tokens, '$'); + let style_id = (*prop == "typography") + .then(|| { + style_tokens + .iter() + .find_map(|(id, token)| (token == value).then(|| id.clone())) + }) + .flatten(); + let resolution = if variable_id.is_some() { + "variable-token" + } else if style_id.is_some() { + "style-token" + } else { + "raw-fallback" + }; + entries.push(generated_entry( + range.start + open_relative + start, + range.start + open_relative + end, + &node_id, + property, + variable_id, + style_id, + resolution, + )); + } + + if let Some(asset) = assets_by_node + .get(&node_id) + .and_then(|assets| assets.first()) + && let Some((start, end)) = asset_prop_range(opening) + { + entries.push(ProvenanceEntry { + generated_range: Some(GeneratedRange { + start: range.start + open_relative + start, + end: range.start + open_relative + end, + }), + json_pointer: None, + node_id: Some(node_id.clone()), + property: Some(asset.field.clone()), + variable_id: None, + style_id: None, + asset_id: Some(asset.asset_id.clone()), + resolution: "asset".to_owned(), + }); + } + + if node.node_type == "TEXT" { + add_text_entries( + &tsx, + &range, + &node_id, + node, + variable_tokens, + style_tokens, + &mut entries, + ); + } + } + add_flattened_resource_entries( + &tsx, + snapshot, + &emitted_ranges, + variable_tokens, + &assets_by_node, + &mut entries, + ); + entries.sort_by(|left, right| { + let left_range = left.generated_range.as_ref(); + let right_range = right.generated_range.as_ref(); + left_range + .map(|range| (range.start, range.end)) + .cmp(&right_range.map(|range| (range.start, range.end))) + .then_with(|| left.node_id.cmp(&right.node_id)) + .then_with(|| left.property.cmp(&right.property)) + }); + ( + tsx, + SourceMap { + version: 1, + entries, + }, + ) +} + +fn add_flattened_resource_entries( + tsx: &str, + snapshot: &Snapshot, + emitted_ranges: &BTreeMap, + variable_tokens: &BTreeMap, + assets_by_node: &BTreeMap>, + entries: &mut Vec, +) { + let parents = source_parents(snapshot); + let all_nodes = snapshot + .nodes + .keys() + .map(String::as_str) + .collect::>(); + for (node_id, variable_id) in variable_sources(snapshot, &all_nodes) { + if entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.variable_id.as_deref() == Some(variable_id.as_str()) + && entry.resolution == "variable-token" + }) { + continue; + } + let Some(token) = variable_tokens.get(&variable_id) else { + continue; + }; + let needle = format!("${token}"); + let mut represented_by = Some(node_id.as_str()); + while let Some(candidate_id) = represented_by { + if let Some(range) = emitted_ranges.get(candidate_id) { + let source = &tsx[range.start..range.end]; + if let Some((start, end)) = token_prop_range(source, &needle) { + entries.push(generated_entry( + range.start + start, + range.start + end, + &node_id, + variable_property(snapshot, &node_id, &variable_id), + Some(variable_id.clone()), + None, + "variable-token", + )); + break; + } + } + represented_by = parents.get(candidate_id).map(String::as_str); + } + } + + for (node_id, assets) in assets_by_node { + for asset in assets { + if entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(node_id.as_str()) + && entry.asset_id.as_deref() == Some(asset.asset_id.as_str()) + && entry.resolution == "asset" + }) { + continue; + } + let mut represented_by = parents.get(node_id.as_str()).map(String::as_str); + while let Some(candidate_id) = represented_by { + if let Some(range) = emitted_ranges.get(candidate_id) { + let source = &tsx[range.start..range.end]; + if let Some((start, end)) = asset_range_in_node_source(source) { + entries.push(ProvenanceEntry { + generated_range: Some(GeneratedRange { + start: range.start + start, + end: range.start + end, + }), + json_pointer: None, + node_id: Some(node_id.clone()), + property: Some(asset.field.clone()), + variable_id: None, + style_id: None, + asset_id: Some(asset.asset_id.clone()), + resolution: "asset".to_owned(), + }); + break; + } + } + represented_by = parents.get(candidate_id).map(String::as_str); + } + } + } +} + +fn source_parents(snapshot: &Snapshot) -> BTreeMap { + let mut parents = BTreeMap::new(); + for node in snapshot.nodes.values() { + for child_id in node.typed_view().child_ids() { + parents + .entry(child_id.to_owned()) + .or_insert_with(|| node.id.clone()); + } + } + for node in snapshot.nodes.values() { + if let Some(parent_id) = node.typed_view().string("parentId") { + parents + .entry(node.id.clone()) + .or_insert_with(|| parent_id.to_owned()); + } + } + parents +} + +fn variable_property<'a>(snapshot: &'a Snapshot, node_id: &str, variable_id: &str) -> &'a str { + fn contains_alias(value: &serde_json::Value, variable_id: &str) -> bool { + match value { + serde_json::Value::Object(object) => { + (object.get("type").and_then(serde_json::Value::as_str) == Some("VARIABLE_ALIAS") + && object.get("id").and_then(serde_json::Value::as_str) == Some(variable_id)) + || object + .values() + .any(|value| contains_alias(value, variable_id)) + } + serde_json::Value::Array(values) => values + .iter() + .any(|value| contains_alias(value, variable_id)), + _ => false, + } + } + + let Some(node) = snapshot.nodes.get(node_id) else { + return "boundVariables"; + }; + for field in ["fills", "strokes", "effects", "boundVariables"] { + if node + .typed_view() + .value(field) + .is_some_and(|value| contains_alias(value, variable_id)) + { + return field; + } + } + node.fields + .iter() + .chain(&node.extra) + .find_map(|(field, value)| contains_alias(value, variable_id).then_some(field.as_str())) + .unwrap_or("boundVariables") +} + +fn non_default_variant_selector( + snapshot: &Snapshot, + node: &devup_mcp_figma::RawNode, +) -> Option { + let parent = snapshot.nodes.get(node.typed_view().string("parentId")?)?; + if parent.node_type != "COMPONENT_SET" { + return None; + } + let definitions = parent + .typed_view() + .value("componentPropertyDefinitions")? + .as_object()?; + let (effect_name, definition) = definitions.iter().find(|(name, definition)| { + name.eq_ignore_ascii_case("effect") + && definition.get("type").and_then(serde_json::Value::as_str) == Some("VARIANT") + })?; + let default = definition + .get("defaultValue") + .and_then(serde_json::Value::as_str)?; + let value = node + .typed_view() + .value("variantProperties")? + .get(effect_name)? + .as_str()?; + (value != default).then(|| format!("_{value}")) +} + +fn selector_prop_range(opening: &str, selector: &str, prop: &str) -> Option<(usize, usize)> { + let selector_needle = format!("{selector}={{{{"); + let selector_start = find_prop(opening, &selector_needle)?; + let block = &opening[selector_start..]; + let mut depth = 0_u32; + let mut quoted = false; + let mut escaped = false; + let mut block_end = None; + for (offset, character) in block.char_indices() { + if quoted { + if escaped { + escaped = false; + } else if character == '\\' { + escaped = true; + } else if character == '"' { + quoted = false; + } + continue; + } + match character { + '"' => quoted = true, + '{' => depth += 1, + '}' if depth > 0 => { + depth -= 1; + if depth == 0 { + block_end = Some(offset + character.len_utf8()); + break; + } + } + _ => {} + } + } + let block = &block[..block_end?]; + let needle = format!("\"{prop}\":"); + let relative = block.find(&needle)?; + Some(( + selector_start + relative, + selector_start + relative + needle.len(), + )) +} + +const PROP_SOURCES: &[(&str, &str)] = &[ + ("alignContent", "textAlignVertical"), + ("alignItems", "counterAxisAlignItems"), + ("aspectRatio", "targetAspectRatio"), + ("bg", "fills"), + ("border", "strokes"), + ("borderBottom", "strokes"), + ("borderLeft", "strokes"), + ("borderRight", "strokes"), + ("borderTop", "strokes"), + ("borderRadius", "cornerRadius"), + ("bottom", "y"), + ("boxSize", "width"), + ("boxSize", "height"), + ("color", "fills"), + ("flex", "layoutGrow"), + ("flexDir", "layoutMode"), + ("fontFamily", "fontName"), + ("fontSize", "fontSize"), + ("fontStyle", "fontName"), + ("fontWeight", "fontWeight"), + ("gap", "itemSpacing"), + ("h", "height"), + ("justifyContent", "primaryAxisAlignItems"), + ("left", "x"), + ("letterSpacing", "letterSpacing"), + ("lineHeight", "lineHeight"), + ("m", "itemSpacing"), + ("maxH", "maxHeight"), + ("maxW", "maxWidth"), + ("minH", "minHeight"), + ("minW", "minWidth"), + ("opacity", "opacity"), + ("overflow", "clipsContent"), + ("p", "paddingTop"), + ("p", "paddingRight"), + ("p", "paddingBottom"), + ("p", "paddingLeft"), + ("pb", "paddingBottom"), + ("pl", "paddingLeft"), + ("pos", "layoutPositioning"), + ("pr", "paddingRight"), + ("pt", "paddingTop"), + ("px", "paddingLeft"), + ("px", "paddingRight"), + ("py", "paddingTop"), + ("py", "paddingBottom"), + ("right", "x"), + ("textAlign", "textAlignHorizontal"), + ("top", "y"), + ("typography", "textStyleId"), + ("w", "width"), + ("whiteSpace", "textAutoResize"), + ("wordBreak", "characters"), +]; + +fn add_text_entries( + tsx: &str, + range: &GeneratedRange, + node_id: &str, + node: &devup_mcp_figma::RawNode, + variable_tokens: &BTreeMap, + style_tokens: &BTreeMap, + entries: &mut Vec, +) { + let source = &tsx[range.start..range.end]; + let view = node.typed_view(); + let mut text_segments = view + .value("styledTextSegments") + .and_then(serde_json::Value::as_array) + .into_iter() + .flatten() + .filter_map(|segment| { + segment + .get("characters") + .and_then(serde_json::Value::as_str) + }) + .filter(|characters| !characters.is_empty()) + .collect::>(); + if text_segments.is_empty() + && let Some(characters) = view + .string("characters") + .filter(|characters| !characters.is_empty()) + { + text_segments.push(characters); + } + let mut cursor = 0; + for characters in text_segments { + if let Some((start, end)) = find_text_span(source, characters, cursor) { + entries.push(generated_entry( + range.start + start, + range.start + end, + node_id, + "characters", + None, + None, + "exact", + )); + cursor = end; + } + } + for (variable_id, token) in variable_tokens { + let needle = format!("${token}"); + for start in match_indices(source, &needle) { + let prop_start = source[..start] + .rfind(|character: char| character.is_whitespace() || character == '<') + .map_or(start, |offset| offset + 1); + let prop_end = source[start..] + .find('"') + .map_or(start + needle.len(), |offset| start + offset + 1); + entries.push(generated_entry( + range.start + prop_start, + range.start + prop_end, + node_id, + "styledTextSegments", + Some(variable_id.clone()), + None, + "variable-token", + )); + } + } + for (style_id, token) in style_tokens { + let needle = format!("typography=\"{token}\""); + for start in match_indices(source, &needle) { + entries.push(generated_entry( + range.start + start, + range.start + start + needle.len(), + node_id, + "styledTextSegments", + None, + Some(style_id.clone()), + "style-token", + )); + } + } +} + +fn find_text_span(source: &str, characters: &str, search_start: usize) -> Option<(usize, usize)> { + let rendered = encode_jsx_text(characters); + if let Some(start) = source[search_start..].find(&rendered) { + let start = search_start + start; + return Some((start, start + rendered.len())); + } + let fragments = characters + .split(['\r', '\n']) + .map(str::trim) + .filter(|fragment| !fragment.is_empty()) + .map(encode_jsx_text) + .collect::>(); + let mut cursor = search_start; + let mut start = None; + let mut end = None; + for fragment in fragments { + let found = source[cursor..].find(&fragment)? + cursor; + start.get_or_insert(found); + end = Some(found + fragment.len()); + cursor = found + fragment.len(); + } + Some((start?, end?)) +} + +fn asset_prop_range(opening: &str) -> Option<(usize, usize)> { + for prop in ["src", "maskImage", "bg"] { + let needle = format!("{prop}=\""); + let Some(start) = find_prop(opening, &needle) else { + continue; + }; + let value_start = start + needle.len(); + let Some(value_end) = opening[value_start..].find('"') else { + continue; + }; + let end = value_start + value_end + 1; + if prop != "bg" || opening[value_start..value_start + value_end].contains("url(") { + return Some((start, end)); + } + } + None +} + +fn asset_range_in_node_source(source: &str) -> Option<(usize, usize)> { + let opening_start = source.find('<')?; + let opening_end = opening_start + source[opening_start..].find('>')? + 1; + let (start, end) = asset_prop_range(&source[opening_start..opening_end])?; + Some((opening_start + start, opening_start + end)) +} + +fn token_prop_range(source: &str, needle: &str) -> Option<(usize, usize)> { + let token_start = source.find(needle)?; + let prop_start = source[..token_start] + .rfind(|character: char| character.is_whitespace() || character == '<') + .map_or(token_start, |offset| offset + 1); + let prop_end = source[token_start..] + .find('"') + .map_or(token_start + needle.len(), |offset| { + token_start + offset + 1 + }); + Some((prop_start, prop_end)) +} + +fn find_resource_id( + value: &str, + tokens: &BTreeMap, + prefix: char, +) -> Option { + tokens.iter().find_map(|(id, token)| { + let needle = format!("{prefix}{token}"); + match_indices(value, &needle) + .into_iter() + .any(|start| { + value[start + needle.len()..] + .chars() + .next() + .is_none_or(|character| !is_token_character(character)) + }) + .then(|| id.clone()) + }) +} + +fn find_prop(opening: &str, needle: &str) -> Option { + match_indices(opening, needle).into_iter().find(|start| { + *start > 0 + && opening[..*start] + .chars() + .next_back() + .is_some_and(char::is_whitespace) + }) +} + +fn is_token_character(character: char) -> bool { + character.is_alphanumeric() || matches!(character, '_' | '-') +} + +fn match_indices(source: &str, needle: &str) -> Vec { + let mut result = Vec::new(); + let mut offset = 0; + while let Some(found) = source[offset..].find(needle) { + let absolute = offset + found; + result.push(absolute); + offset = absolute + needle.len(); + } + result +} + +fn generated_entry( + start: usize, + end: usize, + node_id: &str, + property: &str, + variable_id: Option, + style_id: Option, + resolution: &str, +) -> ProvenanceEntry { + ProvenanceEntry { + generated_range: Some(GeneratedRange { start, end }), + json_pointer: None, + node_id: Some(node_id.to_owned()), + property: Some(property.to_owned()), + variable_id, + style_id, + asset_id: None, + resolution: resolution.to_owned(), + } +} + +fn strip_markers(marked: &str) -> (String, Vec<(String, GeneratedRange)>) { + let mut output = String::with_capacity(marked.len()); + let mut stack = Vec::<(String, usize)>::new(); + let mut ranges = Vec::new(); + let mut cursor = 0; + while cursor < marked.len() { + let rest = &marked[cursor..]; + let next_start = rest.find(START); + let next_end = rest.find(END); + let next = match (next_start, next_end) { + (Some(start), Some(end)) => start.min(end), + (Some(start), None) => start, + (None, Some(end)) => end, + (None, None) => { + output.push_str(rest); + break; + } + }; + output.push_str(&rest[..next]); + cursor += next; + let is_start = marked[cursor..].starts_with(START); + let prefix = if is_start { START } else { END }; + cursor += prefix.len(); + let Some(close) = marked[cursor..].find(CLOSE) else { + output.push_str(&marked[cursor - prefix.len()..]); + break; + }; + let node_id = marked[cursor..cursor + close].to_owned(); + cursor += close + CLOSE.len_utf8(); + if is_start { + stack.push((node_id, output.len())); + } else if let Some(index) = stack.iter().rposition(|(id, _)| id == &node_id) { + let (_, start) = stack.remove(index); + ranges.push(( + node_id, + GeneratedRange { + start, + end: output.len(), + }, + )); + } + } + ranges.sort_by(|left, right| { + left.1 + .start + .cmp(&right.1.start) + .then_with(|| right.1.end.cmp(&left.1.end)) + .then_with(|| left.0.cmp(&right.0)) + }); + (output, ranges) +} + +pub(crate) fn json_pointer_segment(value: &str) -> String { + value.replace('~', "~0").replace('/', "~1") +} diff --git a/crates/devup-mcp-devup-ui/src/theme/devup_json.rs b/crates/devup-mcp-devup-ui/src/theme/devup_json.rs new file mode 100644 index 0000000..e46ea93 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/theme/devup_json.rs @@ -0,0 +1,623 @@ +use std::collections::{BTreeMap, BTreeSet, HashSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; +use sha2::{Digest, Sha256}; + +use devup_mcp_figma::{DevupError, Diagnostic, DiagnosticSeverity, ErrorCode, UpstreamResult}; + +use super::tokens::{normalize_token, variable_token}; +use crate::provenance::{ProvenanceEntry, SourceMap, json_pointer_segment}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ThemeScope { + Node, + Page, + File, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Completeness { + FullLocalPlusUsedRemote, + UsedTokens, + ResolvedValuesOnly, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThemeCounts { + pub collections: usize, + pub variables: usize, + pub styles: usize, + pub modes: usize, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VariableMode { + pub mode_id: String, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VariableCollection { + pub id: String, + pub name: String, + pub default_mode_id: String, + pub modes: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VariableDefinition { + pub id: String, + pub name: String, + pub resolved_type: String, + pub variable_collection_id: String, + #[serde(default)] + pub code_syntax: BTreeMap, + #[serde(default)] + pub values_by_mode: BTreeMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VariableStyle { + pub id: String, + pub name: String, + pub style_type: String, + pub value: Value, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VariableSnapshot { + #[serde(default)] + pub collections: Vec, + #[serde(default)] + pub variables: Vec, + #[serde(default)] + pub styles: Vec, + #[serde(default)] + pub used_remote_variables: Vec, + #[serde(default)] + pub used_variable_ids: Vec, + #[serde(default)] + pub used_style_ids: Vec, + #[serde(default)] + pub local_complete: bool, + #[serde(default)] + pub used_remote_complete: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThemeOutput { + pub json: String, + pub counts: ThemeCounts, + pub completeness: Completeness, + pub diagnostics: Vec, + pub conflicts: Vec, + pub unresolved_variables: Vec, + pub source_map: SourceMap, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThemeUnresolvedVariable { + pub variable_id: String, + pub mode_id: Option, + pub reason: String, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ThemeVariableSource { + Local, + UsedRemote, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThemeConflictCandidate { + pub variable_id: String, + pub collection_id: String, + pub collection_name: String, + pub raw_name: String, + pub mode_id: String, + pub source: ThemeVariableSource, + pub value_hash: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThemeConflict { + pub token: String, + pub mode: String, + pub kind: String, + pub winner_variable_id: String, + pub candidates: Vec, +} + +#[derive(Debug, Clone, Copy)] +struct VariableCandidate<'a> { + variable: &'a VariableDefinition, + source: ThemeVariableSource, +} + +#[derive(Debug, Clone)] +struct ProjectedVariable { + variable_id: String, + collection_id: String, + collection_name: String, + raw_name: String, + mode_id: String, + source: ThemeVariableSource, + value: Value, + resolution: String, +} + +pub fn generate_devup_json( + snapshot: &VariableSnapshot, + scope: ThemeScope, +) -> Result { + let mut diagnostics = Vec::new(); + let mut conflicts = Vec::new(); + let mut unresolved_variables = Vec::new(); + let mut source_entries = Vec::new(); + let collections = snapshot + .collections + .iter() + .map(|collection| (collection.id.as_str(), collection)) + .collect::>(); + let mut variable_candidates = snapshot + .variables + .iter() + .map(|variable| VariableCandidate { + variable, + source: ThemeVariableSource::Local, + }) + .chain( + snapshot + .used_remote_variables + .iter() + .map(|variable| VariableCandidate { + variable, + source: ThemeVariableSource::UsedRemote, + }), + ) + .collect::>(); + variable_candidates.sort_by(|left, right| { + let left_collection = collections + .get(left.variable.variable_collection_id.as_str()) + .map(|collection| collection.name.as_str()) + .unwrap_or_default(); + let right_collection = collections + .get(right.variable.variable_collection_id.as_str()) + .map(|collection| collection.name.as_str()) + .unwrap_or_default(); + let left_explicit = has_web_syntax(left.variable); + let right_explicit = has_web_syntax(right.variable); + right_explicit + .cmp(&left_explicit) + .then_with(|| left.source.cmp(&right.source)) + .then_with(|| left_collection.cmp(right_collection)) + .then_with(|| left.variable.name.cmp(&right.variable.name)) + .then_with(|| left.variable.id.cmp(&right.variable.id)) + }); + let mut variables = BTreeMap::new(); + for candidate in &variable_candidates { + variables + .entry(candidate.variable.id.as_str()) + .or_insert(candidate.variable); + } + let selected_variable_ids = selected_variable_ids(snapshot, scope, &variables); + if let Some(selected) = &selected_variable_ids { + variable_candidates.retain(|candidate| selected.contains(&candidate.variable.id)); + } + let variable_count = variable_candidates.len(); + let mut projected = BTreeMap::<(String, String, String), Vec>::new(); + let mut colors: BTreeMap> = BTreeMap::new(); + let mut lengths: BTreeMap> = BTreeMap::new(); + + for candidate in variable_candidates { + let variable = candidate.variable; + let Some(collection) = collections.get(variable.variable_collection_id.as_str()) else { + unresolved_variables.push(ThemeUnresolvedVariable { + variable_id: variable.id.clone(), + mode_id: None, + reason: "collection-missing".to_owned(), + }); + diagnostics.push(Diagnostic { + code: "DEVUP_THEME_COLLECTION_MISSING".to_owned(), + message: format!("변수 '{}'의 collection을 찾지 못했습니다.", variable.name), + node_id: None, + severity: Some(DiagnosticSeverity::Warning), + resource_kind: Some("variable".to_owned()), + resource_id: Some(variable.id.clone()), + recoverable: Some(true), + ..Diagnostic::default() + }); + continue; + }; + let token = variable_token( + &variable.name, + variable.code_syntax.get("WEB").map(String::as_str), + ); + for mode in &collection.modes { + let mut visiting = HashSet::new(); + let Some(value) = resolve_value(variable, &mode.mode_id, &variables, &mut visiting) + else { + unresolved_variables.push(ThemeUnresolvedVariable { + variable_id: variable.id.clone(), + mode_id: Some(mode.mode_id.clone()), + reason: "alias-cycle-or-missing-target".to_owned(), + }); + diagnostics.push(Diagnostic { + code: "DEVUP_THEME_ALIAS_CYCLE".to_owned(), + message: format!( + "변수 '{}'의 alias를 안전하게 해석하지 못했습니다.", + variable.name + ), + node_id: None, + severity: Some(DiagnosticSeverity::Warning), + resource_kind: Some("variable".to_owned()), + resource_id: Some(variable.id.clone()), + recoverable: Some(true), + ..Diagnostic::default() + }); + continue; + }; + let mode_name = normalize_token(&mode.name); + let projection = match variable.resolved_type.as_str() { + "COLOR" => color_value(value).map(|color| ("color", Value::String(color))), + "FLOAT" => value + .as_f64() + .map(|number| ("length", Value::String(format_px(number)))), + _ => None, + }; + if let Some((kind, value)) = projection { + projected + .entry((kind.to_owned(), mode_name, token.clone())) + .or_default() + .push(ProjectedVariable { + variable_id: variable.id.clone(), + collection_id: variable.variable_collection_id.clone(), + collection_name: collection.name.clone(), + raw_name: variable.name.clone(), + mode_id: mode.mode_id.clone(), + source: candidate.source, + value, + resolution: if variable + .values_by_mode + .get(&mode.mode_id) + .and_then(|value| value.get("type")) + .and_then(Value::as_str) + == Some("VARIABLE_ALIAS") + { + "alias".to_owned() + } else { + "variable".to_owned() + }, + }); + } + } + } + + for ((kind, mode, token), candidates) in projected { + let Some(winner) = candidates.first() else { + continue; + }; + match kind.as_str() { + "color" => { + colors + .entry(mode.clone()) + .or_default() + .insert(token.clone(), winner.value.clone()); + } + "length" => { + lengths + .entry(mode.clone()) + .or_default() + .insert(token.clone(), winner.value.clone()); + } + _ => continue, + } + let category = if kind == "color" { "colors" } else { "length" }; + source_entries.push(ProvenanceEntry { + generated_range: None, + json_pointer: Some(format!( + "/theme/{}/{}/{}", + category, + json_pointer_segment(&mode), + json_pointer_segment(&token) + )), + node_id: None, + property: None, + variable_id: Some(winner.variable_id.clone()), + style_id: None, + asset_id: None, + resolution: winner.resolution.clone(), + }); + if candidates + .iter() + .skip(1) + .all(|candidate| candidate.value == winner.value) + { + continue; + } + let conflict_candidates = candidates + .iter() + .map(|candidate| ThemeConflictCandidate { + variable_id: candidate.variable_id.clone(), + collection_id: candidate.collection_id.clone(), + collection_name: candidate.collection_name.clone(), + raw_name: candidate.raw_name.clone(), + mode_id: candidate.mode_id.clone(), + source: candidate.source, + value_hash: value_hash(&candidate.value), + }) + .collect::>(); + conflicts.push(ThemeConflict { + token: token.clone(), + mode: mode.clone(), + kind: kind.clone(), + winner_variable_id: winner.variable_id.clone(), + candidates: conflict_candidates, + }); + diagnostics.push(Diagnostic { + code: "DEVUP_THEME_TOKEN_CONFLICT".to_owned(), + message: format!( + "동일한 theme token에 서로 다른 값이 있어 결정적 우선순위를 적용했습니다: token={token}, mode={mode}" + ), + node_id: None, + severity: Some(DiagnosticSeverity::Warning), + property: Some(format!("theme.{kind}.{mode}.{token}")), + resource_kind: Some("variable".to_owned()), + resource_id: Some(winner.variable_id.clone()), + fallback: Some("deterministic-winner".to_owned()), + recoverable: Some(true), + ..Diagnostic::default() + }); + } + + let mut typography = BTreeMap::new(); + let mut shadows = BTreeMap::new(); + let selected_style_ids = (scope != ThemeScope::File && !snapshot.used_style_ids.is_empty()) + .then(|| snapshot.used_style_ids.iter().collect::>()); + let styles = snapshot + .styles + .iter() + .filter(|style| { + selected_style_ids + .as_ref() + .is_none_or(|selected| selected.contains(&style.id)) + }) + .collect::>(); + for style in &styles { + let token = normalize_token(&style.name); + match style.style_type.as_str() { + "TEXT" => { + typography.insert(token.clone(), style.value.clone()); + source_entries.push(ProvenanceEntry { + generated_range: None, + json_pointer: Some(format!( + "/theme/typography/{}", + json_pointer_segment(&token) + )), + node_id: None, + property: None, + variable_id: None, + style_id: Some(style.id.clone()), + asset_id: None, + resolution: "style".to_owned(), + }); + } + "EFFECT" => { + shadows.insert(token.clone(), style.value.clone()); + source_entries.push(ProvenanceEntry { + generated_range: None, + json_pointer: Some(format!( + "/theme/shadow/default/{}", + json_pointer_segment(&token) + )), + node_id: None, + property: None, + variable_id: None, + style_id: Some(style.id.clone()), + asset_id: None, + resolution: "style".to_owned(), + }); + } + _ => {} + } + } + + let mut theme = Map::new(); + theme.insert("colors".to_owned(), json!(colors)); + theme.insert("typography".to_owned(), json!(typography)); + theme.insert("length".to_owned(), json!(lengths)); + theme.insert("shadow".to_owned(), json!({ "default": shadows })); + let mut root = Map::new(); + root.insert("theme".to_owned(), Value::Object(theme)); + let mut output = serde_json::to_string_pretty(&Value::Object(root)).map_err(|_| { + DevupError::new( + ErrorCode::DevupThemeConflict, + "devup.json을 직렬화하지 못했습니다.", + false, + ) + })?; + output.push('\n'); + + let completeness = + if scope == ThemeScope::File && snapshot.local_complete && snapshot.used_remote_complete { + Completeness::FullLocalPlusUsedRemote + } else if variable_count > 0 || !styles.is_empty() { + Completeness::UsedTokens + } else { + Completeness::ResolvedValuesOnly + }; + unresolved_variables.sort_by(|left, right| { + left.variable_id + .cmp(&right.variable_id) + .then_with(|| left.mode_id.cmp(&right.mode_id)) + .then_with(|| left.reason.cmp(&right.reason)) + }); + source_entries.sort_by(|left, right| left.json_pointer.cmp(&right.json_pointer)); + Ok(ThemeOutput { + json: output, + counts: ThemeCounts { + collections: snapshot.collections.len(), + variables: variable_count, + styles: styles.len(), + modes: snapshot + .collections + .iter() + .map(|collection| collection.modes.len()) + .sum(), + }, + completeness, + diagnostics, + conflicts, + unresolved_variables, + source_map: SourceMap { + version: 1, + entries: source_entries, + }, + }) +} + +fn has_web_syntax(variable: &VariableDefinition) -> bool { + variable + .code_syntax + .get("WEB") + .is_some_and(|syntax| !syntax.trim().is_empty()) +} + +fn selected_variable_ids( + snapshot: &VariableSnapshot, + scope: ThemeScope, + variables: &BTreeMap<&str, &VariableDefinition>, +) -> Option> { + if scope == ThemeScope::File || snapshot.used_variable_ids.is_empty() { + return None; + } + let mut selected = snapshot + .used_variable_ids + .iter() + .cloned() + .collect::>(); + let mut pending = selected.iter().cloned().collect::>(); + while let Some(variable_id) = pending.pop() { + let Some(variable) = variables.get(variable_id.as_str()) else { + continue; + }; + for value in variable.values_by_mode.values() { + if value.get("type").and_then(Value::as_str) == Some("VARIABLE_ALIAS") + && let Some(alias_id) = value.get("id").and_then(Value::as_str) + && selected.insert(alias_id.to_owned()) + { + pending.push(alias_id.to_owned()); + } + } + } + Some(selected) +} + +fn value_hash(value: &Value) -> String { + Sha256::digest(serde_json::to_vec(value).unwrap_or_default()) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +pub fn variable_snapshot_from_result( + result: &UpstreamResult, +) -> Result { + find_variable_snapshot(&result.raw).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupThemeConflict, + "Figma MCP 응답에서 변수 snapshot을 찾지 못했습니다.", + false, + ) + }) +} + +fn find_variable_snapshot(value: &Value) -> Option { + if let Ok(snapshot) = serde_json::from_value::(value.clone()) + && (!snapshot.collections.is_empty() + || !snapshot.variables.is_empty() + || !snapshot.styles.is_empty()) + { + return Some(snapshot); + } + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Ok(value) = serde_json::from_str::(text) + && let Some(snapshot) = find_variable_snapshot(&value) + { + return Some(snapshot); + } + object.values().find_map(find_variable_snapshot) + } + Value::Array(values) => values.iter().find_map(find_variable_snapshot), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|value| find_variable_snapshot(&value)), + _ => None, + } +} + +fn resolve_value<'a>( + variable: &'a VariableDefinition, + mode: &str, + variables: &'a BTreeMap<&str, &VariableDefinition>, + visiting: &mut HashSet, +) -> Option<&'a Value> { + if !visiting.insert(variable.id.clone()) { + return None; + } + let value = variable.values_by_mode.get(mode)?; + if value.get("type").and_then(Value::as_str) == Some("VARIABLE_ALIAS") { + let alias = value.get("id").and_then(Value::as_str)?; + let target = variables.get(alias)?; + resolve_value(target, mode, variables, visiting) + } else { + Some(value) + } +} + +fn color_value(value: &Value) -> Option { + let channel = |name: &str| -> Option { + Some((value.get(name)?.as_f64()?.clamp(0.0, 1.0) * 255.0).round() as u8) + }; + let alpha = value.get("a").and_then(Value::as_f64).unwrap_or(1.0); + if alpha < 1.0 { + Some(format!( + "#{:02x}{:02x}{:02x}{:02x}", + channel("r")?, + channel("g")?, + channel("b")?, + (alpha.clamp(0.0, 1.0) * 255.0).round() as u8 + )) + } else { + Some(format!( + "#{:02x}{:02x}{:02x}", + channel("r")?, + channel("g")?, + channel("b")? + )) + } +} + +fn format_px(value: f64) -> String { + if value.fract() == 0.0 { + format!("{value:.0}px") + } else { + format!("{value}px") + } +} diff --git a/crates/devup-mcp-devup-ui/src/theme/mod.rs b/crates/devup-mcp-devup-ui/src/theme/mod.rs new file mode 100644 index 0000000..17d0642 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/theme/mod.rs @@ -0,0 +1,11 @@ +mod devup_json; +mod tokens; + +pub(crate) use tokens::{normalize_token, variable_token}; + +pub use devup_json::{ + Completeness, ThemeConflict, ThemeConflictCandidate, ThemeCounts, ThemeOutput, ThemeScope, + ThemeUnresolvedVariable, ThemeVariableSource, VariableCollection, VariableDefinition, + VariableMode, VariableSnapshot, VariableStyle, generate_devup_json, + variable_snapshot_from_result, +}; diff --git a/crates/devup-mcp-devup-ui/src/theme/tokens.rs b/crates/devup-mcp-devup-ui/src/theme/tokens.rs new file mode 100644 index 0000000..8dd0119 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/theme/tokens.rs @@ -0,0 +1,36 @@ +pub(crate) fn normalize_token(input: &str) -> String { + let words = input + .split(|character: char| !character.is_alphanumeric()) + .filter(|word| !word.is_empty()) + .collect::>(); + let mut output = String::new(); + for (index, word) in words.into_iter().enumerate() { + let mut characters = word.chars(); + if let Some(first) = characters.next() { + if index == 0 { + output.extend(first.to_lowercase()); + } else { + output.extend(first.to_uppercase()); + } + output.extend(characters); + } + } + if output.is_empty() { + "token".to_owned() + } else if output + .chars() + .next() + .is_some_and(|character| character.is_numeric()) + { + format!("_{output}") + } else { + output + } +} + +pub(crate) fn variable_token(name: &str, web_syntax: Option<&str>) -> String { + if let Some(web_syntax) = web_syntax.filter(|value| !value.trim().is_empty()) { + return normalize_token(web_syntax.trim_start_matches('$')); + } + normalize_token(name.rsplit('/').next().unwrap_or(name)) +} diff --git a/crates/devup-mcp-devup-ui/src/validation.rs b/crates/devup-mcp-devup-ui/src/validation.rs new file mode 100644 index 0000000..87f862e --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/validation.rs @@ -0,0 +1,60 @@ +use devup_mcp_figma::{DevupError, ErrorCode}; +use oxc_allocator::Allocator; +use oxc_parser::Parser; +use oxc_span::SourceType; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct TsxValidation { + pub byte_len: usize, + pub statement_count: usize, +} + +pub fn validate_tsx(source: &str) -> Result { + let allocator = Allocator::default(); + let parsed = Parser::new(&allocator, source, SourceType::tsx()).parse(); + // `ParserReturn::diagnostics` (oxc_parser 0.148, was `errors` on 0.96) derefs to + // `Vec`, so this keeps the original "any diagnostic fails validation" + // behavior regardless of severity. + if parsed.diagnostics.is_empty() { + return Ok(TsxValidation { + byte_len: source.len(), + statement_count: parsed.program.body.len(), + }); + } + let errors = parsed + .diagnostics + .iter() + .map(|error| { + // `OxcDiagnosticInner::labels` (oxc_diagnostics 0.148) is a plain `Labels` + // collection (was `Option>` on 0.96), and + // `LabeledSpan::offset`/`len` now return `u32` (was `usize`). + let (start, end) = error + .labels + .first() + .map(|label| { + let start = (label.offset() as usize).min(source.len()); + let end = start.saturating_add(label.len() as usize).min(source.len()); + (start, end) + }) + .unwrap_or((0, 0)); + json!({ + "category": "syntax", + "start": start, + "end": end + }) + }) + .collect::>(); + Err(DevupError::with_details( + ErrorCode::DevupCodegenFailed, + "생성된 DevupUI TSX가 TypeScript JSX 문법 검증을 통과하지 못했습니다.", + false, + json!({ + "errorCount": errors.len(), + "panicked": parsed.panicked, + "errors": errors + }), + )) +} diff --git a/crates/devup-mcp-devup-ui/tests/codegen.rs b/crates/devup-mcp-devup-ui/tests/codegen.rs new file mode 100644 index 0000000..18e3b4b --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/codegen.rs @@ -0,0 +1,452 @@ +use devup_mcp_devup_ui::codegen::{ + CodegenOptions, RootLayout, generate_component, normalize_component_name, +}; +use devup_mcp_figma::{SnapshotChunk, merge_chunks}; +use pretty_assertions::assert_eq; +use serde_json::json; + +fn snapshot() -> devup_mcp_figma::Snapshot { + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["1:1"], + "nodes": [ + { + "id": "1:1", "type": "FRAME", + "fields": { + "name": "[FR-026] 본연체", "childrenIds": ["1:2"], + "layoutMode": "HORIZONTAL", "inferredAutoLayout": {"layoutMode": "HORIZONTAL", "itemSpacing": 8}, + "layoutSizingHorizontal": "FIXED", "layoutSizingVertical": "FIXED", + "width": 320, "height": 80, + "itemSpacing": 8, "paddingTop": 16, "paddingRight": 16, + "paddingBottom": 16, "paddingLeft": 16, + "fills": [{"type": "SOLID", "color": {"r": 1, "g": 1, "b": 1}, "opacity": 1}] + }, + "extra": {}, "fieldErrors": {} + }, + { + "id": "1:2", "type": "TEXT", + "fields": { + "name": "Label", "childrenIds": [], "characters": "안녕 ", + "textTruncation": "DISABLED", + "fontSize": 16, "lineHeight": {"unit": "PIXELS", "value": 24}, + "devupTokens": {"fills": "primary"} + }, + "extra": {}, "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .expect("synthetic snapshot"); + merge_chunks(vec![chunk]).expect("snapshot") +} + +#[test] +fn generates_deterministic_devup_ui_tsx() { + let output = generate_component( + &snapshot(), + "1:1", + &CodegenOptions { + component_name: None, + include_diagnostics: true, + ..CodegenOptions::default() + }, + ) + .expect("codegen"); + + assert_eq!( + output.tsx, + concat!( + "import { Flex, Text } from \"@devup-ui/react\";\n\n", + "export function Fr026본연체() {\n", + " return (\n", + " \n", + " \n", + " 안녕 {\"<\"}Devup{\">\"}\n", + " \n", + " \n", + " );\n", + "}\n" + ) + ); + assert_eq!(output.imports, vec!["Flex", "Text"]); + assert_eq!( + output.used_tokens.into_iter().collect::>(), + ["primary"] + ); +} + +#[test] +fn normalizes_names_to_valid_typescript_identifiers() { + assert_eq!(normalize_component_name("[FR-026] 본연체"), "Fr026본연체"); + assert_eq!(normalize_component_name("123"), "_123"); + assert_eq!(normalize_component_name("---"), "FigmaComponent"); +} + +#[test] +fn records_explicit_diagnostics_for_unsupported_visuals() { + let mut snapshot = snapshot(); + let node = snapshot.nodes.get_mut("1:1").unwrap(); + node.fields.insert("isMask".into(), json!(true)); + node.fields + .insert("layoutPositioning".into(), json!("ABSOLUTE")); + node.fields + .insert("effects".into(), json!([{"type": "BACKGROUND_BLUR"}])); + + let output = generate_component(&snapshot, "1:1", &CodegenOptions::default()).unwrap(); + let codes = output + .diagnostics + .iter() + .map(|diagnostic| diagnostic.code.as_str()) + .collect::>(); + assert!(codes.contains(&"DEVUP_CODEGEN_MASK_FALLBACK")); + assert!(codes.contains(&"DEVUP_CODEGEN_ABSOLUTE_FALLBACK")); + assert!(codes.contains(&"DEVUP_CODEGEN_EFFECT_FALLBACK")); +} + +#[test] +fn escapes_static_jsx_attribute_values() { + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["escape:1"], + "nodes": [{ + "id": "escape:1", + "type": "TEXT", + "fields": { + "name": "Escaped font", + "childrenIds": [], + "characters": "safe", + "fontName": {"family": "A&B\"Font", "style": "Regular"}, + "fontSize": 16, + "fontWeight": 400 + }, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + })) + .expect("synthetic snapshot"); + let snapshot = merge_chunks(vec![chunk]).expect("snapshot"); + + let output = + generate_component(&snapshot, "escape:1", &CodegenOptions::default()).expect("codegen"); + + assert!( + output + .tsx + .contains("fontFamily=\"A&B"Font<UI>\"") + ); +} + +#[test] +fn nested_text_style_uses_typography() { + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["2:1"], + "nodes": [{ + "id": "2:1", + "type": "TEXT", + "fields": { + "name": "Mixed story", + "childrenIds": [], + "characters": "우리 [1. 이름] 왔어?\n다음 줄", + "textTruncation": "DISABLED", + "fills": {"$unsupported": "symbol"}, + "styledTextSegments": [ + { + "characters": "우리 ", + "start": 0, + "end": 3, + "textStyleId": "S:body", + "fontName": {"family": "Pretendard", "style": "Regular"}, + "fontSize": 16, + "fontWeight": 400, + "fills": [{ + "type": "SOLID", + "color": {"r": 0, "g": 0, "b": 0}, + "boundVariables": {"color": {"type": "VARIABLE_ALIAS", "id": "VariableID:text"}} + }] + }, + { + "characters": "[1. 이름]", + "start": 3, + "end": 10, + "textStyleId": "S:bodySemibold", + "fontName": {"family": "Pretendard", "style": "SemiBold"}, + "fontSize": 16, + "fontWeight": 600, + "fills": [{ + "type": "SOLID", + "color": {"r": 0.2, "g": 0.4, "b": 1}, + "boundVariables": {"color": {"type": "VARIABLE_ALIAS", "id": "VariableID:primaryLight"}} + }] + }, + { + "characters": " 왔어?\n다음 줄", + "start": 10, + "end": 20, + "textStyleId": "S:body", + "fontName": {"family": "Pretendard", "style": "Regular"}, + "fontSize": 16, + "fontWeight": 400, + "fills": [{ + "type": "SOLID", + "color": {"r": 0, "g": 0, "b": 0}, + "boundVariables": {"color": {"type": "VARIABLE_ALIAS", "id": "VariableID:text"}} + }] + } + ] + }, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + })) + .unwrap(); + let snapshot = merge_chunks(vec![chunk]).unwrap(); + let options = CodegenOptions { + text_style_tokens: [ + ("S:body".to_owned(), "body".to_owned()), + ("S:bodySemibold".to_owned(), "bodySemibold".to_owned()), + ] + .into_iter() + .collect(), + variable_tokens: [ + ("VariableID:text".to_owned(), "text".to_owned()), + ( + "VariableID:primaryLight".to_owned(), + "primaryLight".to_owned(), + ), + ] + .into_iter() + .collect(), + ..CodegenOptions::default() + }; + + let output = generate_component(&snapshot, "2:1", &options).unwrap(); + + assert!(output.tsx.contains("typography=\"body\"")); + assert!(output.tsx.contains("color=\"$text\"")); + assert!(output.tsx.contains("typography=\"bodySemibold\"")); + assert!(output.tsx.contains("color=\"$primaryLight\"")); + assert!(output.used_tokens.contains("text")); + assert!(output.used_tokens.contains("primaryLight")); + assert!(output.tsx.contains("{\" \"}왔어?
    다음 줄")); + assert!(!output.tsx.contains("fontSize=\"16px\"")); + assert!(!output.tsx.contains("fontWeight=\"600\"")); +} + +#[test] +fn standalone_instance_inlining_uses_resolved_children_not_component_props() { + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["3:1"], + "nodes": [ + { + "id": "3:1", "type": "FRAME", + "fields": {"name": "Screen", "childrenIds": ["3:2"], "layoutMode": "VERTICAL"}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "3:2", "type": "INSTANCE", + "fields": { + "name": "SectionTitle", "childrenIds": ["3:3"], "layoutMode": "HORIZONTAL", + "componentPropertyReferences": {"visible": "Visible#1:2"} + }, + "extra": {}, "fieldErrors": {} + }, + { + "id": "3:3", "type": "TEXT", + "fields": {"name": "Resolved label", "childrenIds": [], "characters": "실제 자식"}, + "extra": {}, "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .unwrap(); + let snapshot = merge_chunks(vec![chunk]).unwrap(); + + let output = generate_component( + &snapshot, + "3:1", + &CodegenOptions { + inline_instances: true, + ..CodegenOptions::default() + }, + ) + .unwrap(); + + assert!(output.tsx.contains("실제 자식")); + assert!(!output.tsx.contains("Visible")); + assert!(!output.tsx.contains(" String { + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["3:10"], + "nodes": [ + { + "id": "3:10", "type": "FRAME", + "fields": {"name": "Screen", "childrenIds": ["3:11"], "layoutMode": "VERTICAL"}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "3:11", "type": "INSTANCE", + "fields": { + "name": "Header", "childrenIds": ["3:12"], "layoutMode": "HORIZONTAL", + "componentProperties": { + "button#98:0": {"type": "BOOLEAN", "value": visible} + } + }, + "extra": {}, "fieldErrors": {} + }, + { + "id": "3:12", "type": "SLOT", + "fields": { + "name": "Button slot", "childrenIds": ["3:13"], + "componentPropertyReferences": {"visible": "button#98:0"} + }, + "extra": {}, "fieldErrors": {} + }, + { + "id": "3:13", "type": "TEXT", + "fields": {"name": "Resolved button", "childrenIds": [], "characters": "초기화"}, + "extra": {}, "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .unwrap(); + let snapshot = merge_chunks(vec![chunk]).unwrap(); + + generate_component( + &snapshot, + "3:10", + &CodegenOptions { + inline_instances: true, + ..CodegenOptions::default() + }, + ) + .unwrap() + .tsx + } + + let visible = generate(true); + assert!(visible.contains("초기화")); + assert!(!visible.contains("button &&")); + + let hidden = generate(false); + assert!(!hidden.contains("초기화")); + assert!(!hidden.contains("button &&")); +} + +#[test] +fn mixed_individual_stroke_emits_only_nonzero_sides() { + let snapshot = stroke_snapshot(true); + + let output = generate_component(&snapshot, "4:1", &CodegenOptions::default()).unwrap(); + + assert!(output.tsx.contains("borderTop=\"solid 1px #000\"")); + assert!(!output.tsx.contains(" border=\"")); + assert!(!output.tsx.contains("borderRight=")); + assert!(!output.tsx.contains("borderBottom=")); + assert!(!output.tsx.contains("borderLeft=")); +} + +#[test] +fn mixed_stroke_without_side_weights_does_not_invent_uniform_border() { + let snapshot = stroke_snapshot(false); + + let output = generate_component(&snapshot, "4:1", &CodegenOptions::default()).unwrap(); + + assert!(!output.tsx.contains(" border=\"")); + assert!(!output.tsx.contains(" outline=\"")); +} + +#[test] +fn embedded_root_omits_only_selected_frame_geometry_and_position() { + let mut snapshot = snapshot(); + let child = snapshot.nodes.get_mut("1:2").unwrap(); + child + .fields + .insert("layoutPositioning".to_owned(), json!("ABSOLUTE")); + child.fields.insert("width".to_owned(), json!(100)); + child.fields.insert("height".to_owned(), json!(20)); + child.fields.insert("x".to_owned(), json!(10)); + child.fields.insert("y".to_owned(), json!(12)); + + let standalone = generate_component(&snapshot, "1:1", &CodegenOptions::default()).unwrap(); + let embedded = generate_component( + &snapshot, + "1:1", + &CodegenOptions { + root_layout: RootLayout::Embedded, + ..CodegenOptions::default() + }, + ) + .unwrap(); + + let standalone_root = component_root_opening(&standalone.tsx); + assert!(standalone_root.contains("h=\"80px\"")); + assert!(standalone_root.contains("w=\"320px\"")); + assert!(standalone_root.contains("pos=\"relative\"")); + let embedded_root = component_root_opening(&embedded.tsx); + assert!(!embedded_root.contains("h=\"")); + assert!(!embedded_root.contains("w=\"")); + assert!(!embedded_root.contains("pos=\"")); + assert!(embedded.tsx.contains("left=\"10px\"")); + assert!(embedded.tsx.contains("pos=\"absolute\"")); + assert!(embedded.tsx.contains("top=\"12px\"")); +} + +fn component_root_opening(tsx: &str) -> &str { + let start = tsx.find(" <").expect("component root"); + let end = tsx[start..].find('>').expect("root opening close") + start; + &tsx[start..=end] +} + +fn stroke_snapshot(with_sides: bool) -> devup_mcp_figma::Snapshot { + let mut fields = json!({ + "name": "Mixed stroke", + "childrenIds": [], + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "width": 320, + "height": 64, + "strokes": [{ + "type": "SOLID", + "visible": true, + "color": {"r": 0, "g": 0, "b": 0} + }], + "strokeWeight": {"$unsupported": "symbol"}, + "strokeAlign": "INSIDE" + }); + if with_sides { + fields["strokeTopWeight"] = json!(1); + fields["strokeRightWeight"] = json!(0); + fields["strokeBottomWeight"] = json!(0); + fields["strokeLeftWeight"] = json!(0); + } + let chunk: SnapshotChunk = serde_json::from_value(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["4:1"], + "nodes": [{ + "id": "4:1", + "type": "FRAME", + "fields": fields, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + })) + .unwrap(); + merge_chunks(vec![chunk]).unwrap() +} diff --git a/crates/devup-mcp-devup-ui/tests/compat_fixtures.rs b/crates/devup-mcp-devup-ui/tests/compat_fixtures.rs new file mode 100644 index 0000000..0567e08 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/compat_fixtures.rs @@ -0,0 +1,97 @@ +mod support; + +use std::path::PathBuf; + +fn fixture(relative: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../fixtures/devup-figma-plugin/cases") + .join(relative) +} + +fn collect_json(directory: &std::path::Path, files: &mut Vec) { + for entry in std::fs::read_dir(directory).expect("fixture directory") { + let path = entry.expect("fixture entry").path(); + if path.is_dir() { + collect_json(&path, files); + } else if path.extension().and_then(|value| value.to_str()) == Some("json") { + files.push(path); + } + } +} + +fn char_boundary_before(value: &str, index: usize) -> usize { + let mut boundary = index.min(value.len()); + while !value.is_char_boundary(boundary) { + boundary -= 1; + } + boundary +} + +#[test] +fn upstream_json_goldens() { + let filter = std::env::var("DEVUP_FIXTURE_FILTER").ok(); + let root = fixture(""); + let mut files = Vec::new(); + collect_json(&root, &mut files); + files.sort(); + assert_eq!(files.len(), 268); + let mut failures = Vec::new(); + let mut passed = 0; + for path in files { + let case = support::load_case(&path).expect("upstream fixture"); + if filter.as_deref().is_some_and(|filter| { + !case.id.contains(filter) && !case.source.test_id.contains(filter) + }) { + continue; + } + let actual = support::run_upstream_snapshot(&case).unwrap_or_else(|error| { + panic!("upstream conversion failed for {}: {error:?}", case.id) + }); + let category = path + .parent() + .and_then(|parent| parent.file_name()) + .and_then(|value| value.to_str()) + .expect("fixture category"); + let snapshot = fixture("") + .join("../snapshots") + .join(category) + .join(format!("{}.snap", case.id)); + let committed = std::fs::read_to_string(snapshot) + .expect("committed snapshot") + .replace("\r\n", "\n"); + let expected = committed + .splitn(3, "---\n") + .nth(2) + .expect("insta snapshot body") + .trim(); + if actual == expected { + passed += 1; + } else { + let mismatch = expected + .bytes() + .zip(actual.bytes()) + .position(|(expected, actual)| expected != actual) + .unwrap_or_else(|| expected.len().min(actual.len())); + let start = char_boundary_before(expected, mismatch.saturating_sub(200)); + let actual_start = char_boundary_before(&actual, mismatch.saturating_sub(200)); + let expected_end = char_boundary_before(expected, expected.len().min(mismatch + 800)); + let actual_end = char_boundary_before(&actual, actual.len().min(mismatch + 800)); + failures.push(format!( + "{} at byte {mismatch}: expected {:?}, actual {:?}", + case.id, + &expected[start..expected_end], + &actual[actual_start..actual_end] + )); + } + } + assert!( + failures.is_empty(), + "upstream parity: {passed} passed, {} failed\n{}", + failures.len(), + failures + .into_iter() + .take(100) + .collect::>() + .join("\n") + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/compat_manifest.rs b/crates/devup-mcp-devup-ui/tests/compat_manifest.rs new file mode 100644 index 0000000..ef6c569 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/compat_manifest.rs @@ -0,0 +1,39 @@ +mod support; + +use std::path::PathBuf; + +#[test] +fn pinned_plugin_corpus_is_complete_and_self_consistent() { + let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../fixtures/devup-figma-plugin"); + let summary = support::validate_corpus(&root) + .unwrap_or_else(|violations| panic!("compat corpus 위반:\n{}", violations.join("\n"))); + assert_eq!(summary.source_files, 54); + assert_eq!(summary.ledger_entries, 978); + assert_eq!(summary.cases, 268); + assert_eq!(summary.snapshots, 268); +} + +#[test] +fn manifest_hashes_are_stable_across_checkout_line_endings() { + assert_eq!( + support::hex_sha256(b"{\r\n \"value\": true\r\n}\r\n"), + support::hex_sha256(b"{\n \"value\": true\n}\n") + ); +} + +#[test] +fn coverage_registry_maps_every_inventory_entry_to_real_evidence() { + let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../fixtures/devup-figma-plugin"); + let summary = support::validate_coverage_registry(&root) + .unwrap_or_else(|violations| panic!("coverage registry 위반:\n{}", violations.join("\n"))); + + assert_eq!(summary.inventory_entries, 978); + assert_eq!(summary.snapshot_parity_entries, 252); + assert_eq!(summary.snapshot_cases, 268); + assert_eq!(summary.representative_assertion_entries, 666); + assert_eq!(summary.non_parity_entries, 60); + assert_eq!( + summary.not_ported_entries, 0, + "모든 upstream inventory 항목은 실행 evidence 또는 명시적인 범위 분류를 가져야 합니다." + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35503.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35503.json new file mode 100644 index 0000000..97bb333 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35503.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35503","capture":"official Figma MCP use_figma read-only projection","nodeCount":15},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35503"],"nodes":{"3879:35503":{"id":"3879:35503","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35504","3879:35514"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":12,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Loading","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":1702,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35504":{"id":"3879:35504","type":"FRAME","fields":{"parentId":"3879:35503","childrenIds":["3879:35505","3879:35513"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":534,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":40,"layoutAlign":"STRETCH","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":80,"paddingLeft":0,"paddingRight":0,"paddingTop":80,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":40,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314902","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":80,"paddingLeft":0,"paddingRight":0,"paddingTop":80,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35514":{"id":"3879:35514","type":"FRAME","fields":{"parentId":"3879:35503","childrenIds":["3879:35515","3879:35517"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MAX","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":206,"inferredAutoLayout":{"counterAxisAlignItems":"MAX","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":30,"paddingLeft":40,"paddingRight":40,"paddingTop":30,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":30,"paddingLeft":40,"paddingRight":40,"paddingTop":30,"primaryAxisAlignItems":"MAX","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":534},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35505":{"id":"3879:35505","type":"FRAME","fields":{"parentId":"3879:35504","childrenIds":["3879:35506"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":34,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"BI - 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":59.07421875,"y":31.029436111450195},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":64,"x":148,"y":183.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35513":{"id":"3879:35513","type":"TEXT","fields":{"parentId":"3879:35504","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"기록해주신 이야기를\r\n정리하고 있어요\n잠시만 기다려주세요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":93,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"기록해주신 이야기를 정리하고 있어요 잠시만 기다려주세요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":148,"x":106,"y":257.5,"styledTextSegments":[{"characters":"기록해주신 이야기를\r\n정리하고 있어요\n잠시만 기다려주세요","end":31,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35515":{"id":"3879:35515","type":"FRAME","fields":{"parentId":"3879:35514","childrenIds":["3879:35516"],"blendMode":"PASS_THROUGH","bottomLeftRadius":20,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1843","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1843","type":"VARIABLE_ALIAS"}},"color":{"b":0.84698486328125,"g":0.8939971923828125,"r":0.917999267578125},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":88,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":20,"paddingRight":20,"paddingTop":20,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315455","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":20,"paddingRight":20,"paddingTop":20,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":280,"x":40,"y":30},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35517":{"id":"3879:35517","type":"FRAME","fields":{"parentId":"3879:35514","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":2000,"bottomRightRadius":2000,"boundVariables":{"strokes":[{"id":"VariableID:1:1843","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":2000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","filters":{"contrast":0,"exposure":0,"highlights":0,"saturation":0,"shadows":0,"temperature":0,"tint":0},"imageHash":"589b0c0550ff4776947b786ea3845970e70a52b3","imageTransform":[[0.6154620051383972,0,0.25599008798599243],[0,0.6154620051383972,0.0010550871957093477]],"opacity":1,"rotation":0,"scaleMode":"FILL","scalingFactor":0.5,"type":"IMAGE","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":48,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086022","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1843","type":"VARIABLE_ALIAS"}},"color":{"b":0.84698486328125,"g":0.8939971923828125,"r":0.917999267578125},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":80,"y":80},"topLeftRadius":2000,"topRightRadius":2000,"visible":true,"width":48,"x":272,"y":128},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35506":{"id":"3879:35506","type":"BOOLEAN_OPERATION","fields":{"parentId":"3879:35505","childrenIds":["3879:35507","3879:35508","3879:35509","3879:35510","3879:35511","3879:35512"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":33.99979019165039,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":64,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35516":{"id":"3879:35516","type":"TEXT","fields":{"parentId":"3879:35515","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"기억을 더듬어 기록하는 시간은 \n그 자체로 훌륭한 여행이랍니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"MaruBuri","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":48,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-5},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"기억을 더듬어 기록하는 시간은 그 자체로 훌륭한 여행이랍니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a3a810372b741f7e1750b51bdd26f5a491605594,","visible":true,"width":240,"x":20,"y":20,"styledTextSegments":[{"characters":"기억을 더듬어 기록하는 시간은 \n그 자체로 훌륭한 여행이랍니다.","end":35,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"MaruBuri","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-5},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a3a810372b741f7e1750b51bdd26f5a491605594,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35507":{"id":"3879:35507","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":7.916445255279541,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":64,"x":-0.00026449779397808015,"y":26.083332061767578},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35508":{"id":"3879:35508","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.00684356689453,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":28.01983642578125,"x":31.299345016479492,"y":14.30847454071045},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35509":{"id":"3879:35509","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28.339269638061523,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":17.803874969482422,"x":30.783044815063477,"y":3.453861951828003},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35510":{"id":"3879:35510","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31.082883834838867,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":2.814256429672241,"x":30.592607498168945,"y":-0.0002675131254363805},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35511":{"id":"3879:35511","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28.339269638061523,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":17.803874969482422,"x":15.41678237915039,"y":3.453861951828003},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35512":{"id":"3879:35512","type":"VECTOR","fields":{"parentId":"3879:35506","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0.17999267578125,"g":0.17999267578125,"r":0.4589996337890625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.00684356689453,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":28.01983642578125,"x":4.684520244598389,"y":14.30847454071045},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:1:1843","name":"mainBeige","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"}],"styles":[{"id":"S:a3a810372b741f7e1750b51bdd26f5a491605594,","name":"mainPraiseXs","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35518.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35518.json new file mode 100644 index 0000000..8443ac8 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35518.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35518","capture":"official Figma MCP use_figma read-only projection","nodeCount":144},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35518"],"nodes":{"3879:35518":{"id":"3879:35518","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35519","3879:35543","3879:35564"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":2088,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35519":{"id":"3879:35519","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35520","3879:35521","3879:35532","3879:35537"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":757,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35543":{"id":"3879:35543","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35544","3879:35548","3879:35552","3879:35556","3879:35560"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":757},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35564":{"id":"3879:35564","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35565","3879:35567"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35520":{"id":"3879:35520","type":"TEXT","fields":{"parentId":"3879:35519","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35521":{"id":"3879:35521","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35522","3879:35526"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":114,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35532":{"id":"3879:35532","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35533","3879:35536"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":302},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35537":{"id":"3879:35537","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35538","3879:35539","3879:35540"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":573},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35544":{"id":"3879:35544","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35545","3879:35546"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35548":{"id":"3879:35548","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35549","3879:35550"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35552":{"id":"3879:35552","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35553","3879:35554"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35556":{"id":"3879:35556","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35557","3879:35558"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35560":{"id":"3879:35560","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35561","3879:35562"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35565":{"id":"3879:35565","type":"FRAME","fields":{"parentId":"3879:35564","childrenIds":["3879:35566"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314936","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35567":{"id":"3879:35567","type":"FRAME","fields":{"parentId":"3879:35564","childrenIds":["3879:35568"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35522":{"id":"3879:35522","type":"FRAME","fields":{"parentId":"3879:35521","childrenIds":["3879:35523","3879:35524","3879:35525"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35526":{"id":"3879:35526","type":"FRAME","fields":{"parentId":"3879:35521","childrenIds":["3879:35527"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35533":{"id":"3879:35533","type":"FRAME","fields":{"parentId":"3879:35532","childrenIds":["3879:35534","3879:35535"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35536":{"id":"3879:35536","type":"TEXT","fields":{"parentId":"3879:35532","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35538":{"id":"3879:35538","type":"TEXT","fields":{"parentId":"3879:35537","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35539":{"id":"3879:35539","type":"TEXT","fields":{"parentId":"3879:35537","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35540":{"id":"3879:35540","type":"FRAME","fields":{"parentId":"3879:35537","childrenIds":["3879:35541"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35545":{"id":"3879:35545","type":"INSTANCE","fields":{"parentId":"3879:35544","childrenIds":["I3879:35545;1690:32933","I3879:35545;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35546":{"id":"3879:35546","type":"FRAME","fields":{"parentId":"3879:35544","childrenIds":["3879:35547"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35549":{"id":"3879:35549","type":"INSTANCE","fields":{"parentId":"3879:35548","childrenIds":["I3879:35549;1690:32933","I3879:35549;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35550":{"id":"3879:35550","type":"FRAME","fields":{"parentId":"3879:35548","childrenIds":["3879:35551"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35553":{"id":"3879:35553","type":"INSTANCE","fields":{"parentId":"3879:35552","childrenIds":["I3879:35553;1690:32933","I3879:35553;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35554":{"id":"3879:35554","type":"FRAME","fields":{"parentId":"3879:35552","childrenIds":["3879:35555"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35557":{"id":"3879:35557","type":"INSTANCE","fields":{"parentId":"3879:35556","childrenIds":["I3879:35557;1690:32933","I3879:35557;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35558":{"id":"3879:35558","type":"FRAME","fields":{"parentId":"3879:35556","childrenIds":["3879:35559"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35561":{"id":"3879:35561","type":"INSTANCE","fields":{"parentId":"3879:35560","childrenIds":["I3879:35561;1690:32933","I3879:35561;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35562":{"id":"3879:35562","type":"FRAME","fields":{"parentId":"3879:35560","childrenIds":["3879:35563"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35566":{"id":"3879:35566","type":"TEXT","fields":{"parentId":"3879:35565","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"편집 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"편집 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"편집 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35568":{"id":"3879:35568","type":"TEXT","fields":{"parentId":"3879:35567","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35523":{"id":"3879:35523","type":"TEXT","fields":{"parentId":"3879:35522","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35524":{"id":"3879:35524","type":"TEXT","fields":{"parentId":"3879:35522","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35525":{"id":"3879:35525","type":"INSTANCE","fields":{"parentId":"3879:35522","childrenIds":["I3879:35525;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35527":{"id":"3879:35527","type":"FRAME","fields":{"parentId":"3879:35526","childrenIds":["3879:35528","3879:35529","3879:35530"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35534":{"id":"3879:35534","type":"INSTANCE","fields":{"parentId":"3879:35533","childrenIds":["I3879:35534;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35535":{"id":"3879:35535","type":"TEXT","fields":{"parentId":"3879:35533","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35541":{"id":"3879:35541","type":"FRAME","fields":{"parentId":"3879:35540","childrenIds":["3879:35542"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32933":{"id":"I3879:35545;1690:32933","type":"TEXT","fields":{"parentId":"3879:35545","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32948":{"id":"I3879:35545;1690:32948","type":"FRAME","fields":{"parentId":"3879:35545","childrenIds":["I3879:35545;1690:32934","I3879:35545;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35547":{"id":"3879:35547","type":"TEXT","fields":{"parentId":"3879:35546","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32933":{"id":"I3879:35549;1690:32933","type":"TEXT","fields":{"parentId":"3879:35549","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32948":{"id":"I3879:35549;1690:32948","type":"FRAME","fields":{"parentId":"3879:35549","childrenIds":["I3879:35549;1690:32934","I3879:35549;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35551":{"id":"3879:35551","type":"TEXT","fields":{"parentId":"3879:35550","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32933":{"id":"I3879:35553;1690:32933","type":"TEXT","fields":{"parentId":"3879:35553","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32948":{"id":"I3879:35553;1690:32948","type":"FRAME","fields":{"parentId":"3879:35553","childrenIds":["I3879:35553;1690:32934","I3879:35553;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35555":{"id":"3879:35555","type":"TEXT","fields":{"parentId":"3879:35554","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32933":{"id":"I3879:35557;1690:32933","type":"TEXT","fields":{"parentId":"3879:35557","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32948":{"id":"I3879:35557;1690:32948","type":"FRAME","fields":{"parentId":"3879:35557","childrenIds":["I3879:35557;1690:32934","I3879:35557;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35559":{"id":"3879:35559","type":"TEXT","fields":{"parentId":"3879:35558","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32933":{"id":"I3879:35561;1690:32933","type":"TEXT","fields":{"parentId":"3879:35561","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32948":{"id":"I3879:35561;1690:32948","type":"FRAME","fields":{"parentId":"3879:35561","childrenIds":["I3879:35561;1690:32934","I3879:35561;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35563":{"id":"3879:35563","type":"TEXT","fields":{"parentId":"3879:35562","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2028":{"id":"I3879:35525;17:2028","type":"GROUP","fields":{"parentId":"3879:35525","childrenIds":["I3879:35525;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35528":{"id":"3879:35528","type":"TEXT","fields":{"parentId":"3879:35527","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35529":{"id":"3879:35529","type":"TEXT","fields":{"parentId":"3879:35527","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35530":{"id":"3879:35530","type":"FRAME","fields":{"parentId":"3879:35527","childrenIds":["3879:35531"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35534;20:3849":{"id":"I3879:35534;20:3849","type":"VECTOR","fields":{"parentId":"3879:35534","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35542":{"id":"3879:35542","type":"VECTOR","fields":{"parentId":"3879:35541","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934":{"id":"I3879:35545;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35545;1690:32948","childrenIds":["I3879:35545;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32947":{"id":"I3879:35545;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35545;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934":{"id":"I3879:35549;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35549;1690:32948","childrenIds":["I3879:35549;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32947":{"id":"I3879:35549;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35549;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934":{"id":"I3879:35553;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35553;1690:32948","childrenIds":["I3879:35553;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32947":{"id":"I3879:35553;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35553;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934":{"id":"I3879:35557;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35557;1690:32948","childrenIds":["I3879:35557;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32947":{"id":"I3879:35557;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35557;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934":{"id":"I3879:35561;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35561;1690:32948","childrenIds":["I3879:35561;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32947":{"id":"I3879:35561;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35561;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2029":{"id":"I3879:35525;17:2029","type":"GROUP","fields":{"parentId":"I3879:35525;17:2028","childrenIds":["I3879:35525;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35531":{"id":"3879:35531","type":"VECTOR","fields":{"parentId":"3879:35530","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2028":{"id":"I3879:35545;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934","childrenIds":["I3879:35545;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2028":{"id":"I3879:35549;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934","childrenIds":["I3879:35549;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2028":{"id":"I3879:35553;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934","childrenIds":["I3879:35553;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2028":{"id":"I3879:35557;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934","childrenIds":["I3879:35557;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2028":{"id":"I3879:35561;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934","childrenIds":["I3879:35561;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2039":{"id":"I3879:35525;17:2039","type":"GROUP","fields":{"parentId":"I3879:35525;17:2029","childrenIds":["I3879:35525;17:2037","I3879:35525;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2029":{"id":"I3879:35545;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2028","childrenIds":["I3879:35545;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2029":{"id":"I3879:35549;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2028","childrenIds":["I3879:35549;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2029":{"id":"I3879:35553;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2028","childrenIds":["I3879:35553;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2029":{"id":"I3879:35557;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2028","childrenIds":["I3879:35557;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2029":{"id":"I3879:35561;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2028","childrenIds":["I3879:35561;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2037":{"id":"I3879:35525;17:2037","type":"GROUP","fields":{"parentId":"I3879:35525;17:2039","childrenIds":["I3879:35525;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2030":{"id":"I3879:35525;17:2030","type":"GROUP","fields":{"parentId":"I3879:35525;17:2039","childrenIds":["I3879:35525;17:2031","I3879:35525;17:2033","I3879:35525;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2039":{"id":"I3879:35545;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2029","childrenIds":["I3879:35545;1690:32934;17:2037","I3879:35545;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2039":{"id":"I3879:35549;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2029","childrenIds":["I3879:35549;1690:32934;17:2037","I3879:35549;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2039":{"id":"I3879:35553;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2029","childrenIds":["I3879:35553;1690:32934;17:2037","I3879:35553;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2039":{"id":"I3879:35557;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2029","childrenIds":["I3879:35557;1690:32934;17:2037","I3879:35557;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2039":{"id":"I3879:35561;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2029","childrenIds":["I3879:35561;1690:32934;17:2037","I3879:35561;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2038":{"id":"I3879:35525;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2031":{"id":"I3879:35525;17:2031","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2033":{"id":"I3879:35525;17:2033","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2035":{"id":"I3879:35525;17:2035","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2037":{"id":"I3879:35545;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2039","childrenIds":["I3879:35545;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2030":{"id":"I3879:35545;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2039","childrenIds":["I3879:35545;1690:32934;17:2031","I3879:35545;1690:32934;17:2033","I3879:35545;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2037":{"id":"I3879:35549;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2039","childrenIds":["I3879:35549;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2030":{"id":"I3879:35549;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2039","childrenIds":["I3879:35549;1690:32934;17:2031","I3879:35549;1690:32934;17:2033","I3879:35549;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2037":{"id":"I3879:35553;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2039","childrenIds":["I3879:35553;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2030":{"id":"I3879:35553;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2039","childrenIds":["I3879:35553;1690:32934;17:2031","I3879:35553;1690:32934;17:2033","I3879:35553;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2037":{"id":"I3879:35557;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2039","childrenIds":["I3879:35557;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2030":{"id":"I3879:35557;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2039","childrenIds":["I3879:35557;1690:32934;17:2031","I3879:35557;1690:32934;17:2033","I3879:35557;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2037":{"id":"I3879:35561;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2039","childrenIds":["I3879:35561;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2030":{"id":"I3879:35561;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2039","childrenIds":["I3879:35561;1690:32934;17:2031","I3879:35561;1690:32934;17:2033","I3879:35561;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2032":{"id":"I3879:35525;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2034":{"id":"I3879:35525;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35525;17:2036":{"id":"I3879:35525;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2038":{"id":"I3879:35545;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2031":{"id":"I3879:35545;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2033":{"id":"I3879:35545;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2035":{"id":"I3879:35545;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2038":{"id":"I3879:35549;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2031":{"id":"I3879:35549;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2033":{"id":"I3879:35549;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2035":{"id":"I3879:35549;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2038":{"id":"I3879:35553;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2031":{"id":"I3879:35553;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2033":{"id":"I3879:35553;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2035":{"id":"I3879:35553;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2038":{"id":"I3879:35557;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2031":{"id":"I3879:35557;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2033":{"id":"I3879:35557;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2035":{"id":"I3879:35557;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2038":{"id":"I3879:35561;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2031":{"id":"I3879:35561;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2033":{"id":"I3879:35561;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2035":{"id":"I3879:35561;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2032":{"id":"I3879:35545;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2034":{"id":"I3879:35545;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35545;1690:32934;17:2036":{"id":"I3879:35545;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2032":{"id":"I3879:35549;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2034":{"id":"I3879:35549;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35549;1690:32934;17:2036":{"id":"I3879:35549;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2032":{"id":"I3879:35553;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2034":{"id":"I3879:35553;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35553;1690:32934;17:2036":{"id":"I3879:35553;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2032":{"id":"I3879:35557;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2034":{"id":"I3879:35557;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35557;1690:32934;17:2036":{"id":"I3879:35557;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2032":{"id":"I3879:35561;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2034":{"id":"I3879:35561;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35561;1690:32934;17:2036":{"id":"I3879:35561;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35569.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35569.json new file mode 100644 index 0000000..ee718c5 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35569.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35569","capture":"official Figma MCP use_figma read-only projection","nodeCount":206},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35569"],"nodes":{"3879:35569":{"id":"3879:35569","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35570","3879:35603","3879:35624","3879:35629"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":2458,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35570":{"id":"3879:35570","type":"FRAME","fields":{"parentId":"3879:35569","childrenIds":["3879:35571","3879:35572","3879:35592","3879:35597"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":885,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35603":{"id":"3879:35603","type":"FRAME","fields":{"parentId":"3879:35569","childrenIds":["3879:35604","3879:35608","3879:35612","3879:35616","3879:35620"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":885},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35624":{"id":"3879:35624","type":"FRAME","fields":{"parentId":"3879:35569","childrenIds":["3879:35625","3879:35627"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35629":{"id":"3879:35629","type":"FRAME","fields":{"parentId":"3879:35569","childrenIds":["3879:35630"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35571":{"id":"3879:35571","type":"TEXT","fields":{"parentId":"3879:35570","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35572":{"id":"3879:35572","type":"FRAME","fields":{"parentId":"3879:35570","childrenIds":["3879:35573","3879:35577","3879:35586"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":242,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35592":{"id":"3879:35592","type":"FRAME","fields":{"parentId":"3879:35570","childrenIds":["3879:35593","3879:35596"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":430},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35597":{"id":"3879:35597","type":"FRAME","fields":{"parentId":"3879:35570","childrenIds":["3879:35598","3879:35599","3879:35600"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":701},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35604":{"id":"3879:35604","type":"FRAME","fields":{"parentId":"3879:35603","childrenIds":["3879:35605","3879:35606"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35608":{"id":"3879:35608","type":"FRAME","fields":{"parentId":"3879:35603","childrenIds":["3879:35609","3879:35610"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35612":{"id":"3879:35612","type":"FRAME","fields":{"parentId":"3879:35603","childrenIds":["3879:35613","3879:35614"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35616":{"id":"3879:35616","type":"FRAME","fields":{"parentId":"3879:35603","childrenIds":["3879:35617","3879:35618"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35620":{"id":"3879:35620","type":"FRAME","fields":{"parentId":"3879:35603","childrenIds":["3879:35621","3879:35622"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35625":{"id":"3879:35625","type":"FRAME","fields":{"parentId":"3879:35624","childrenIds":["3879:35626"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}},"color":{"b":0.8907090425491333,"g":0.9080576300621033,"r":0.9278846383094788},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35627":{"id":"3879:35627","type":"FRAME","fields":{"parentId":"3879:35624","childrenIds":["3879:35628"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35630":{"id":"3879:35630","type":"FRAME","fields":{"parentId":"3879:35629","childrenIds":["3879:35631","3879:35642","3879:35644","3879:35646","3879:35650","3879:35651"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":-8},"radius":20,"showShadowBehindNode":false,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":631,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":" B : STORY-F-DETAIL #modify-style","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":360,"x":0,"y":109},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35573":{"id":"3879:35573","type":"FRAME","fields":{"parentId":"3879:35572","childrenIds":["3879:35574","3879:35575","3879:35576"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35577":{"id":"3879:35577","type":"FRAME","fields":{"parentId":"3879:35572","childrenIds":["3879:35578","3879:35579"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35586":{"id":"3879:35586","type":"FRAME","fields":{"parentId":"3879:35572","childrenIds":["3879:35587"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":189},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35593":{"id":"3879:35593","type":"FRAME","fields":{"parentId":"3879:35592","childrenIds":["3879:35594","3879:35595"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35596":{"id":"3879:35596","type":"TEXT","fields":{"parentId":"3879:35592","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35598":{"id":"3879:35598","type":"TEXT","fields":{"parentId":"3879:35597","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35599":{"id":"3879:35599","type":"TEXT","fields":{"parentId":"3879:35597","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35600":{"id":"3879:35600","type":"FRAME","fields":{"parentId":"3879:35597","childrenIds":["3879:35601"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35605":{"id":"3879:35605","type":"INSTANCE","fields":{"parentId":"3879:35604","childrenIds":["I3879:35605;1690:32933","I3879:35605;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35606":{"id":"3879:35606","type":"FRAME","fields":{"parentId":"3879:35604","childrenIds":["3879:35607"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35609":{"id":"3879:35609","type":"INSTANCE","fields":{"parentId":"3879:35608","childrenIds":["I3879:35609;1690:32933","I3879:35609;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35610":{"id":"3879:35610","type":"FRAME","fields":{"parentId":"3879:35608","childrenIds":["3879:35611"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35613":{"id":"3879:35613","type":"INSTANCE","fields":{"parentId":"3879:35612","childrenIds":["I3879:35613;1690:32933","I3879:35613;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35614":{"id":"3879:35614","type":"FRAME","fields":{"parentId":"3879:35612","childrenIds":["3879:35615"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35617":{"id":"3879:35617","type":"INSTANCE","fields":{"parentId":"3879:35616","childrenIds":["I3879:35617;1690:32933","I3879:35617;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35618":{"id":"3879:35618","type":"FRAME","fields":{"parentId":"3879:35616","childrenIds":["3879:35619"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35621":{"id":"3879:35621","type":"INSTANCE","fields":{"parentId":"3879:35620","childrenIds":["I3879:35621;1690:32933","I3879:35621;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35622":{"id":"3879:35622","type":"FRAME","fields":{"parentId":"3879:35620","childrenIds":["3879:35623"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35626":{"id":"3879:35626","type":"TEXT","fields":{"parentId":"3879:35625","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35628":{"id":"3879:35628","type":"TEXT","fields":{"parentId":"3879:35627","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35631":{"id":"3879:35631","type":"FRAME","fields":{"parentId":"3879:35630","childrenIds":["3879:35632","3879:35639","3879:35640","3879:35641"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":357,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315485","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35642":{"id":"3879:35642","type":"FRAME","fields":{"parentId":"3879:35630","childrenIds":["3879:35643"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086076","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":338},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35644":{"id":"3879:35644","type":"FRAME","fields":{"parentId":"3879:35630","childrenIds":["3879:35645"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086077","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":397},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35646":{"id":"3879:35646","type":"FRAME","fields":{"parentId":"3879:35630","childrenIds":["3879:35647"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":16,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":16,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086078","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":357},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35650":{"id":"3879:35650","type":"INSTANCE","fields":{"parentId":"3879:35630","childrenIds":["I3879:35650;137:5963","I3879:35650;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":12,"y":455},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35651":{"id":"3879:35651","type":"INSTANCE","fields":{"parentId":"3879:35630","childrenIds":["I3879:35651;137:5978","I3879:35651;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":12,"y":536},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35574":{"id":"3879:35574","type":"TEXT","fields":{"parentId":"3879:35573","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35575":{"id":"3879:35575","type":"TEXT","fields":{"parentId":"3879:35573","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35576":{"id":"3879:35576","type":"INSTANCE","fields":{"parentId":"3879:35573","childrenIds":["I3879:35576;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35578":{"id":"3879:35578","type":"TEXT","fields":{"parentId":"3879:35577","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"교정 옵션을 선택해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 옵션을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":296,"x":16,"y":12,"styledTextSegments":[{"characters":"교정 옵션을 선택해주세요.","end":14,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35579":{"id":"3879:35579","type":"FRAME","fields":{"parentId":"3879:35577","childrenIds":["3879:35580","3879:35583"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35587":{"id":"3879:35587","type":"FRAME","fields":{"parentId":"3879:35586","childrenIds":["3879:35588","3879:35589","3879:35590"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35594":{"id":"3879:35594","type":"INSTANCE","fields":{"parentId":"3879:35593","childrenIds":["I3879:35594;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35595":{"id":"3879:35595","type":"TEXT","fields":{"parentId":"3879:35593","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35601":{"id":"3879:35601","type":"FRAME","fields":{"parentId":"3879:35600","childrenIds":["3879:35602"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32933":{"id":"I3879:35605;1690:32933","type":"TEXT","fields":{"parentId":"3879:35605","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32948":{"id":"I3879:35605;1690:32948","type":"FRAME","fields":{"parentId":"3879:35605","childrenIds":["I3879:35605;1690:32934","I3879:35605;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35607":{"id":"3879:35607","type":"TEXT","fields":{"parentId":"3879:35606","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32933":{"id":"I3879:35609;1690:32933","type":"TEXT","fields":{"parentId":"3879:35609","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32948":{"id":"I3879:35609;1690:32948","type":"FRAME","fields":{"parentId":"3879:35609","childrenIds":["I3879:35609;1690:32934","I3879:35609;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35611":{"id":"3879:35611","type":"TEXT","fields":{"parentId":"3879:35610","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32933":{"id":"I3879:35613;1690:32933","type":"TEXT","fields":{"parentId":"3879:35613","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32948":{"id":"I3879:35613;1690:32948","type":"FRAME","fields":{"parentId":"3879:35613","childrenIds":["I3879:35613;1690:32934","I3879:35613;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35615":{"id":"3879:35615","type":"TEXT","fields":{"parentId":"3879:35614","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32933":{"id":"I3879:35617;1690:32933","type":"TEXT","fields":{"parentId":"3879:35617","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32948":{"id":"I3879:35617;1690:32948","type":"FRAME","fields":{"parentId":"3879:35617","childrenIds":["I3879:35617;1690:32934","I3879:35617;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35619":{"id":"3879:35619","type":"TEXT","fields":{"parentId":"3879:35618","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32933":{"id":"I3879:35621;1690:32933","type":"TEXT","fields":{"parentId":"3879:35621","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32948":{"id":"I3879:35621;1690:32948","type":"FRAME","fields":{"parentId":"3879:35621","childrenIds":["I3879:35621;1690:32934","I3879:35621;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35623":{"id":"3879:35623","type":"TEXT","fields":{"parentId":"3879:35622","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35632":{"id":"3879:35632","type":"FRAME","fields":{"parentId":"3879:35631","childrenIds":["3879:35633","3879:35636"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086070","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35639":{"id":"3879:35639","type":"INSTANCE","fields":{"parentId":"3879:35631","childrenIds":["I3879:35639;137:5963","I3879:35639;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":0,"y":98},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35640":{"id":"3879:35640","type":"INSTANCE","fields":{"parentId":"3879:35631","childrenIds":["I3879:35640;137:5978","I3879:35640;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":179},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35641":{"id":"3879:35641","type":"INSTANCE","fields":{"parentId":"3879:35631","childrenIds":["I3879:35641;137:5978","I3879:35641;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 3","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":262},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35643":{"id":"3879:35643","type":"TEXT","fields":{"parentId":"3879:35642","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35645":{"id":"3879:35645","type":"TEXT","fields":{"parentId":"3879:35644","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35647":{"id":"3879:35647","type":"FRAME","fields":{"parentId":"3879:35646","childrenIds":["3879:35648","3879:35649"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":311,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5963":{"id":"I3879:35650;137:5963","type":"INSTANCE","fields":{"parentId":"3879:35650","childrenIds":["I3879:35650;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5960":{"id":"I3879:35650;137:5960","type":"FRAME","fields":{"parentId":"3879:35650","childrenIds":["I3879:35650;137:5967","I3879:35650;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;137:5978":{"id":"I3879:35651;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35651","childrenIds":["I3879:35651;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;137:5949":{"id":"I3879:35651;137:5949","type":"FRAME","fields":{"parentId":"3879:35651","childrenIds":["I3879:35651;98:3483","I3879:35651;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2028":{"id":"I3879:35576;17:2028","type":"GROUP","fields":{"parentId":"3879:35576","childrenIds":["I3879:35576;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35580":{"id":"3879:35580","type":"FRAME","fields":{"parentId":"3879:35579","childrenIds":["3879:35581","3879:35582"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35583":{"id":"3879:35583","type":"FRAME","fields":{"parentId":"3879:35579","childrenIds":["3879:35584","3879:35585"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35588":{"id":"3879:35588","type":"TEXT","fields":{"parentId":"3879:35587","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35589":{"id":"3879:35589","type":"TEXT","fields":{"parentId":"3879:35587","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35590":{"id":"3879:35590","type":"FRAME","fields":{"parentId":"3879:35587","childrenIds":["3879:35591"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35594;20:3849":{"id":"I3879:35594;20:3849","type":"VECTOR","fields":{"parentId":"3879:35594","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35602":{"id":"3879:35602","type":"VECTOR","fields":{"parentId":"3879:35601","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934":{"id":"I3879:35605;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35605;1690:32948","childrenIds":["I3879:35605;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32947":{"id":"I3879:35605;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35605;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934":{"id":"I3879:35609;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35609;1690:32948","childrenIds":["I3879:35609;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32947":{"id":"I3879:35609;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35609;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934":{"id":"I3879:35613;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35613;1690:32948","childrenIds":["I3879:35613;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32947":{"id":"I3879:35613;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35613;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934":{"id":"I3879:35617;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35617;1690:32948","childrenIds":["I3879:35617;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32947":{"id":"I3879:35617;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35617;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934":{"id":"I3879:35621;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35621;1690:32948","childrenIds":["I3879:35621;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32947":{"id":"I3879:35621;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35621;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35633":{"id":"3879:35633","type":"FRAME","fields":{"parentId":"3879:35632","childrenIds":["3879:35634","3879:35635"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":238,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35636":{"id":"3879:35636","type":"FRAME","fields":{"parentId":"3879:35632","childrenIds":["3879:35637"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":44,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":44,"x":292,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5963":{"id":"I3879:35639;137:5963","type":"INSTANCE","fields":{"parentId":"3879:35639","childrenIds":["I3879:35639;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5960":{"id":"I3879:35639;137:5960","type":"FRAME","fields":{"parentId":"3879:35639","childrenIds":["I3879:35639;137:5967","I3879:35639;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":123,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;137:5978":{"id":"I3879:35640;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35640","childrenIds":["I3879:35640;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;137:5949":{"id":"I3879:35640;137:5949","type":"FRAME","fields":{"parentId":"3879:35640","childrenIds":["I3879:35640;98:3483","I3879:35640;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":149,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;137:5978":{"id":"I3879:35641;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35641","childrenIds":["I3879:35641;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;137:5949":{"id":"I3879:35641;137:5949","type":"FRAME","fields":{"parentId":"3879:35641","childrenIds":["I3879:35641;98:3483","I3879:35641;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":110,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35648":{"id":"3879:35648","type":"TEXT","fields":{"parentId":"3879:35647","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"교정 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"교정 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35649":{"id":"3879:35649","type":"TEXT","fields":{"parentId":"3879:35647","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":311,"x":0,"y":32,"styledTextSegments":[{"characters":"이번 이야기","end":6,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에만 적용할 교정 방법을 설정해주세요.","end":27,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":6,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5963;68:6227":{"id":"I3879:35650;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:35650;137:5963","childrenIds":["I3879:35650;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5967":{"id":"I3879:35650;137:5967","type":"TEXT","fields":{"parentId":"I3879:35650;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자와 함께 문체 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":203,"x":0,"y":0,"styledTextSegments":[{"characters":"AI 담당자와 함께 문체 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5962":{"id":"I3879:35650;137:5962","type":"TEXT","fields":{"parentId":"I3879:35650;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":33,"styledTextSegments":[{"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","end":22,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;137:5978;68:6227":{"id":"I3879:35651;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35651;137:5978","childrenIds":["I3879:35651;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;98:3483":{"id":"I3879:35651;98:3483","type":"TEXT","fields":{"parentId":"I3879:35651;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 그대로 맞춤법만 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":218,"x":0,"y":0,"styledTextSegments":[{"characters":"내 문장 그대로 맞춤법만 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;137:5945":{"id":"I3879:35651;137:5945","type":"TEXT","fields":{"parentId":"I3879:35651;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"입력하신 문장 그대로의 느낌을 담아내요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":34,"styledTextSegments":[{"characters":"입력하신 문장 그대로의 느낌을 담아내요","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2029":{"id":"I3879:35576;17:2029","type":"GROUP","fields":{"parentId":"I3879:35576;17:2028","childrenIds":["I3879:35576;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35581":{"id":"3879:35581","type":"INSTANCE","fields":{"parentId":"3879:35580","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35582":{"id":"3879:35582","type":"TEXT","fields":{"parentId":"3879:35580","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 편집자에게 다듬기 맡기기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 편집자에게 다듬기 맡기기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":176,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 편집자에게 다듬기 맡기기","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35584":{"id":"3879:35584","type":"INSTANCE","fields":{"parentId":"3879:35583","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35585":{"id":"3879:35585","type":"TEXT","fields":{"parentId":"3879:35583","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 최대한 유지하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 최대한 유지하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":149,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 최대한 유지하기","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35591":{"id":"3879:35591","type":"VECTOR","fields":{"parentId":"3879:35590","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2028":{"id":"I3879:35605;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934","childrenIds":["I3879:35605;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2028":{"id":"I3879:35609;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934","childrenIds":["I3879:35609;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2028":{"id":"I3879:35613;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934","childrenIds":["I3879:35613;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2028":{"id":"I3879:35617;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934","childrenIds":["I3879:35617;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2028":{"id":"I3879:35621;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934","childrenIds":["I3879:35621;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35634":{"id":"3879:35634","type":"TEXT","fields":{"parentId":"3879:35633","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35635":{"id":"3879:35635","type":"TEXT","fields":{"parentId":"3879:35633","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"책 전체에 적용할 문체를 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"책 전체에 적용할 문체를 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":238,"x":0,"y":32,"styledTextSegments":[{"characters":"책 전체","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에 적용할 문체를 설정해주세요.","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35637":{"id":"3879:35637","type":"FRAME","fields":{"parentId":"3879:35636","childrenIds":["3879:35638"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":34,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5963;68:6227":{"id":"I3879:35639;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:35639;137:5963","childrenIds":["I3879:35639;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5967":{"id":"I3879:35639;137:5967","type":"TEXT","fields":{"parentId":"I3879:35639;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5962":{"id":"I3879:35639;137:5962","type":"TEXT","fields":{"parentId":"I3879:35639;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"차분하고 담백한 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":123,"x":0,"y":33,"styledTextSegments":[{"characters":"차분하고 담백한 문체","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;137:5978;68:6227":{"id":"I3879:35640;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35640;137:5978","childrenIds":["I3879:35640;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;98:3483":{"id":"I3879:35640;98:3483","type":"TEXT","fields":{"parentId":"I3879:35640;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"서정체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"서정체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;137:5945":{"id":"I3879:35640;137:5945","type":"TEXT","fields":{"parentId":"I3879:35640;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"감성적이고 부드러운 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":149,"x":0,"y":34,"styledTextSegments":[{"characters":"감성적이고 부드러운 문체","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;137:5978;68:6227":{"id":"I3879:35641;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35641;137:5978","childrenIds":["I3879:35641;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;98:3483":{"id":"I3879:35641;98:3483","type":"TEXT","fields":{"parentId":"I3879:35641;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"강건체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"강건체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;137:5945":{"id":"I3879:35641;137:5945","type":"TEXT","fields":{"parentId":"I3879:35641;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"단호하고 힘찬 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":110,"x":0,"y":34,"styledTextSegments":[{"characters":"단호하고 힘찬 문체","end":10,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35650;137:5963;68:6228":{"id":"I3879:35650;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35650;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35651;137:5978;68:6228":{"id":"I3879:35651;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35651;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2039":{"id":"I3879:35576;17:2039","type":"GROUP","fields":{"parentId":"I3879:35576;17:2029","childrenIds":["I3879:35576;17:2037","I3879:35576;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2029":{"id":"I3879:35605;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2028","childrenIds":["I3879:35605;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2029":{"id":"I3879:35609;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2028","childrenIds":["I3879:35609;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2029":{"id":"I3879:35613;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2028","childrenIds":["I3879:35613;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2029":{"id":"I3879:35617;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2028","childrenIds":["I3879:35617;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2029":{"id":"I3879:35621;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2028","childrenIds":["I3879:35621;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35638":{"id":"3879:35638","type":"VECTOR","fields":{"parentId":"3879:35637","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":15.99999713897705,"x":4.000001907348633,"y":3.999999523162842},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35639;137:5963;68:6228":{"id":"I3879:35639;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35639;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35640;137:5978;68:6228":{"id":"I3879:35640;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35640;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35641;137:5978;68:6228":{"id":"I3879:35641;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35641;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2037":{"id":"I3879:35576;17:2037","type":"GROUP","fields":{"parentId":"I3879:35576;17:2039","childrenIds":["I3879:35576;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2030":{"id":"I3879:35576;17:2030","type":"GROUP","fields":{"parentId":"I3879:35576;17:2039","childrenIds":["I3879:35576;17:2031","I3879:35576;17:2033","I3879:35576;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2039":{"id":"I3879:35605;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2029","childrenIds":["I3879:35605;1690:32934;17:2037","I3879:35605;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2039":{"id":"I3879:35609;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2029","childrenIds":["I3879:35609;1690:32934;17:2037","I3879:35609;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2039":{"id":"I3879:35613;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2029","childrenIds":["I3879:35613;1690:32934;17:2037","I3879:35613;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2039":{"id":"I3879:35617;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2029","childrenIds":["I3879:35617;1690:32934;17:2037","I3879:35617;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2039":{"id":"I3879:35621;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2029","childrenIds":["I3879:35621;1690:32934;17:2037","I3879:35621;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2038":{"id":"I3879:35576;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35576;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2031":{"id":"I3879:35576;17:2031","type":"GROUP","fields":{"parentId":"I3879:35576;17:2030","childrenIds":["I3879:35576;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2033":{"id":"I3879:35576;17:2033","type":"GROUP","fields":{"parentId":"I3879:35576;17:2030","childrenIds":["I3879:35576;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2035":{"id":"I3879:35576;17:2035","type":"GROUP","fields":{"parentId":"I3879:35576;17:2030","childrenIds":["I3879:35576;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2037":{"id":"I3879:35605;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2039","childrenIds":["I3879:35605;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2030":{"id":"I3879:35605;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2039","childrenIds":["I3879:35605;1690:32934;17:2031","I3879:35605;1690:32934;17:2033","I3879:35605;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2037":{"id":"I3879:35609;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2039","childrenIds":["I3879:35609;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2030":{"id":"I3879:35609;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2039","childrenIds":["I3879:35609;1690:32934;17:2031","I3879:35609;1690:32934;17:2033","I3879:35609;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2037":{"id":"I3879:35613;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2039","childrenIds":["I3879:35613;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2030":{"id":"I3879:35613;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2039","childrenIds":["I3879:35613;1690:32934;17:2031","I3879:35613;1690:32934;17:2033","I3879:35613;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2037":{"id":"I3879:35617;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2039","childrenIds":["I3879:35617;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2030":{"id":"I3879:35617;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2039","childrenIds":["I3879:35617;1690:32934;17:2031","I3879:35617;1690:32934;17:2033","I3879:35617;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2037":{"id":"I3879:35621;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2039","childrenIds":["I3879:35621;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2030":{"id":"I3879:35621;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2039","childrenIds":["I3879:35621;1690:32934;17:2031","I3879:35621;1690:32934;17:2033","I3879:35621;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2032":{"id":"I3879:35576;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35576;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2034":{"id":"I3879:35576;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35576;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35576;17:2036":{"id":"I3879:35576;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35576;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2038":{"id":"I3879:35605;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35605;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2031":{"id":"I3879:35605;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2030","childrenIds":["I3879:35605;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2033":{"id":"I3879:35605;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2030","childrenIds":["I3879:35605;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2035":{"id":"I3879:35605;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35605;1690:32934;17:2030","childrenIds":["I3879:35605;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2038":{"id":"I3879:35609;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35609;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2031":{"id":"I3879:35609;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2030","childrenIds":["I3879:35609;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2033":{"id":"I3879:35609;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2030","childrenIds":["I3879:35609;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2035":{"id":"I3879:35609;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35609;1690:32934;17:2030","childrenIds":["I3879:35609;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2038":{"id":"I3879:35613;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35613;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2031":{"id":"I3879:35613;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2030","childrenIds":["I3879:35613;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2033":{"id":"I3879:35613;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2030","childrenIds":["I3879:35613;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2035":{"id":"I3879:35613;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35613;1690:32934;17:2030","childrenIds":["I3879:35613;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2038":{"id":"I3879:35617;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35617;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2031":{"id":"I3879:35617;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2030","childrenIds":["I3879:35617;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2033":{"id":"I3879:35617;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2030","childrenIds":["I3879:35617;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2035":{"id":"I3879:35617;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35617;1690:32934;17:2030","childrenIds":["I3879:35617;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2038":{"id":"I3879:35621;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35621;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2031":{"id":"I3879:35621;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2030","childrenIds":["I3879:35621;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2033":{"id":"I3879:35621;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2030","childrenIds":["I3879:35621;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2035":{"id":"I3879:35621;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35621;1690:32934;17:2030","childrenIds":["I3879:35621;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2032":{"id":"I3879:35605;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35605;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2034":{"id":"I3879:35605;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35605;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35605;1690:32934;17:2036":{"id":"I3879:35605;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35605;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2032":{"id":"I3879:35609;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35609;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2034":{"id":"I3879:35609;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35609;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35609;1690:32934;17:2036":{"id":"I3879:35609;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35609;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2032":{"id":"I3879:35613;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35613;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2034":{"id":"I3879:35613;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35613;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35613;1690:32934;17:2036":{"id":"I3879:35613;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35613;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2032":{"id":"I3879:35617;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35617;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2034":{"id":"I3879:35617;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35617;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35617;1690:32934;17:2036":{"id":"I3879:35617;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35617;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2032":{"id":"I3879:35621;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35621;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2034":{"id":"I3879:35621;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35621;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35621;1690:32934;17:2036":{"id":"I3879:35621;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35621;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:278:3649","name":"primaryBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:63:1980","name":"gray200","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35652.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35652.json new file mode 100644 index 0000000..b9ef7a8 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35652.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35652","capture":"official Figma MCP use_figma read-only projection","nodeCount":188},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35652"],"nodes":{"3879:35652":{"id":"3879:35652","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35653","3879:35686","3879:35707","3879:35712"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":2088,"y":1622},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35653":{"id":"3879:35653","type":"FRAME","fields":{"parentId":"3879:35652","childrenIds":["3879:35654","3879:35655","3879:35675","3879:35680"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":885,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35686":{"id":"3879:35686","type":"FRAME","fields":{"parentId":"3879:35652","childrenIds":["3879:35687","3879:35691","3879:35695","3879:35699","3879:35703"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":885},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35707":{"id":"3879:35707","type":"FRAME","fields":{"parentId":"3879:35652","childrenIds":["3879:35708","3879:35710"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35712":{"id":"3879:35712","type":"FRAME","fields":{"parentId":"3879:35652","childrenIds":["3879:35713"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35654":{"id":"3879:35654","type":"TEXT","fields":{"parentId":"3879:35653","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35655":{"id":"3879:35655","type":"FRAME","fields":{"parentId":"3879:35653","childrenIds":["3879:35656","3879:35660","3879:35669"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":242,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35675":{"id":"3879:35675","type":"FRAME","fields":{"parentId":"3879:35653","childrenIds":["3879:35676","3879:35679"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":430},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35680":{"id":"3879:35680","type":"FRAME","fields":{"parentId":"3879:35653","childrenIds":["3879:35681","3879:35682","3879:35683"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":701},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35687":{"id":"3879:35687","type":"FRAME","fields":{"parentId":"3879:35686","childrenIds":["3879:35688","3879:35689"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35691":{"id":"3879:35691","type":"FRAME","fields":{"parentId":"3879:35686","childrenIds":["3879:35692","3879:35693"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35695":{"id":"3879:35695","type":"FRAME","fields":{"parentId":"3879:35686","childrenIds":["3879:35696","3879:35697"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35699":{"id":"3879:35699","type":"FRAME","fields":{"parentId":"3879:35686","childrenIds":["3879:35700","3879:35701"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35703":{"id":"3879:35703","type":"FRAME","fields":{"parentId":"3879:35686","childrenIds":["3879:35704","3879:35705"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35708":{"id":"3879:35708","type":"FRAME","fields":{"parentId":"3879:35707","childrenIds":["3879:35709"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}},"color":{"b":0.8907090425491333,"g":0.9080576300621033,"r":0.9278846383094788},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35710":{"id":"3879:35710","type":"FRAME","fields":{"parentId":"3879:35707","childrenIds":["3879:35711"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35713":{"id":"3879:35713","type":"FRAME","fields":{"parentId":"3879:35712","childrenIds":["3879:35714","3879:35725","3879:35727"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":-8},"radius":20,"showShadowBehindNode":false,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":369,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":" B : STORY-F-DETAIL #modify-style","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":360,"x":0,"y":371},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35656":{"id":"3879:35656","type":"FRAME","fields":{"parentId":"3879:35655","childrenIds":["3879:35657","3879:35658","3879:35659"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35660":{"id":"3879:35660","type":"FRAME","fields":{"parentId":"3879:35655","childrenIds":["3879:35661","3879:35662"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35669":{"id":"3879:35669","type":"FRAME","fields":{"parentId":"3879:35655","childrenIds":["3879:35670"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":189},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35676":{"id":"3879:35676","type":"FRAME","fields":{"parentId":"3879:35675","childrenIds":["3879:35677","3879:35678"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35679":{"id":"3879:35679","type":"TEXT","fields":{"parentId":"3879:35675","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35681":{"id":"3879:35681","type":"TEXT","fields":{"parentId":"3879:35680","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35682":{"id":"3879:35682","type":"TEXT","fields":{"parentId":"3879:35680","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35683":{"id":"3879:35683","type":"FRAME","fields":{"parentId":"3879:35680","childrenIds":["3879:35684"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35688":{"id":"3879:35688","type":"INSTANCE","fields":{"parentId":"3879:35687","childrenIds":["I3879:35688;1690:32933","I3879:35688;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35689":{"id":"3879:35689","type":"FRAME","fields":{"parentId":"3879:35687","childrenIds":["3879:35690"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35692":{"id":"3879:35692","type":"INSTANCE","fields":{"parentId":"3879:35691","childrenIds":["I3879:35692;1690:32933","I3879:35692;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35693":{"id":"3879:35693","type":"FRAME","fields":{"parentId":"3879:35691","childrenIds":["3879:35694"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35696":{"id":"3879:35696","type":"INSTANCE","fields":{"parentId":"3879:35695","childrenIds":["I3879:35696;1690:32933","I3879:35696;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35697":{"id":"3879:35697","type":"FRAME","fields":{"parentId":"3879:35695","childrenIds":["3879:35698"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35700":{"id":"3879:35700","type":"INSTANCE","fields":{"parentId":"3879:35699","childrenIds":["I3879:35700;1690:32933","I3879:35700;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35701":{"id":"3879:35701","type":"FRAME","fields":{"parentId":"3879:35699","childrenIds":["3879:35702"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35704":{"id":"3879:35704","type":"INSTANCE","fields":{"parentId":"3879:35703","childrenIds":["I3879:35704;1690:32933","I3879:35704;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35705":{"id":"3879:35705","type":"FRAME","fields":{"parentId":"3879:35703","childrenIds":["3879:35706"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35709":{"id":"3879:35709","type":"TEXT","fields":{"parentId":"3879:35708","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35711":{"id":"3879:35711","type":"TEXT","fields":{"parentId":"3879:35710","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35714":{"id":"3879:35714","type":"FRAME","fields":{"parentId":"3879:35713","childrenIds":["3879:35715","3879:35722","3879:35723","3879:35724"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":357,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315485","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35725":{"id":"3879:35725","type":"FRAME","fields":{"parentId":"3879:35713","childrenIds":["3879:35726"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086076","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":338},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35727":{"id":"3879:35727","type":"FRAME","fields":{"parentId":"3879:35713","childrenIds":["3879:35728"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086077","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":397},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35657":{"id":"3879:35657","type":"TEXT","fields":{"parentId":"3879:35656","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35658":{"id":"3879:35658","type":"TEXT","fields":{"parentId":"3879:35656","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35659":{"id":"3879:35659","type":"INSTANCE","fields":{"parentId":"3879:35656","childrenIds":["I3879:35659;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35661":{"id":"3879:35661","type":"TEXT","fields":{"parentId":"3879:35660","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"교정 옵션을 선택해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 옵션을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":296,"x":16,"y":12,"styledTextSegments":[{"characters":"교정 옵션을 선택해주세요.","end":14,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35662":{"id":"3879:35662","type":"FRAME","fields":{"parentId":"3879:35660","childrenIds":["3879:35663","3879:35666"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35670":{"id":"3879:35670","type":"FRAME","fields":{"parentId":"3879:35669","childrenIds":["3879:35671","3879:35672","3879:35673"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35677":{"id":"3879:35677","type":"INSTANCE","fields":{"parentId":"3879:35676","childrenIds":["I3879:35677;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35678":{"id":"3879:35678","type":"TEXT","fields":{"parentId":"3879:35676","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35684":{"id":"3879:35684","type":"FRAME","fields":{"parentId":"3879:35683","childrenIds":["3879:35685"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32933":{"id":"I3879:35688;1690:32933","type":"TEXT","fields":{"parentId":"3879:35688","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32948":{"id":"I3879:35688;1690:32948","type":"FRAME","fields":{"parentId":"3879:35688","childrenIds":["I3879:35688;1690:32934","I3879:35688;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35690":{"id":"3879:35690","type":"TEXT","fields":{"parentId":"3879:35689","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32933":{"id":"I3879:35692;1690:32933","type":"TEXT","fields":{"parentId":"3879:35692","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32948":{"id":"I3879:35692;1690:32948","type":"FRAME","fields":{"parentId":"3879:35692","childrenIds":["I3879:35692;1690:32934","I3879:35692;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35694":{"id":"3879:35694","type":"TEXT","fields":{"parentId":"3879:35693","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32933":{"id":"I3879:35696;1690:32933","type":"TEXT","fields":{"parentId":"3879:35696","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32948":{"id":"I3879:35696;1690:32948","type":"FRAME","fields":{"parentId":"3879:35696","childrenIds":["I3879:35696;1690:32934","I3879:35696;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35698":{"id":"3879:35698","type":"TEXT","fields":{"parentId":"3879:35697","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32933":{"id":"I3879:35700;1690:32933","type":"TEXT","fields":{"parentId":"3879:35700","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32948":{"id":"I3879:35700;1690:32948","type":"FRAME","fields":{"parentId":"3879:35700","childrenIds":["I3879:35700;1690:32934","I3879:35700;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35702":{"id":"3879:35702","type":"TEXT","fields":{"parentId":"3879:35701","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32933":{"id":"I3879:35704;1690:32933","type":"TEXT","fields":{"parentId":"3879:35704","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32948":{"id":"I3879:35704;1690:32948","type":"FRAME","fields":{"parentId":"3879:35704","childrenIds":["I3879:35704;1690:32934","I3879:35704;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35706":{"id":"3879:35706","type":"TEXT","fields":{"parentId":"3879:35705","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35715":{"id":"3879:35715","type":"FRAME","fields":{"parentId":"3879:35714","childrenIds":["3879:35716","3879:35719"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086070","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35722":{"id":"3879:35722","type":"INSTANCE","fields":{"parentId":"3879:35714","childrenIds":["I3879:35722;137:5963","I3879:35722;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":0,"y":98},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35723":{"id":"3879:35723","type":"INSTANCE","fields":{"parentId":"3879:35714","childrenIds":["I3879:35723;137:5978","I3879:35723;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":179},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35724":{"id":"3879:35724","type":"INSTANCE","fields":{"parentId":"3879:35714","childrenIds":["I3879:35724;137:5978","I3879:35724;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 3","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":262},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35726":{"id":"3879:35726","type":"TEXT","fields":{"parentId":"3879:35725","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35728":{"id":"3879:35728","type":"TEXT","fields":{"parentId":"3879:35727","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2028":{"id":"I3879:35659;17:2028","type":"GROUP","fields":{"parentId":"3879:35659","childrenIds":["I3879:35659;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35663":{"id":"3879:35663","type":"FRAME","fields":{"parentId":"3879:35662","childrenIds":["3879:35664","3879:35665"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35666":{"id":"3879:35666","type":"FRAME","fields":{"parentId":"3879:35662","childrenIds":["3879:35667","3879:35668"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35671":{"id":"3879:35671","type":"TEXT","fields":{"parentId":"3879:35670","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35672":{"id":"3879:35672","type":"TEXT","fields":{"parentId":"3879:35670","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35673":{"id":"3879:35673","type":"FRAME","fields":{"parentId":"3879:35670","childrenIds":["3879:35674"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35677;20:3849":{"id":"I3879:35677;20:3849","type":"VECTOR","fields":{"parentId":"3879:35677","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35685":{"id":"3879:35685","type":"VECTOR","fields":{"parentId":"3879:35684","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934":{"id":"I3879:35688;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35688;1690:32948","childrenIds":["I3879:35688;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32947":{"id":"I3879:35688;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35688;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934":{"id":"I3879:35692;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35692;1690:32948","childrenIds":["I3879:35692;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32947":{"id":"I3879:35692;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35692;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934":{"id":"I3879:35696;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35696;1690:32948","childrenIds":["I3879:35696;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32947":{"id":"I3879:35696;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35696;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934":{"id":"I3879:35700;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35700;1690:32948","childrenIds":["I3879:35700;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32947":{"id":"I3879:35700;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35700;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934":{"id":"I3879:35704;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35704;1690:32948","childrenIds":["I3879:35704;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32947":{"id":"I3879:35704;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35704;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35716":{"id":"3879:35716","type":"FRAME","fields":{"parentId":"3879:35715","childrenIds":["3879:35717","3879:35718"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":238,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35719":{"id":"3879:35719","type":"FRAME","fields":{"parentId":"3879:35715","childrenIds":["3879:35720"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":44,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":44,"x":292,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5963":{"id":"I3879:35722;137:5963","type":"INSTANCE","fields":{"parentId":"3879:35722","childrenIds":["I3879:35722;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5960":{"id":"I3879:35722;137:5960","type":"FRAME","fields":{"parentId":"3879:35722","childrenIds":["I3879:35722;137:5967","I3879:35722;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":123,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;137:5978":{"id":"I3879:35723;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35723","childrenIds":["I3879:35723;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;137:5949":{"id":"I3879:35723;137:5949","type":"FRAME","fields":{"parentId":"3879:35723","childrenIds":["I3879:35723;98:3483","I3879:35723;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":149,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;137:5978":{"id":"I3879:35724;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35724","childrenIds":["I3879:35724;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;137:5949":{"id":"I3879:35724;137:5949","type":"FRAME","fields":{"parentId":"3879:35724","childrenIds":["I3879:35724;98:3483","I3879:35724;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":110,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2029":{"id":"I3879:35659;17:2029","type":"GROUP","fields":{"parentId":"I3879:35659;17:2028","childrenIds":["I3879:35659;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35664":{"id":"3879:35664","type":"INSTANCE","fields":{"parentId":"3879:35663","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35665":{"id":"3879:35665","type":"TEXT","fields":{"parentId":"3879:35663","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 편집자에게 다듬기 맡기기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 편집자에게 다듬기 맡기기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":176,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 편집자에게 다듬기 맡기기","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35667":{"id":"3879:35667","type":"INSTANCE","fields":{"parentId":"3879:35666","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35668":{"id":"3879:35668","type":"TEXT","fields":{"parentId":"3879:35666","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 최대한 유지하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 최대한 유지하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":149,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 최대한 유지하기","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35674":{"id":"3879:35674","type":"VECTOR","fields":{"parentId":"3879:35673","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2028":{"id":"I3879:35688;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934","childrenIds":["I3879:35688;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2028":{"id":"I3879:35692;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934","childrenIds":["I3879:35692;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2028":{"id":"I3879:35696;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934","childrenIds":["I3879:35696;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2028":{"id":"I3879:35700;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934","childrenIds":["I3879:35700;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2028":{"id":"I3879:35704;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934","childrenIds":["I3879:35704;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35717":{"id":"3879:35717","type":"TEXT","fields":{"parentId":"3879:35716","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35718":{"id":"3879:35718","type":"TEXT","fields":{"parentId":"3879:35716","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"책 전체에 적용할 문체를 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"책 전체에 적용할 문체를 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":238,"x":0,"y":32,"styledTextSegments":[{"characters":"책 전체","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에 적용할 문체를 설정해주세요.","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35720":{"id":"3879:35720","type":"FRAME","fields":{"parentId":"3879:35719","childrenIds":["3879:35721"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":34,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5963;68:6227":{"id":"I3879:35722;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:35722;137:5963","childrenIds":["I3879:35722;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5967":{"id":"I3879:35722;137:5967","type":"TEXT","fields":{"parentId":"I3879:35722;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5962":{"id":"I3879:35722;137:5962","type":"TEXT","fields":{"parentId":"I3879:35722;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"차분하고 담백한 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":123,"x":0,"y":33,"styledTextSegments":[{"characters":"차분하고 담백한 문체","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;137:5978;68:6227":{"id":"I3879:35723;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35723;137:5978","childrenIds":["I3879:35723;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;98:3483":{"id":"I3879:35723;98:3483","type":"TEXT","fields":{"parentId":"I3879:35723;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"서정체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"서정체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;137:5945":{"id":"I3879:35723;137:5945","type":"TEXT","fields":{"parentId":"I3879:35723;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"감성적이고 부드러운 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":149,"x":0,"y":34,"styledTextSegments":[{"characters":"감성적이고 부드러운 문체","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;137:5978;68:6227":{"id":"I3879:35724;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35724;137:5978","childrenIds":["I3879:35724;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;98:3483":{"id":"I3879:35724;98:3483","type":"TEXT","fields":{"parentId":"I3879:35724;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"강건체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"강건체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;137:5945":{"id":"I3879:35724;137:5945","type":"TEXT","fields":{"parentId":"I3879:35724;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"단호하고 힘찬 문체","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":110,"x":0,"y":34,"styledTextSegments":[{"characters":"단호하고 힘찬 문체","end":10,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2039":{"id":"I3879:35659;17:2039","type":"GROUP","fields":{"parentId":"I3879:35659;17:2029","childrenIds":["I3879:35659;17:2037","I3879:35659;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2029":{"id":"I3879:35688;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2028","childrenIds":["I3879:35688;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2029":{"id":"I3879:35692;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2028","childrenIds":["I3879:35692;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2029":{"id":"I3879:35696;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2028","childrenIds":["I3879:35696;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2029":{"id":"I3879:35700;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2028","childrenIds":["I3879:35700;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2029":{"id":"I3879:35704;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2028","childrenIds":["I3879:35704;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35721":{"id":"3879:35721","type":"VECTOR","fields":{"parentId":"3879:35720","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":15.99999713897705,"x":4.000001907348633,"y":3.999999523162842},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35722;137:5963;68:6228":{"id":"I3879:35722;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35722;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35723;137:5978;68:6228":{"id":"I3879:35723;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35723;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35724;137:5978;68:6228":{"id":"I3879:35724;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35724;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2037":{"id":"I3879:35659;17:2037","type":"GROUP","fields":{"parentId":"I3879:35659;17:2039","childrenIds":["I3879:35659;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2030":{"id":"I3879:35659;17:2030","type":"GROUP","fields":{"parentId":"I3879:35659;17:2039","childrenIds":["I3879:35659;17:2031","I3879:35659;17:2033","I3879:35659;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2039":{"id":"I3879:35688;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2029","childrenIds":["I3879:35688;1690:32934;17:2037","I3879:35688;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2039":{"id":"I3879:35692;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2029","childrenIds":["I3879:35692;1690:32934;17:2037","I3879:35692;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2039":{"id":"I3879:35696;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2029","childrenIds":["I3879:35696;1690:32934;17:2037","I3879:35696;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2039":{"id":"I3879:35700;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2029","childrenIds":["I3879:35700;1690:32934;17:2037","I3879:35700;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2039":{"id":"I3879:35704;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2029","childrenIds":["I3879:35704;1690:32934;17:2037","I3879:35704;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2038":{"id":"I3879:35659;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35659;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2031":{"id":"I3879:35659;17:2031","type":"GROUP","fields":{"parentId":"I3879:35659;17:2030","childrenIds":["I3879:35659;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2033":{"id":"I3879:35659;17:2033","type":"GROUP","fields":{"parentId":"I3879:35659;17:2030","childrenIds":["I3879:35659;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2035":{"id":"I3879:35659;17:2035","type":"GROUP","fields":{"parentId":"I3879:35659;17:2030","childrenIds":["I3879:35659;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2037":{"id":"I3879:35688;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2039","childrenIds":["I3879:35688;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2030":{"id":"I3879:35688;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2039","childrenIds":["I3879:35688;1690:32934;17:2031","I3879:35688;1690:32934;17:2033","I3879:35688;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2037":{"id":"I3879:35692;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2039","childrenIds":["I3879:35692;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2030":{"id":"I3879:35692;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2039","childrenIds":["I3879:35692;1690:32934;17:2031","I3879:35692;1690:32934;17:2033","I3879:35692;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2037":{"id":"I3879:35696;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2039","childrenIds":["I3879:35696;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2030":{"id":"I3879:35696;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2039","childrenIds":["I3879:35696;1690:32934;17:2031","I3879:35696;1690:32934;17:2033","I3879:35696;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2037":{"id":"I3879:35700;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2039","childrenIds":["I3879:35700;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2030":{"id":"I3879:35700;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2039","childrenIds":["I3879:35700;1690:32934;17:2031","I3879:35700;1690:32934;17:2033","I3879:35700;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2037":{"id":"I3879:35704;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2039","childrenIds":["I3879:35704;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2030":{"id":"I3879:35704;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2039","childrenIds":["I3879:35704;1690:32934;17:2031","I3879:35704;1690:32934;17:2033","I3879:35704;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2032":{"id":"I3879:35659;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35659;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2034":{"id":"I3879:35659;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35659;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35659;17:2036":{"id":"I3879:35659;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35659;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2038":{"id":"I3879:35688;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35688;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2031":{"id":"I3879:35688;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2030","childrenIds":["I3879:35688;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2033":{"id":"I3879:35688;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2030","childrenIds":["I3879:35688;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2035":{"id":"I3879:35688;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35688;1690:32934;17:2030","childrenIds":["I3879:35688;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2038":{"id":"I3879:35692;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35692;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2031":{"id":"I3879:35692;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2030","childrenIds":["I3879:35692;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2033":{"id":"I3879:35692;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2030","childrenIds":["I3879:35692;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2035":{"id":"I3879:35692;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35692;1690:32934;17:2030","childrenIds":["I3879:35692;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2038":{"id":"I3879:35696;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35696;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2031":{"id":"I3879:35696;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2030","childrenIds":["I3879:35696;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2033":{"id":"I3879:35696;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2030","childrenIds":["I3879:35696;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2035":{"id":"I3879:35696;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35696;1690:32934;17:2030","childrenIds":["I3879:35696;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2038":{"id":"I3879:35700;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35700;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2031":{"id":"I3879:35700;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2030","childrenIds":["I3879:35700;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2033":{"id":"I3879:35700;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2030","childrenIds":["I3879:35700;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2035":{"id":"I3879:35700;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35700;1690:32934;17:2030","childrenIds":["I3879:35700;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2038":{"id":"I3879:35704;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35704;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2031":{"id":"I3879:35704;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2030","childrenIds":["I3879:35704;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2033":{"id":"I3879:35704;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2030","childrenIds":["I3879:35704;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2035":{"id":"I3879:35704;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35704;1690:32934;17:2030","childrenIds":["I3879:35704;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2032":{"id":"I3879:35688;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35688;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2034":{"id":"I3879:35688;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35688;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35688;1690:32934;17:2036":{"id":"I3879:35688;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35688;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2032":{"id":"I3879:35692;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35692;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2034":{"id":"I3879:35692;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35692;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35692;1690:32934;17:2036":{"id":"I3879:35692;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35692;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2032":{"id":"I3879:35696;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35696;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2034":{"id":"I3879:35696;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35696;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35696;1690:32934;17:2036":{"id":"I3879:35696;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35696;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2032":{"id":"I3879:35700;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35700;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2034":{"id":"I3879:35700;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35700;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35700;1690:32934;17:2036":{"id":"I3879:35700;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35700;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2032":{"id":"I3879:35704;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35704;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2034":{"id":"I3879:35704;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35704;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35704;1690:32934;17:2036":{"id":"I3879:35704;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35704;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:278:3649","name":"primaryBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:63:1980","name":"gray200","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35729.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35729.json new file mode 100644 index 0000000..cd70d62 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35729.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35729","capture":"official Figma MCP use_figma read-only projection","nodeCount":181},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35729"],"nodes":{"3879:35729":{"id":"3879:35729","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35730","3879:35763","3879:35784","3879:35789"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":3241,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35730":{"id":"3879:35730","type":"FRAME","fields":{"parentId":"3879:35729","childrenIds":["3879:35731","3879:35732","3879:35752","3879:35757"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":885,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35763":{"id":"3879:35763","type":"FRAME","fields":{"parentId":"3879:35729","childrenIds":["3879:35764","3879:35768","3879:35772","3879:35776","3879:35780"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":885},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35784":{"id":"3879:35784","type":"FRAME","fields":{"parentId":"3879:35729","childrenIds":["3879:35785","3879:35787"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35789":{"id":"3879:35789","type":"FRAME","fields":{"parentId":"3879:35729","childrenIds":["3879:35790"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35731":{"id":"3879:35731","type":"TEXT","fields":{"parentId":"3879:35730","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35732":{"id":"3879:35732","type":"FRAME","fields":{"parentId":"3879:35730","childrenIds":["3879:35733","3879:35737","3879:35746"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":242,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35752":{"id":"3879:35752","type":"FRAME","fields":{"parentId":"3879:35730","childrenIds":["3879:35753","3879:35756"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":430},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35757":{"id":"3879:35757","type":"FRAME","fields":{"parentId":"3879:35730","childrenIds":["3879:35758","3879:35759","3879:35760"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":701},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35764":{"id":"3879:35764","type":"FRAME","fields":{"parentId":"3879:35763","childrenIds":["3879:35765","3879:35766"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35768":{"id":"3879:35768","type":"FRAME","fields":{"parentId":"3879:35763","childrenIds":["3879:35769","3879:35770"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35772":{"id":"3879:35772","type":"FRAME","fields":{"parentId":"3879:35763","childrenIds":["3879:35773","3879:35774"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35776":{"id":"3879:35776","type":"FRAME","fields":{"parentId":"3879:35763","childrenIds":["3879:35777","3879:35778"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35780":{"id":"3879:35780","type":"FRAME","fields":{"parentId":"3879:35763","childrenIds":["3879:35781","3879:35782"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35785":{"id":"3879:35785","type":"FRAME","fields":{"parentId":"3879:35784","childrenIds":["3879:35786"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}},"color":{"b":0.8907090425491333,"g":0.9080576300621033,"r":0.9278846383094788},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35787":{"id":"3879:35787","type":"FRAME","fields":{"parentId":"3879:35784","childrenIds":["3879:35788"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35790":{"id":"3879:35790","type":"FRAME","fields":{"parentId":"3879:35789","childrenIds":["3879:35791","3879:35801","3879:35803"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":-8},"radius":20,"showShadowBehindNode":false,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":286,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":" B : STORY-F-DETAIL #modify-style","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":360,"x":0,"y":454},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35733":{"id":"3879:35733","type":"FRAME","fields":{"parentId":"3879:35732","childrenIds":["3879:35734","3879:35735","3879:35736"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35737":{"id":"3879:35737","type":"FRAME","fields":{"parentId":"3879:35732","childrenIds":["3879:35738","3879:35739"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35746":{"id":"3879:35746","type":"FRAME","fields":{"parentId":"3879:35732","childrenIds":["3879:35747"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":189},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35753":{"id":"3879:35753","type":"FRAME","fields":{"parentId":"3879:35752","childrenIds":["3879:35754","3879:35755"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35756":{"id":"3879:35756","type":"TEXT","fields":{"parentId":"3879:35752","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35758":{"id":"3879:35758","type":"TEXT","fields":{"parentId":"3879:35757","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35759":{"id":"3879:35759","type":"TEXT","fields":{"parentId":"3879:35757","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35760":{"id":"3879:35760","type":"FRAME","fields":{"parentId":"3879:35757","childrenIds":["3879:35761"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35765":{"id":"3879:35765","type":"INSTANCE","fields":{"parentId":"3879:35764","childrenIds":["I3879:35765;1690:32933","I3879:35765;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35766":{"id":"3879:35766","type":"FRAME","fields":{"parentId":"3879:35764","childrenIds":["3879:35767"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35769":{"id":"3879:35769","type":"INSTANCE","fields":{"parentId":"3879:35768","childrenIds":["I3879:35769;1690:32933","I3879:35769;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35770":{"id":"3879:35770","type":"FRAME","fields":{"parentId":"3879:35768","childrenIds":["3879:35771"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35773":{"id":"3879:35773","type":"INSTANCE","fields":{"parentId":"3879:35772","childrenIds":["I3879:35773;1690:32933","I3879:35773;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35774":{"id":"3879:35774","type":"FRAME","fields":{"parentId":"3879:35772","childrenIds":["3879:35775"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35777":{"id":"3879:35777","type":"INSTANCE","fields":{"parentId":"3879:35776","childrenIds":["I3879:35777;1690:32933","I3879:35777;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35778":{"id":"3879:35778","type":"FRAME","fields":{"parentId":"3879:35776","childrenIds":["3879:35779"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35781":{"id":"3879:35781","type":"INSTANCE","fields":{"parentId":"3879:35780","childrenIds":["I3879:35781;1690:32933","I3879:35781;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35782":{"id":"3879:35782","type":"FRAME","fields":{"parentId":"3879:35780","childrenIds":["3879:35783"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35786":{"id":"3879:35786","type":"TEXT","fields":{"parentId":"3879:35785","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35788":{"id":"3879:35788","type":"TEXT","fields":{"parentId":"3879:35787","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35791":{"id":"3879:35791","type":"FRAME","fields":{"parentId":"3879:35790","childrenIds":["3879:35792","3879:37231","3879:37232"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":274,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315486","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35801":{"id":"3879:35801","type":"FRAME","fields":{"parentId":"3879:35790","childrenIds":["3879:35802"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086076","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":338},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35803":{"id":"3879:35803","type":"FRAME","fields":{"parentId":"3879:35790","childrenIds":["3879:35804"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086077","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":397},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35734":{"id":"3879:35734","type":"TEXT","fields":{"parentId":"3879:35733","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35735":{"id":"3879:35735","type":"TEXT","fields":{"parentId":"3879:35733","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35736":{"id":"3879:35736","type":"INSTANCE","fields":{"parentId":"3879:35733","childrenIds":["I3879:35736;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35738":{"id":"3879:35738","type":"TEXT","fields":{"parentId":"3879:35737","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"교정 옵션을 선택해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 옵션을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":296,"x":16,"y":12,"styledTextSegments":[{"characters":"교정 옵션을 선택해주세요.","end":14,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35739":{"id":"3879:35739","type":"FRAME","fields":{"parentId":"3879:35737","childrenIds":["3879:35740","3879:35743"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35747":{"id":"3879:35747","type":"FRAME","fields":{"parentId":"3879:35746","childrenIds":["3879:35748","3879:35749","3879:35750"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35754":{"id":"3879:35754","type":"INSTANCE","fields":{"parentId":"3879:35753","childrenIds":["I3879:35754;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35755":{"id":"3879:35755","type":"TEXT","fields":{"parentId":"3879:35753","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35761":{"id":"3879:35761","type":"FRAME","fields":{"parentId":"3879:35760","childrenIds":["3879:35762"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32933":{"id":"I3879:35765;1690:32933","type":"TEXT","fields":{"parentId":"3879:35765","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32948":{"id":"I3879:35765;1690:32948","type":"FRAME","fields":{"parentId":"3879:35765","childrenIds":["I3879:35765;1690:32934","I3879:35765;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35767":{"id":"3879:35767","type":"TEXT","fields":{"parentId":"3879:35766","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32933":{"id":"I3879:35769;1690:32933","type":"TEXT","fields":{"parentId":"3879:35769","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32948":{"id":"I3879:35769;1690:32948","type":"FRAME","fields":{"parentId":"3879:35769","childrenIds":["I3879:35769;1690:32934","I3879:35769;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35771":{"id":"3879:35771","type":"TEXT","fields":{"parentId":"3879:35770","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32933":{"id":"I3879:35773;1690:32933","type":"TEXT","fields":{"parentId":"3879:35773","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32948":{"id":"I3879:35773;1690:32948","type":"FRAME","fields":{"parentId":"3879:35773","childrenIds":["I3879:35773;1690:32934","I3879:35773;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35775":{"id":"3879:35775","type":"TEXT","fields":{"parentId":"3879:35774","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32933":{"id":"I3879:35777;1690:32933","type":"TEXT","fields":{"parentId":"3879:35777","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32948":{"id":"I3879:35777;1690:32948","type":"FRAME","fields":{"parentId":"3879:35777","childrenIds":["I3879:35777;1690:32934","I3879:35777;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35779":{"id":"3879:35779","type":"TEXT","fields":{"parentId":"3879:35778","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32933":{"id":"I3879:35781;1690:32933","type":"TEXT","fields":{"parentId":"3879:35781","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32948":{"id":"I3879:35781;1690:32948","type":"FRAME","fields":{"parentId":"3879:35781","childrenIds":["I3879:35781;1690:32934","I3879:35781;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35783":{"id":"3879:35783","type":"TEXT","fields":{"parentId":"3879:35782","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35792":{"id":"3879:35792","type":"FRAME","fields":{"parentId":"3879:35791","childrenIds":["3879:35793","3879:35796"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086070","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:37231":{"id":"3879:37231","type":"INSTANCE","fields":{"parentId":"3879:35791","childrenIds":["I3879:37231;137:5963","I3879:37231;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 7","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":0,"y":98},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:37232":{"id":"3879:37232","type":"INSTANCE","fields":{"parentId":"3879:35791","childrenIds":["I3879:37232;137:5978","I3879:37232;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":179},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35802":{"id":"3879:35802","type":"TEXT","fields":{"parentId":"3879:35801","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35804":{"id":"3879:35804","type":"TEXT","fields":{"parentId":"3879:35803","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2028":{"id":"I3879:35736;17:2028","type":"GROUP","fields":{"parentId":"3879:35736","childrenIds":["I3879:35736;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35740":{"id":"3879:35740","type":"FRAME","fields":{"parentId":"3879:35739","childrenIds":["3879:35741","3879:35742"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35743":{"id":"3879:35743","type":"FRAME","fields":{"parentId":"3879:35739","childrenIds":["3879:35744","3879:35745"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35748":{"id":"3879:35748","type":"TEXT","fields":{"parentId":"3879:35747","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35749":{"id":"3879:35749","type":"TEXT","fields":{"parentId":"3879:35747","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35750":{"id":"3879:35750","type":"FRAME","fields":{"parentId":"3879:35747","childrenIds":["3879:35751"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35754;20:3849":{"id":"I3879:35754;20:3849","type":"VECTOR","fields":{"parentId":"3879:35754","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35762":{"id":"3879:35762","type":"VECTOR","fields":{"parentId":"3879:35761","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934":{"id":"I3879:35765;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35765;1690:32948","childrenIds":["I3879:35765;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32947":{"id":"I3879:35765;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35765;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934":{"id":"I3879:35769;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35769;1690:32948","childrenIds":["I3879:35769;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32947":{"id":"I3879:35769;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35769;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934":{"id":"I3879:35773;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35773;1690:32948","childrenIds":["I3879:35773;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32947":{"id":"I3879:35773;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35773;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934":{"id":"I3879:35777;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35777;1690:32948","childrenIds":["I3879:35777;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32947":{"id":"I3879:35777;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35777;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934":{"id":"I3879:35781;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35781;1690:32948","childrenIds":["I3879:35781;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32947":{"id":"I3879:35781;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35781;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35793":{"id":"3879:35793","type":"FRAME","fields":{"parentId":"3879:35792","childrenIds":["3879:35794","3879:35795"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":311,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35796":{"id":"3879:35796","type":"FRAME","fields":{"parentId":"3879:35792","childrenIds":["3879:35797"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":44,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":44,"x":292,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5963":{"id":"I3879:37231;137:5963","type":"INSTANCE","fields":{"parentId":"3879:37231","childrenIds":["I3879:37231;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5960":{"id":"I3879:37231;137:5960","type":"FRAME","fields":{"parentId":"3879:37231","childrenIds":["I3879:37231;137:5967","I3879:37231;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;137:5978":{"id":"I3879:37232;137:5978","type":"INSTANCE","fields":{"parentId":"3879:37232","childrenIds":["I3879:37232;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;137:5949":{"id":"I3879:37232;137:5949","type":"FRAME","fields":{"parentId":"3879:37232","childrenIds":["I3879:37232;98:3483","I3879:37232;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2029":{"id":"I3879:35736;17:2029","type":"GROUP","fields":{"parentId":"I3879:35736;17:2028","childrenIds":["I3879:35736;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35741":{"id":"3879:35741","type":"INSTANCE","fields":{"parentId":"3879:35740","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35742":{"id":"3879:35742","type":"TEXT","fields":{"parentId":"3879:35740","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 편집자에게 다듬기 맡기기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 편집자에게 다듬기 맡기기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":176,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 편집자에게 다듬기 맡기기","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35744":{"id":"3879:35744","type":"INSTANCE","fields":{"parentId":"3879:35743","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35745":{"id":"3879:35745","type":"TEXT","fields":{"parentId":"3879:35743","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 최대한 유지하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 최대한 유지하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":149,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 최대한 유지하기","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35751":{"id":"3879:35751","type":"VECTOR","fields":{"parentId":"3879:35750","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2028":{"id":"I3879:35765;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934","childrenIds":["I3879:35765;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2028":{"id":"I3879:35769;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934","childrenIds":["I3879:35769;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2028":{"id":"I3879:35773;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934","childrenIds":["I3879:35773;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2028":{"id":"I3879:35777;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934","childrenIds":["I3879:35777;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2028":{"id":"I3879:35781;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934","childrenIds":["I3879:35781;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35794":{"id":"3879:35794","type":"TEXT","fields":{"parentId":"3879:35793","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"교정 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"교정 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35795":{"id":"3879:35795","type":"TEXT","fields":{"parentId":"3879:35793","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":311,"x":0,"y":32,"styledTextSegments":[{"characters":"이번 이야기","end":6,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에만 적용할 교정 방법을 설정해주세요.","end":27,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":6,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35797":{"id":"3879:35797","type":"FRAME","fields":{"parentId":"3879:35796","childrenIds":["3879:35798"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":34,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5963;68:6227":{"id":"I3879:37231;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:37231;137:5963","childrenIds":["I3879:37231;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5967":{"id":"I3879:37231;137:5967","type":"TEXT","fields":{"parentId":"I3879:37231;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자와 함께 문체 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":203,"x":0,"y":0,"styledTextSegments":[{"characters":"AI 담당자와 함께 문체 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5962":{"id":"I3879:37231;137:5962","type":"TEXT","fields":{"parentId":"I3879:37231;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":33,"styledTextSegments":[{"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","end":22,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;137:5978;68:6227":{"id":"I3879:37232;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:37232;137:5978","childrenIds":["I3879:37232;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;98:3483":{"id":"I3879:37232;98:3483","type":"TEXT","fields":{"parentId":"I3879:37232;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 그대로 맞춤법만 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":218,"x":0,"y":0,"styledTextSegments":[{"characters":"내 문장 그대로 맞춤법만 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;137:5945":{"id":"I3879:37232;137:5945","type":"TEXT","fields":{"parentId":"I3879:37232;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"입력하신 문장 그대로의 느낌을 담아내요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":34,"styledTextSegments":[{"characters":"입력하신 문장 그대로의 느낌을 담아내요","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2039":{"id":"I3879:35736;17:2039","type":"GROUP","fields":{"parentId":"I3879:35736;17:2029","childrenIds":["I3879:35736;17:2037","I3879:35736;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2029":{"id":"I3879:35765;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2028","childrenIds":["I3879:35765;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2029":{"id":"I3879:35769;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2028","childrenIds":["I3879:35769;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2029":{"id":"I3879:35773;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2028","childrenIds":["I3879:35773;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2029":{"id":"I3879:35777;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2028","childrenIds":["I3879:35777;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2029":{"id":"I3879:35781;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2028","childrenIds":["I3879:35781;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35798":{"id":"3879:35798","type":"VECTOR","fields":{"parentId":"3879:35797","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":15.99999713897705,"x":4.000001907348633,"y":3.999999523162842},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37231;137:5963;68:6228":{"id":"I3879:37231;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:37231;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:37232;137:5978;68:6228":{"id":"I3879:37232;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:37232;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2037":{"id":"I3879:35736;17:2037","type":"GROUP","fields":{"parentId":"I3879:35736;17:2039","childrenIds":["I3879:35736;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2030":{"id":"I3879:35736;17:2030","type":"GROUP","fields":{"parentId":"I3879:35736;17:2039","childrenIds":["I3879:35736;17:2031","I3879:35736;17:2033","I3879:35736;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2039":{"id":"I3879:35765;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2029","childrenIds":["I3879:35765;1690:32934;17:2037","I3879:35765;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2039":{"id":"I3879:35769;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2029","childrenIds":["I3879:35769;1690:32934;17:2037","I3879:35769;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2039":{"id":"I3879:35773;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2029","childrenIds":["I3879:35773;1690:32934;17:2037","I3879:35773;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2039":{"id":"I3879:35777;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2029","childrenIds":["I3879:35777;1690:32934;17:2037","I3879:35777;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2039":{"id":"I3879:35781;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2029","childrenIds":["I3879:35781;1690:32934;17:2037","I3879:35781;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2038":{"id":"I3879:35736;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35736;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2031":{"id":"I3879:35736;17:2031","type":"GROUP","fields":{"parentId":"I3879:35736;17:2030","childrenIds":["I3879:35736;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2033":{"id":"I3879:35736;17:2033","type":"GROUP","fields":{"parentId":"I3879:35736;17:2030","childrenIds":["I3879:35736;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2035":{"id":"I3879:35736;17:2035","type":"GROUP","fields":{"parentId":"I3879:35736;17:2030","childrenIds":["I3879:35736;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2037":{"id":"I3879:35765;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2039","childrenIds":["I3879:35765;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2030":{"id":"I3879:35765;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2039","childrenIds":["I3879:35765;1690:32934;17:2031","I3879:35765;1690:32934;17:2033","I3879:35765;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2037":{"id":"I3879:35769;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2039","childrenIds":["I3879:35769;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2030":{"id":"I3879:35769;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2039","childrenIds":["I3879:35769;1690:32934;17:2031","I3879:35769;1690:32934;17:2033","I3879:35769;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2037":{"id":"I3879:35773;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2039","childrenIds":["I3879:35773;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2030":{"id":"I3879:35773;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2039","childrenIds":["I3879:35773;1690:32934;17:2031","I3879:35773;1690:32934;17:2033","I3879:35773;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2037":{"id":"I3879:35777;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2039","childrenIds":["I3879:35777;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2030":{"id":"I3879:35777;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2039","childrenIds":["I3879:35777;1690:32934;17:2031","I3879:35777;1690:32934;17:2033","I3879:35777;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2037":{"id":"I3879:35781;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2039","childrenIds":["I3879:35781;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2030":{"id":"I3879:35781;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2039","childrenIds":["I3879:35781;1690:32934;17:2031","I3879:35781;1690:32934;17:2033","I3879:35781;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2032":{"id":"I3879:35736;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35736;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2034":{"id":"I3879:35736;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35736;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35736;17:2036":{"id":"I3879:35736;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35736;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2038":{"id":"I3879:35765;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35765;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2031":{"id":"I3879:35765;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2030","childrenIds":["I3879:35765;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2033":{"id":"I3879:35765;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2030","childrenIds":["I3879:35765;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2035":{"id":"I3879:35765;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35765;1690:32934;17:2030","childrenIds":["I3879:35765;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2038":{"id":"I3879:35769;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35769;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2031":{"id":"I3879:35769;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2030","childrenIds":["I3879:35769;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2033":{"id":"I3879:35769;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2030","childrenIds":["I3879:35769;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2035":{"id":"I3879:35769;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35769;1690:32934;17:2030","childrenIds":["I3879:35769;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2038":{"id":"I3879:35773;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35773;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2031":{"id":"I3879:35773;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2030","childrenIds":["I3879:35773;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2033":{"id":"I3879:35773;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2030","childrenIds":["I3879:35773;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2035":{"id":"I3879:35773;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35773;1690:32934;17:2030","childrenIds":["I3879:35773;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2038":{"id":"I3879:35777;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35777;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2031":{"id":"I3879:35777;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2030","childrenIds":["I3879:35777;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2033":{"id":"I3879:35777;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2030","childrenIds":["I3879:35777;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2035":{"id":"I3879:35777;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35777;1690:32934;17:2030","childrenIds":["I3879:35777;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2038":{"id":"I3879:35781;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35781;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2031":{"id":"I3879:35781;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2030","childrenIds":["I3879:35781;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2033":{"id":"I3879:35781;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2030","childrenIds":["I3879:35781;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2035":{"id":"I3879:35781;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35781;1690:32934;17:2030","childrenIds":["I3879:35781;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2032":{"id":"I3879:35765;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35765;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2034":{"id":"I3879:35765;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35765;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35765;1690:32934;17:2036":{"id":"I3879:35765;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35765;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2032":{"id":"I3879:35769;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35769;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2034":{"id":"I3879:35769;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35769;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35769;1690:32934;17:2036":{"id":"I3879:35769;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35769;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2032":{"id":"I3879:35773;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35773;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2034":{"id":"I3879:35773;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35773;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35773;1690:32934;17:2036":{"id":"I3879:35773;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35773;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2032":{"id":"I3879:35777;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35777;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2034":{"id":"I3879:35777;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35777;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35777;1690:32934;17:2036":{"id":"I3879:35777;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35777;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2032":{"id":"I3879:35781;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35781;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2034":{"id":"I3879:35781;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35781;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35781;1690:32934;17:2036":{"id":"I3879:35781;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35781;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:278:3649","name":"primaryBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1980","name":"gray200","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35887.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35887.json new file mode 100644 index 0000000..f4f681e --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35887.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35887","capture":"official Figma MCP use_figma read-only projection","nodeCount":210},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35887"],"nodes":{"3879:35887":{"id":"3879:35887","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35888","3879:35921","3879:35942","3879:35947","3879:35969"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":3663,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35888":{"id":"3879:35888","type":"FRAME","fields":{"parentId":"3879:35887","childrenIds":["3879:35889","3879:35890","3879:35910","3879:35915"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":885,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35921":{"id":"3879:35921","type":"FRAME","fields":{"parentId":"3879:35887","childrenIds":["3879:35922","3879:35926","3879:35930","3879:35934","3879:35938"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":885},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35942":{"id":"3879:35942","type":"FRAME","fields":{"parentId":"3879:35887","childrenIds":["3879:35943","3879:35945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35947":{"id":"3879:35947","type":"FRAME","fields":{"parentId":"3879:35887","childrenIds":["3879:35948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35969":{"id":"3879:35969","type":"FRAME","fields":{"parentId":"3879:35887","childrenIds":["3879:35972"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315195","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35889":{"id":"3879:35889","type":"TEXT","fields":{"parentId":"3879:35888","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35890":{"id":"3879:35890","type":"FRAME","fields":{"parentId":"3879:35888","childrenIds":["3879:35891","3879:35895","3879:35904"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":242,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35910":{"id":"3879:35910","type":"FRAME","fields":{"parentId":"3879:35888","childrenIds":["3879:35911","3879:35914"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":430},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35915":{"id":"3879:35915","type":"FRAME","fields":{"parentId":"3879:35888","childrenIds":["3879:35916","3879:35917","3879:35918"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":701},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35922":{"id":"3879:35922","type":"FRAME","fields":{"parentId":"3879:35921","childrenIds":["3879:35923","3879:35924"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35926":{"id":"3879:35926","type":"FRAME","fields":{"parentId":"3879:35921","childrenIds":["3879:35927","3879:35928"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35930":{"id":"3879:35930","type":"FRAME","fields":{"parentId":"3879:35921","childrenIds":["3879:35931","3879:35932"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35934":{"id":"3879:35934","type":"FRAME","fields":{"parentId":"3879:35921","childrenIds":["3879:35935","3879:35936"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35938":{"id":"3879:35938","type":"FRAME","fields":{"parentId":"3879:35921","childrenIds":["3879:35939","3879:35940"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35943":{"id":"3879:35943","type":"FRAME","fields":{"parentId":"3879:35942","childrenIds":["3879:35944"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}},"color":{"b":0.8907090425491333,"g":0.9080576300621033,"r":0.9278846383094788},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35945":{"id":"3879:35945","type":"FRAME","fields":{"parentId":"3879:35942","childrenIds":["3879:35946"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35948":{"id":"3879:35948","type":"FRAME","fields":{"parentId":"3879:35947","childrenIds":["3879:35949","3879:35959","3879:35961","3879:35963","3879:35967","3879:35968"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":-8},"radius":20,"showShadowBehindNode":false,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":569,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":" B : STORY-F-DETAIL #modify-style","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":360,"x":0,"y":171},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35972":{"id":"3879:35972","type":"INSTANCE","fields":{"parentId":"3879:35969","childrenIds":["I3879:35972;68:5150","I3879:35972;68:5159"],"blendMode":"PASS_THROUGH","bottomLeftRadius":20,"bottomRightRadius":20,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"2nd Button#68:0":{"type":"BOOLEAN","value":true},"Slot#2980:0":{"preferredValues":[],"type":"SLOT"}},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"CENTER"},"cornerRadius":20,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":273,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"variantProperties":null,"visible":true,"width":320,"x":20,"y":233.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35891":{"id":"3879:35891","type":"FRAME","fields":{"parentId":"3879:35890","childrenIds":["3879:35892","3879:35893","3879:35894"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35895":{"id":"3879:35895","type":"FRAME","fields":{"parentId":"3879:35890","childrenIds":["3879:35896","3879:35897"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35904":{"id":"3879:35904","type":"FRAME","fields":{"parentId":"3879:35890","childrenIds":["3879:35905"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":189},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35911":{"id":"3879:35911","type":"FRAME","fields":{"parentId":"3879:35910","childrenIds":["3879:35912","3879:35913"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35914":{"id":"3879:35914","type":"TEXT","fields":{"parentId":"3879:35910","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35916":{"id":"3879:35916","type":"TEXT","fields":{"parentId":"3879:35915","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35917":{"id":"3879:35917","type":"TEXT","fields":{"parentId":"3879:35915","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35918":{"id":"3879:35918","type":"FRAME","fields":{"parentId":"3879:35915","childrenIds":["3879:35919"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35923":{"id":"3879:35923","type":"INSTANCE","fields":{"parentId":"3879:35922","childrenIds":["I3879:35923;1690:32933","I3879:35923;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35924":{"id":"3879:35924","type":"FRAME","fields":{"parentId":"3879:35922","childrenIds":["3879:35925"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35927":{"id":"3879:35927","type":"INSTANCE","fields":{"parentId":"3879:35926","childrenIds":["I3879:35927;1690:32933","I3879:35927;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35928":{"id":"3879:35928","type":"FRAME","fields":{"parentId":"3879:35926","childrenIds":["3879:35929"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35931":{"id":"3879:35931","type":"INSTANCE","fields":{"parentId":"3879:35930","childrenIds":["I3879:35931;1690:32933","I3879:35931;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35932":{"id":"3879:35932","type":"FRAME","fields":{"parentId":"3879:35930","childrenIds":["3879:35933"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35935":{"id":"3879:35935","type":"INSTANCE","fields":{"parentId":"3879:35934","childrenIds":["I3879:35935;1690:32933","I3879:35935;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35936":{"id":"3879:35936","type":"FRAME","fields":{"parentId":"3879:35934","childrenIds":["3879:35937"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35939":{"id":"3879:35939","type":"INSTANCE","fields":{"parentId":"3879:35938","childrenIds":["I3879:35939;1690:32933","I3879:35939;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35940":{"id":"3879:35940","type":"FRAME","fields":{"parentId":"3879:35938","childrenIds":["3879:35941"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35944":{"id":"3879:35944","type":"TEXT","fields":{"parentId":"3879:35943","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35946":{"id":"3879:35946","type":"TEXT","fields":{"parentId":"3879:35945","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35949":{"id":"3879:35949","type":"FRAME","fields":{"parentId":"3879:35948","childrenIds":["3879:35950","3879:35957","3879:35958"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":295,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315486","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35959":{"id":"3879:35959","type":"FRAME","fields":{"parentId":"3879:35948","childrenIds":["3879:35960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086076","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":338},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35961":{"id":"3879:35961","type":"FRAME","fields":{"parentId":"3879:35948","childrenIds":["3879:35962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086077","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":397},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35963":{"id":"3879:35963","type":"FRAME","fields":{"parentId":"3879:35948","childrenIds":["3879:35964"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":16,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":16,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086078","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":295},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35967":{"id":"3879:35967","type":"INSTANCE","fields":{"parentId":"3879:35948","childrenIds":["I3879:35967;137:5963","I3879:35967;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":12,"y":393},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35968":{"id":"3879:35968","type":"INSTANCE","fields":{"parentId":"3879:35948","childrenIds":["I3879:35968;137:5978","I3879:35968;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":12,"y":474},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5150":{"id":"I3879:35972;68:5150","type":"FRAME","fields":{"parentId":"3879:35972","childrenIds":["I3879:35972;68:5149","I3879:35972;2980:19280"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":212,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":180,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5159":{"id":"I3879:35972;68:5159","type":"FRAME","fields":{"parentId":"3879:35972","childrenIds":["I3879:35972;68:5153","I3879:35972;68:5157"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086045","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":212},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35892":{"id":"3879:35892","type":"TEXT","fields":{"parentId":"3879:35891","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35893":{"id":"3879:35893","type":"TEXT","fields":{"parentId":"3879:35891","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35894":{"id":"3879:35894","type":"INSTANCE","fields":{"parentId":"3879:35891","childrenIds":["I3879:35894;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35896":{"id":"3879:35896","type":"TEXT","fields":{"parentId":"3879:35895","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"교정 옵션을 선택해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 옵션을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":296,"x":16,"y":12,"styledTextSegments":[{"characters":"교정 옵션을 선택해주세요.","end":14,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35897":{"id":"3879:35897","type":"FRAME","fields":{"parentId":"3879:35895","childrenIds":["3879:35898","3879:35901"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35905":{"id":"3879:35905","type":"FRAME","fields":{"parentId":"3879:35904","childrenIds":["3879:35906","3879:35907","3879:35908"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35912":{"id":"3879:35912","type":"INSTANCE","fields":{"parentId":"3879:35911","childrenIds":["I3879:35912;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35913":{"id":"3879:35913","type":"TEXT","fields":{"parentId":"3879:35911","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35919":{"id":"3879:35919","type":"FRAME","fields":{"parentId":"3879:35918","childrenIds":["3879:35920"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32933":{"id":"I3879:35923;1690:32933","type":"TEXT","fields":{"parentId":"3879:35923","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32948":{"id":"I3879:35923;1690:32948","type":"FRAME","fields":{"parentId":"3879:35923","childrenIds":["I3879:35923;1690:32934","I3879:35923;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35925":{"id":"3879:35925","type":"TEXT","fields":{"parentId":"3879:35924","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32933":{"id":"I3879:35927;1690:32933","type":"TEXT","fields":{"parentId":"3879:35927","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32948":{"id":"I3879:35927;1690:32948","type":"FRAME","fields":{"parentId":"3879:35927","childrenIds":["I3879:35927;1690:32934","I3879:35927;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35929":{"id":"3879:35929","type":"TEXT","fields":{"parentId":"3879:35928","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32933":{"id":"I3879:35931;1690:32933","type":"TEXT","fields":{"parentId":"3879:35931","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32948":{"id":"I3879:35931;1690:32948","type":"FRAME","fields":{"parentId":"3879:35931","childrenIds":["I3879:35931;1690:32934","I3879:35931;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35933":{"id":"3879:35933","type":"TEXT","fields":{"parentId":"3879:35932","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32933":{"id":"I3879:35935;1690:32933","type":"TEXT","fields":{"parentId":"3879:35935","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32948":{"id":"I3879:35935;1690:32948","type":"FRAME","fields":{"parentId":"3879:35935","childrenIds":["I3879:35935;1690:32934","I3879:35935;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35937":{"id":"3879:35937","type":"TEXT","fields":{"parentId":"3879:35936","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32933":{"id":"I3879:35939;1690:32933","type":"TEXT","fields":{"parentId":"3879:35939","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32948":{"id":"I3879:35939;1690:32948","type":"FRAME","fields":{"parentId":"3879:35939","childrenIds":["I3879:35939;1690:32934","I3879:35939;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35941":{"id":"3879:35941","type":"TEXT","fields":{"parentId":"3879:35940","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35950":{"id":"3879:35950","type":"FRAME","fields":{"parentId":"3879:35949","childrenIds":["3879:35951","3879:35954"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":96,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086070","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35957":{"id":"3879:35957","type":"INSTANCE","fields":{"parentId":"3879:35949","childrenIds":["I3879:35957;137:5963","I3879:35957;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":0,"y":96},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35958":{"id":"3879:35958","type":"INSTANCE","fields":{"parentId":"3879:35949","childrenIds":["I3879:35958;137:5978","I3879:35958;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":106,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 6","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":177},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35960":{"id":"3879:35960","type":"TEXT","fields":{"parentId":"3879:35959","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35962":{"id":"3879:35962","type":"TEXT","fields":{"parentId":"3879:35961","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35964":{"id":"3879:35964","type":"FRAME","fields":{"parentId":"3879:35963","childrenIds":["3879:35965","3879:35966"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":311,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5963":{"id":"I3879:35967;137:5963","type":"INSTANCE","fields":{"parentId":"3879:35967","childrenIds":["I3879:35967;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5960":{"id":"I3879:35967;137:5960","type":"FRAME","fields":{"parentId":"3879:35967","childrenIds":["I3879:35967;137:5967","I3879:35967;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;137:5978":{"id":"I3879:35968;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35968","childrenIds":["I3879:35968;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;137:5949":{"id":"I3879:35968;137:5949","type":"FRAME","fields":{"parentId":"3879:35968","childrenIds":["I3879:35968;98:3483","I3879:35968;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5149":{"id":"I3879:35972;68:5149","type":"TEXT","fields":{"parentId":"I3879:35972;68:5150","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"글 다듬기 방식을 변경할까요?","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"제목 영역","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":227,"x":46.5,"y":30,"styledTextSegments":[{"characters":"글 다듬기 방식을 변경할까요?","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;2980:19280":{"id":"I3879:35972;2980:19280","type":"SLOT","fields":{"parentId":"I3879:35972;68:5150","childrenIds":["I3879:35972;2980:19280;3879:35971"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{"slotContentId":"Slot#2980:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":116,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Slot","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":260,"x":30,"y":66},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5153":{"id":"I3879:35972;68:5153","type":"FRAME","fields":{"parentId":"I3879:35972;68:5159","childrenIds":["I3879:35972;68:5154"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5157":{"id":"I3879:35972;68:5157","type":"FRAME","fields":{"parentId":"I3879:35972;68:5159","childrenIds":["I3879:35972;68:5158"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{"visible":"2nd Button#68:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":1,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":160,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2028":{"id":"I3879:35894;17:2028","type":"GROUP","fields":{"parentId":"3879:35894","childrenIds":["I3879:35894;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35898":{"id":"3879:35898","type":"FRAME","fields":{"parentId":"3879:35897","childrenIds":["3879:35899","3879:35900"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35901":{"id":"3879:35901","type":"FRAME","fields":{"parentId":"3879:35897","childrenIds":["3879:35902","3879:35903"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35906":{"id":"3879:35906","type":"TEXT","fields":{"parentId":"3879:35905","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35907":{"id":"3879:35907","type":"TEXT","fields":{"parentId":"3879:35905","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35908":{"id":"3879:35908","type":"FRAME","fields":{"parentId":"3879:35905","childrenIds":["3879:35909"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35912;20:3849":{"id":"I3879:35912;20:3849","type":"VECTOR","fields":{"parentId":"3879:35912","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35920":{"id":"3879:35920","type":"VECTOR","fields":{"parentId":"3879:35919","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934":{"id":"I3879:35923;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35923;1690:32948","childrenIds":["I3879:35923;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32947":{"id":"I3879:35923;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35923;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934":{"id":"I3879:35927;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35927;1690:32948","childrenIds":["I3879:35927;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32947":{"id":"I3879:35927;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35927;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934":{"id":"I3879:35931;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35931;1690:32948","childrenIds":["I3879:35931;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32947":{"id":"I3879:35931;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35931;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934":{"id":"I3879:35935;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35935;1690:32948","childrenIds":["I3879:35935;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32947":{"id":"I3879:35935;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35935;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934":{"id":"I3879:35939;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35939;1690:32948","childrenIds":["I3879:35939;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32947":{"id":"I3879:35939;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35939;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35951":{"id":"3879:35951","type":"FRAME","fields":{"parentId":"3879:35950","childrenIds":["3879:35952","3879:35953"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":56,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":308,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35954":{"id":"3879:35954","type":"FRAME","fields":{"parentId":"3879:35950","childrenIds":["3879:35955"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":44,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":44,"x":292,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5963":{"id":"I3879:35957;137:5963","type":"INSTANCE","fields":{"parentId":"3879:35957","childrenIds":["I3879:35957;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5960":{"id":"I3879:35957;137:5960","type":"FRAME","fields":{"parentId":"3879:35957","childrenIds":["I3879:35957;137:5967","I3879:35957;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":276,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;137:5978":{"id":"I3879:35958;137:5978","type":"INSTANCE","fields":{"parentId":"3879:35958","childrenIds":["I3879:35958;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;137:5949":{"id":"I3879:35958;137:5949","type":"FRAME","fields":{"parentId":"3879:35958","childrenIds":["I3879:35958;98:3483","I3879:35958;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":82,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":276,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35965":{"id":"3879:35965","type":"TEXT","fields":{"parentId":"3879:35964","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"교정 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"교정 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35966":{"id":"3879:35966","type":"TEXT","fields":{"parentId":"3879:35964","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":311,"x":0,"y":32,"styledTextSegments":[{"characters":"이번 이야기","end":6,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에만 적용할 교정 방법을 설정해주세요.","end":27,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":6,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5963;68:6227":{"id":"I3879:35967;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:35967;137:5963","childrenIds":["I3879:35967;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5967":{"id":"I3879:35967;137:5967","type":"TEXT","fields":{"parentId":"I3879:35967;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자와 함께 문체 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":203,"x":0,"y":0,"styledTextSegments":[{"characters":"AI 담당자와 함께 문체 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5962":{"id":"I3879:35967;137:5962","type":"TEXT","fields":{"parentId":"I3879:35967;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":33,"styledTextSegments":[{"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","end":22,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;137:5978;68:6227":{"id":"I3879:35968;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35968;137:5978","childrenIds":["I3879:35968;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;98:3483":{"id":"I3879:35968;98:3483","type":"TEXT","fields":{"parentId":"I3879:35968;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 그대로 맞춤법만 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":218,"x":0,"y":0,"styledTextSegments":[{"characters":"내 문장 그대로 맞춤법만 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;137:5945":{"id":"I3879:35968;137:5945","type":"TEXT","fields":{"parentId":"I3879:35968;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"입력하신 문장 그대로의 느낌을 담아내요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":34,"styledTextSegments":[{"characters":"입력하신 문장 그대로의 느낌을 담아내요","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;2980:19280;3879:35971":{"id":"I3879:35972;2980:19280;3879:35971","type":"TEXT","fields":{"parentId":"I3879:35972;2980:19280","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"새로운 방식에 맞춰 \n글을 다시 정리하므로 \n시간이 조금 소요될 수 있습니다. \n기존에 정리된 글은 사라집니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":116,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"새로운 방식에 맞춰 글을 다시 정리하므로 시간이 조금 소요될 수 있습니다. 기존에 정리된 글은 사라집니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,","visible":true,"width":260,"x":0,"y":0,"styledTextSegments":[{"characters":"새로운 방식에 맞춰 \n글을 다시 정리하므로 \n시간이 조금 소요될 수 있습니다. \n기존에 정리된 글은 사라집니다.","end":62,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5154":{"id":"I3879:35972;68:5154","type":"TEXT","fields":{"parentId":"I3879:35972;68:5153","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"취소","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":30,"x":65,"y":16,"styledTextSegments":[{"characters":"취소","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35972;68:5158":{"id":"I3879:35972;68:5158","type":"TEXT","fields":{"parentId":"I3879:35972;68:5157","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"다시 교정하기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":92,"x":34,"y":16,"styledTextSegments":[{"characters":"다시 교정하기","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2029":{"id":"I3879:35894;17:2029","type":"GROUP","fields":{"parentId":"I3879:35894;17:2028","childrenIds":["I3879:35894;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35899":{"id":"3879:35899","type":"INSTANCE","fields":{"parentId":"3879:35898","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35900":{"id":"3879:35900","type":"TEXT","fields":{"parentId":"3879:35898","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 편집자에게 다듬기 맡기기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 편집자에게 다듬기 맡기기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":176,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 편집자에게 다듬기 맡기기","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35902":{"id":"3879:35902","type":"INSTANCE","fields":{"parentId":"3879:35901","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35903":{"id":"3879:35903","type":"TEXT","fields":{"parentId":"3879:35901","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 최대한 유지하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 최대한 유지하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":149,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 최대한 유지하기","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35909":{"id":"3879:35909","type":"VECTOR","fields":{"parentId":"3879:35908","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2028":{"id":"I3879:35923;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934","childrenIds":["I3879:35923;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2028":{"id":"I3879:35927;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934","childrenIds":["I3879:35927;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2028":{"id":"I3879:35931;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934","childrenIds":["I3879:35931;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2028":{"id":"I3879:35935;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934","childrenIds":["I3879:35935;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2028":{"id":"I3879:35939;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934","childrenIds":["I3879:35939;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35952":{"id":"3879:35952","type":"TEXT","fields":{"parentId":"3879:35951","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"공개 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35953":{"id":"3879:35953","type":"TEXT","fields":{"parentId":"3879:35951","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":308,"x":0,"y":32,"styledTextSegments":[{"characters":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","end":29,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35955":{"id":"3879:35955","type":"FRAME","fields":{"parentId":"3879:35954","childrenIds":["3879:35956"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":34,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5963;68:6227":{"id":"I3879:35957;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:35957;137:5963","childrenIds":["I3879:35957;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5967":{"id":"I3879:35957;137:5967","type":"TEXT","fields":{"parentId":"I3879:35957;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"동행인","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"동행인","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5962":{"id":"I3879:35957;137:5962","type":"TEXT","fields":{"parentId":"I3879:35957;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"작가님의 동행인과 이야기를 나눕니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":276,"x":0,"y":33,"styledTextSegments":[{"characters":"작가님의 동행인과 이야기를 나눕니다.","end":20,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;137:5978;68:6227":{"id":"I3879:35958;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:35958;137:5978","childrenIds":["I3879:35958;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;98:3483":{"id":"I3879:35958;98:3483","type":"TEXT","fields":{"parentId":"I3879:35958;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":67,"x":0,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;137:5945":{"id":"I3879:35958;137:5945","type":"TEXT","fields":{"parentId":"I3879:35958;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":48,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":276,"x":0,"y":34,"styledTextSegments":[{"characters":"누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다.","end":30,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35967;137:5963;68:6228":{"id":"I3879:35967;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35967;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35968;137:5978;68:6228":{"id":"I3879:35968;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35968;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2039":{"id":"I3879:35894;17:2039","type":"GROUP","fields":{"parentId":"I3879:35894;17:2029","childrenIds":["I3879:35894;17:2037","I3879:35894;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2029":{"id":"I3879:35923;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2028","childrenIds":["I3879:35923;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2029":{"id":"I3879:35927;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2028","childrenIds":["I3879:35927;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2029":{"id":"I3879:35931;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2028","childrenIds":["I3879:35931;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2029":{"id":"I3879:35935;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2028","childrenIds":["I3879:35935;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2029":{"id":"I3879:35939;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2028","childrenIds":["I3879:35939;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35956":{"id":"3879:35956","type":"VECTOR","fields":{"parentId":"3879:35955","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":15.99999713897705,"x":4.000001907348633,"y":3.999999523162842},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35957;137:5963;68:6228":{"id":"I3879:35957;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35957;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35958;137:5978;68:6228":{"id":"I3879:35958;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:35958;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2037":{"id":"I3879:35894;17:2037","type":"GROUP","fields":{"parentId":"I3879:35894;17:2039","childrenIds":["I3879:35894;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2030":{"id":"I3879:35894;17:2030","type":"GROUP","fields":{"parentId":"I3879:35894;17:2039","childrenIds":["I3879:35894;17:2031","I3879:35894;17:2033","I3879:35894;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2039":{"id":"I3879:35923;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2029","childrenIds":["I3879:35923;1690:32934;17:2037","I3879:35923;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2039":{"id":"I3879:35927;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2029","childrenIds":["I3879:35927;1690:32934;17:2037","I3879:35927;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2039":{"id":"I3879:35931;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2029","childrenIds":["I3879:35931;1690:32934;17:2037","I3879:35931;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2039":{"id":"I3879:35935;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2029","childrenIds":["I3879:35935;1690:32934;17:2037","I3879:35935;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2039":{"id":"I3879:35939;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2029","childrenIds":["I3879:35939;1690:32934;17:2037","I3879:35939;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2038":{"id":"I3879:35894;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35894;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2031":{"id":"I3879:35894;17:2031","type":"GROUP","fields":{"parentId":"I3879:35894;17:2030","childrenIds":["I3879:35894;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2033":{"id":"I3879:35894;17:2033","type":"GROUP","fields":{"parentId":"I3879:35894;17:2030","childrenIds":["I3879:35894;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2035":{"id":"I3879:35894;17:2035","type":"GROUP","fields":{"parentId":"I3879:35894;17:2030","childrenIds":["I3879:35894;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2037":{"id":"I3879:35923;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2039","childrenIds":["I3879:35923;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2030":{"id":"I3879:35923;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2039","childrenIds":["I3879:35923;1690:32934;17:2031","I3879:35923;1690:32934;17:2033","I3879:35923;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2037":{"id":"I3879:35927;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2039","childrenIds":["I3879:35927;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2030":{"id":"I3879:35927;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2039","childrenIds":["I3879:35927;1690:32934;17:2031","I3879:35927;1690:32934;17:2033","I3879:35927;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2037":{"id":"I3879:35931;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2039","childrenIds":["I3879:35931;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2030":{"id":"I3879:35931;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2039","childrenIds":["I3879:35931;1690:32934;17:2031","I3879:35931;1690:32934;17:2033","I3879:35931;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2037":{"id":"I3879:35935;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2039","childrenIds":["I3879:35935;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2030":{"id":"I3879:35935;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2039","childrenIds":["I3879:35935;1690:32934;17:2031","I3879:35935;1690:32934;17:2033","I3879:35935;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2037":{"id":"I3879:35939;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2039","childrenIds":["I3879:35939;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2030":{"id":"I3879:35939;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2039","childrenIds":["I3879:35939;1690:32934;17:2031","I3879:35939;1690:32934;17:2033","I3879:35939;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2032":{"id":"I3879:35894;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35894;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2034":{"id":"I3879:35894;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35894;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35894;17:2036":{"id":"I3879:35894;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35894;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2038":{"id":"I3879:35923;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35923;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2031":{"id":"I3879:35923;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2030","childrenIds":["I3879:35923;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2033":{"id":"I3879:35923;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2030","childrenIds":["I3879:35923;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2035":{"id":"I3879:35923;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35923;1690:32934;17:2030","childrenIds":["I3879:35923;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2038":{"id":"I3879:35927;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35927;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2031":{"id":"I3879:35927;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2030","childrenIds":["I3879:35927;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2033":{"id":"I3879:35927;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2030","childrenIds":["I3879:35927;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2035":{"id":"I3879:35927;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35927;1690:32934;17:2030","childrenIds":["I3879:35927;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2038":{"id":"I3879:35931;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35931;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2031":{"id":"I3879:35931;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2030","childrenIds":["I3879:35931;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2033":{"id":"I3879:35931;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2030","childrenIds":["I3879:35931;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2035":{"id":"I3879:35931;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35931;1690:32934;17:2030","childrenIds":["I3879:35931;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2038":{"id":"I3879:35935;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35935;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2031":{"id":"I3879:35935;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2030","childrenIds":["I3879:35935;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2033":{"id":"I3879:35935;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2030","childrenIds":["I3879:35935;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2035":{"id":"I3879:35935;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35935;1690:32934;17:2030","childrenIds":["I3879:35935;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2038":{"id":"I3879:35939;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35939;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2031":{"id":"I3879:35939;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2030","childrenIds":["I3879:35939;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2033":{"id":"I3879:35939;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2030","childrenIds":["I3879:35939;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2035":{"id":"I3879:35939;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35939;1690:32934;17:2030","childrenIds":["I3879:35939;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2032":{"id":"I3879:35923;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35923;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2034":{"id":"I3879:35923;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35923;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35923;1690:32934;17:2036":{"id":"I3879:35923;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35923;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2032":{"id":"I3879:35927;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35927;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2034":{"id":"I3879:35927;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35927;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35927;1690:32934;17:2036":{"id":"I3879:35927;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35927;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2032":{"id":"I3879:35931;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35931;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2034":{"id":"I3879:35931;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35931;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35931;1690:32934;17:2036":{"id":"I3879:35931;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35931;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2032":{"id":"I3879:35935;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35935;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2034":{"id":"I3879:35935;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35935;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35935;1690:32934;17:2036":{"id":"I3879:35935;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35935;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2032":{"id":"I3879:35939;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35939;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2034":{"id":"I3879:35939;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35939;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35939;1690:32934;17:2036":{"id":"I3879:35939;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35939;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:278:3649","name":"primaryBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1980","name":"gray200","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,","name":"bodySm","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35973.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35973.json new file mode 100644 index 0000000..a7ee9a8 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-35973.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35973","capture":"official Figma MCP use_figma read-only projection","nodeCount":210},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35973"],"nodes":{"3879:35973":{"id":"3879:35973","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:35974","3879:36007","3879:36028","3879:36033","3879:36055"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":4052,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35974":{"id":"3879:35974","type":"FRAME","fields":{"parentId":"3879:35973","childrenIds":["3879:35975","3879:35976","3879:35996","3879:36001"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":885,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36007":{"id":"3879:36007","type":"FRAME","fields":{"parentId":"3879:35973","childrenIds":["3879:36008","3879:36012","3879:36016","3879:36020","3879:36024"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":885},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36028":{"id":"3879:36028","type":"FRAME","fields":{"parentId":"3879:35973","childrenIds":["3879:36029","3879:36031"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36033":{"id":"3879:36033","type":"FRAME","fields":{"parentId":"3879:35973","childrenIds":["3879:36034"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36055":{"id":"3879:36055","type":"FRAME","fields":{"parentId":"3879:35973","childrenIds":["3879:36058"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315195","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35975":{"id":"3879:35975","type":"TEXT","fields":{"parentId":"3879:35974","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35976":{"id":"3879:35976","type":"FRAME","fields":{"parentId":"3879:35974","childrenIds":["3879:35977","3879:35981","3879:35990"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":242,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315405","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35996":{"id":"3879:35996","type":"FRAME","fields":{"parentId":"3879:35974","childrenIds":["3879:35997","3879:36000"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":430},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36001":{"id":"3879:36001","type":"FRAME","fields":{"parentId":"3879:35974","childrenIds":["3879:36002","3879:36003","3879:36004"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":701},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36008":{"id":"3879:36008","type":"FRAME","fields":{"parentId":"3879:36007","childrenIds":["3879:36009","3879:36010"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36012":{"id":"3879:36012","type":"FRAME","fields":{"parentId":"3879:36007","childrenIds":["3879:36013","3879:36014"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36016":{"id":"3879:36016","type":"FRAME","fields":{"parentId":"3879:36007","childrenIds":["3879:36017","3879:36018"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36020":{"id":"3879:36020","type":"FRAME","fields":{"parentId":"3879:36007","childrenIds":["3879:36021","3879:36022"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36024":{"id":"3879:36024","type":"FRAME","fields":{"parentId":"3879:36007","childrenIds":["3879:36025","3879:36026"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36029":{"id":"3879:36029","type":"FRAME","fields":{"parentId":"3879:36028","childrenIds":["3879:36030"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:278:3649","type":"VARIABLE_ALIAS"}},"color":{"b":0.8907090425491333,"g":0.9080576300621033,"r":0.9278846383094788},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36031":{"id":"3879:36031","type":"FRAME","fields":{"parentId":"3879:36028","childrenIds":["3879:36032"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36034":{"id":"3879:36034","type":"FRAME","fields":{"parentId":"3879:36033","childrenIds":["3879:36035","3879:36045","3879:36047","3879:36049","3879:36053","3879:36054"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":{"$unsupported":"symbol"},"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":-8},"radius":20,"showShadowBehindNode":false,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":569,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":" B : STORY-F-DETAIL #modify-style","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"visible":true,"width":360,"x":0,"y":171},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36058":{"id":"3879:36058","type":"INSTANCE","fields":{"parentId":"3879:36055","childrenIds":["I3879:36058;68:5150","I3879:36058;68:5159"],"blendMode":"PASS_THROUGH","bottomLeftRadius":20,"bottomRightRadius":20,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"2nd Button#68:0":{"type":"BOOLEAN","value":true},"Slot#2980:0":{"preferredValues":[],"type":"SLOT"}},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"CENTER"},"cornerRadius":20,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":302,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"variantProperties":null,"visible":true,"width":320,"x":20,"y":219.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35977":{"id":"3879:35977","type":"FRAME","fields":{"parentId":"3879:35976","childrenIds":["3879:35978","3879:35979","3879:35980"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35981":{"id":"3879:35981","type":"FRAME","fields":{"parentId":"3879:35976","childrenIds":["3879:35982","3879:35983"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":61},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35990":{"id":"3879:35990","type":"FRAME","fields":{"parentId":"3879:35976","childrenIds":["3879:35991"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315456","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":189},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35997":{"id":"3879:35997","type":"FRAME","fields":{"parentId":"3879:35996","childrenIds":["3879:35998","3879:35999"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314915","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36000":{"id":"3879:36000","type":"TEXT","fields":{"parentId":"3879:35996","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36002":{"id":"3879:36002","type":"TEXT","fields":{"parentId":"3879:36001","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36003":{"id":"3879:36003","type":"TEXT","fields":{"parentId":"3879:36001","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36004":{"id":"3879:36004","type":"FRAME","fields":{"parentId":"3879:36001","childrenIds":["3879:36005"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36009":{"id":"3879:36009","type":"INSTANCE","fields":{"parentId":"3879:36008","childrenIds":["I3879:36009;1690:32933","I3879:36009;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36010":{"id":"3879:36010","type":"FRAME","fields":{"parentId":"3879:36008","childrenIds":["3879:36011"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36013":{"id":"3879:36013","type":"INSTANCE","fields":{"parentId":"3879:36012","childrenIds":["I3879:36013;1690:32933","I3879:36013;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36014":{"id":"3879:36014","type":"FRAME","fields":{"parentId":"3879:36012","childrenIds":["3879:36015"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36017":{"id":"3879:36017","type":"INSTANCE","fields":{"parentId":"3879:36016","childrenIds":["I3879:36017;1690:32933","I3879:36017;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36018":{"id":"3879:36018","type":"FRAME","fields":{"parentId":"3879:36016","childrenIds":["3879:36019"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36021":{"id":"3879:36021","type":"INSTANCE","fields":{"parentId":"3879:36020","childrenIds":["I3879:36021;1690:32933","I3879:36021;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36022":{"id":"3879:36022","type":"FRAME","fields":{"parentId":"3879:36020","childrenIds":["3879:36023"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36025":{"id":"3879:36025","type":"INSTANCE","fields":{"parentId":"3879:36024","childrenIds":["I3879:36025;1690:32933","I3879:36025;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36026":{"id":"3879:36026","type":"FRAME","fields":{"parentId":"3879:36024","childrenIds":["3879:36027"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36030":{"id":"3879:36030","type":"TEXT","fields":{"parentId":"3879:36029","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"문체 변경","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"문체 변경","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"문체 변경","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36032":{"id":"3879:36032","type":"TEXT","fields":{"parentId":"3879:36031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36035":{"id":"3879:36035","type":"FRAME","fields":{"parentId":"3879:36034","childrenIds":["3879:36036","3879:36043","3879:36044"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":295,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315486","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36045":{"id":"3879:36045","type":"FRAME","fields":{"parentId":"3879:36034","childrenIds":["3879:36046"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086076","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":338},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36047":{"id":"3879:36047","type":"FRAME","fields":{"parentId":"3879:36034","childrenIds":["3879:36048"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":59,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086077","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":14,"paddingLeft":12,"paddingRight":12,"paddingTop":14,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":false,"width":336,"x":12,"y":397},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36049":{"id":"3879:36049","type":"FRAME","fields":{"parentId":"3879:36034","childrenIds":["3879:36050"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":98,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":16,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":16,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086078","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":12,"y":295},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36053":{"id":"3879:36053","type":"INSTANCE","fields":{"parentId":"3879:36034","childrenIds":["I3879:36053;137:5963","I3879:36053;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":12,"y":393},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36054":{"id":"3879:36054","type":"INSTANCE","fields":{"parentId":"3879:36034","childrenIds":["I3879:36054;137:5978","I3879:36054;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":83,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 5","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":12,"y":474},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5150":{"id":"I3879:36058;68:5150","type":"FRAME","fields":{"parentId":"3879:36058","childrenIds":["I3879:36058;68:5149","I3879:36058;2980:19280"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":180,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5159":{"id":"I3879:36058;68:5159","type":"FRAME","fields":{"parentId":"3879:36058","childrenIds":["I3879:36058;68:5153","I3879:36058;68:5157"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086045","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":241},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35978":{"id":"3879:35978","type":"TEXT","fields":{"parentId":"3879:35977","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"현재 적용된 문체 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"현재 적용된 문체 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":112,"x":64,"y":13.5,"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35979":{"id":"3879:35979","type":"TEXT","fields":{"parentId":"3879:35977","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"담담체","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"담담체","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":44,"x":188,"y":12,"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35980":{"id":"3879:35980","type":"INSTANCE","fields":{"parentId":"3879:35977","childrenIds":["I3879:35980;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":244,"y":16.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35982":{"id":"3879:35982","type":"TEXT","fields":{"parentId":"3879:35981","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"교정 옵션을 선택해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 옵션을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":296,"x":16,"y":12,"styledTextSegments":[{"characters":"교정 옵션을 선택해주세요.","end":14,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35983":{"id":"3879:35983","type":"FRAME","fields":{"parentId":"3879:35981","childrenIds":["3879:35984","3879:35987"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35991":{"id":"3879:35991","type":"FRAME","fields":{"parentId":"3879:35990","childrenIds":["3879:35992","3879:35993","3879:35994"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35998":{"id":"3879:35998","type":"INSTANCE","fields":{"parentId":"3879:35997","childrenIds":["I3879:35998;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35999":{"id":"3879:35999","type":"TEXT","fields":{"parentId":"3879:35997","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36005":{"id":"3879:36005","type":"FRAME","fields":{"parentId":"3879:36004","childrenIds":["3879:36006"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32933":{"id":"I3879:36009;1690:32933","type":"TEXT","fields":{"parentId":"3879:36009","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32948":{"id":"I3879:36009;1690:32948","type":"FRAME","fields":{"parentId":"3879:36009","childrenIds":["I3879:36009;1690:32934","I3879:36009;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36011":{"id":"3879:36011","type":"TEXT","fields":{"parentId":"3879:36010","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32933":{"id":"I3879:36013;1690:32933","type":"TEXT","fields":{"parentId":"3879:36013","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32948":{"id":"I3879:36013;1690:32948","type":"FRAME","fields":{"parentId":"3879:36013","childrenIds":["I3879:36013;1690:32934","I3879:36013;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36015":{"id":"3879:36015","type":"TEXT","fields":{"parentId":"3879:36014","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32933":{"id":"I3879:36017;1690:32933","type":"TEXT","fields":{"parentId":"3879:36017","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32948":{"id":"I3879:36017;1690:32948","type":"FRAME","fields":{"parentId":"3879:36017","childrenIds":["I3879:36017;1690:32934","I3879:36017;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36019":{"id":"3879:36019","type":"TEXT","fields":{"parentId":"3879:36018","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32933":{"id":"I3879:36021;1690:32933","type":"TEXT","fields":{"parentId":"3879:36021","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32948":{"id":"I3879:36021;1690:32948","type":"FRAME","fields":{"parentId":"3879:36021","childrenIds":["I3879:36021;1690:32934","I3879:36021;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36023":{"id":"3879:36023","type":"TEXT","fields":{"parentId":"3879:36022","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32933":{"id":"I3879:36025;1690:32933","type":"TEXT","fields":{"parentId":"3879:36025","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32948":{"id":"I3879:36025;1690:32948","type":"FRAME","fields":{"parentId":"3879:36025","childrenIds":["I3879:36025;1690:32934","I3879:36025;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36027":{"id":"3879:36027","type":"TEXT","fields":{"parentId":"3879:36026","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36036":{"id":"3879:36036","type":"FRAME","fields":{"parentId":"3879:36035","childrenIds":["3879:36037","3879:36040"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":96,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086070","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":12,"paddingRight":12,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":336,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36043":{"id":"3879:36043","type":"INSTANCE","fields":{"parentId":"3879:36035","childrenIds":["I3879:36043;137:5963","I3879:36043;137:5960"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"베리언트3"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":81,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 2","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"베리언트3"},"visible":true,"width":336,"x":0,"y":96},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36044":{"id":"3879:36044","type":"INSTANCE","fields":{"parentId":"3879:36035","childrenIds":["I3879:36044;137:5978","I3879:36044;137:5949"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":106,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Component 6","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":336,"x":0,"y":177},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36046":{"id":"3879:36046","type":"TEXT","fields":{"parentId":"3879:36045","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36048":{"id":"3879:36048","type":"TEXT","fields":{"parentId":"3879:36047","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택지","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택지","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":47,"x":12,"y":14,"styledTextSegments":[{"characters":"선택지","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36050":{"id":"3879:36050","type":"FRAME","fields":{"parentId":"3879:36049","childrenIds":["3879:36051","3879:36052"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":311,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5963":{"id":"I3879:36053;137:5963","type":"INSTANCE","fields":{"parentId":"3879:36053","childrenIds":["I3879:36053;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5960":{"id":"I3879:36053;137:5960","type":"FRAME","fields":{"parentId":"3879:36053","childrenIds":["I3879:36053;137:5967","I3879:36053;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;137:5978":{"id":"I3879:36054;137:5978","type":"INSTANCE","fields":{"parentId":"3879:36054","childrenIds":["I3879:36054;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;137:5949":{"id":"I3879:36054;137:5949","type":"FRAME","fields":{"parentId":"3879:36054","childrenIds":["I3879:36054;98:3483","I3879:36054;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":58,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":233,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5149":{"id":"I3879:36058;68:5149","type":"TEXT","fields":{"parentId":"I3879:36058;68:5150","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"문체를 적용합니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"제목 영역","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":145,"x":87.5,"y":30,"styledTextSegments":[{"characters":"문체를 적용합니다.","end":10,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;2980:19280":{"id":"I3879:36058;2980:19280","type":"SLOT","fields":{"parentId":"I3879:36058;68:5150","childrenIds":["I3879:36058;2980:19280;3879:36057"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{"slotContentId":"Slot#2980:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":145,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Slot","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":260,"x":30,"y":66},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5153":{"id":"I3879:36058;68:5153","type":"FRAME","fields":{"parentId":"I3879:36058;68:5159","childrenIds":["I3879:36058;68:5154"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5157":{"id":"I3879:36058;68:5157","type":"FRAME","fields":{"parentId":"I3879:36058;68:5159","childrenIds":["I3879:36058;68:5158"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{"visible":"2nd Button#68:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":1,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":160,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2028":{"id":"I3879:35980;17:2028","type":"GROUP","fields":{"parentId":"3879:35980","childrenIds":["I3879:35980;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35984":{"id":"3879:35984","type":"FRAME","fields":{"parentId":"3879:35983","childrenIds":["3879:35985","3879:35986"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35987":{"id":"3879:35987","type":"FRAME","fields":{"parentId":"3879:35983","childrenIds":["3879:35988","3879:35989"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":296,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35992":{"id":"3879:35992","type":"TEXT","fields":{"parentId":"3879:35991","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35993":{"id":"3879:35993","type":"TEXT","fields":{"parentId":"3879:35991","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35994":{"id":"3879:35994","type":"FRAME","fields":{"parentId":"3879:35991","childrenIds":["3879:35995"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35998;20:3849":{"id":"I3879:35998;20:3849","type":"VECTOR","fields":{"parentId":"3879:35998","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36006":{"id":"3879:36006","type":"VECTOR","fields":{"parentId":"3879:36005","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934":{"id":"I3879:36009;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36009;1690:32948","childrenIds":["I3879:36009;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32947":{"id":"I3879:36009;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36009;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934":{"id":"I3879:36013;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36013;1690:32948","childrenIds":["I3879:36013;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32947":{"id":"I3879:36013;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36013;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934":{"id":"I3879:36017;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36017;1690:32948","childrenIds":["I3879:36017;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32947":{"id":"I3879:36017;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36017;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934":{"id":"I3879:36021;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36021;1690:32948","childrenIds":["I3879:36021;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32947":{"id":"I3879:36021;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36021;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934":{"id":"I3879:36025;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36025;1690:32948","childrenIds":["I3879:36025;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32947":{"id":"I3879:36025;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36025;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36037":{"id":"3879:36037","type":"FRAME","fields":{"parentId":"3879:36036","childrenIds":["3879:36038","3879:36039"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":56,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314931","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":308,"x":12,"y":20},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36040":{"id":"3879:36040","type":"FRAME","fields":{"parentId":"3879:36036","childrenIds":["3879:36041"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":44,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":44,"x":292,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5963":{"id":"I3879:36043;137:5963","type":"INSTANCE","fields":{"parentId":"3879:36043","childrenIds":["I3879:36043;137:5963;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5960":{"id":"I3879:36043;137:5960","type":"FRAME","fields":{"parentId":"3879:36043","childrenIds":["I3879:36043;137:5967","I3879:36043;137:5962"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":57,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":276,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;137:5978":{"id":"I3879:36044;137:5978","type":"INSTANCE","fields":{"parentId":"3879:36044","childrenIds":["I3879:36044;137:5978;68:6227"],"blendMode":"PASS_THROUGH","bottomLeftRadius":8,"bottomRightRadius":8,"boundVariables":{},"clipsContent":true,"componentProperties":{"type":{"boundVariables":{},"type":"VARIANT","value":"trans"},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":8,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"checkbox","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":100,"y":100},"topLeftRadius":8,"topRightRadius":8,"variantProperties":{"type":"trans","속성 1":"selected"},"visible":true,"width":26,"x":12,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;137:5949":{"id":"I3879:36044;137:5949","type":"FRAME","fields":{"parentId":"3879:36044","childrenIds":["I3879:36044;98:3483","I3879:36044;137:5945"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":82,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":2,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":2,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314938","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":276,"x":48,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36051":{"id":"3879:36051","type":"TEXT","fields":{"parentId":"3879:36050","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"교정 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"교정 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36052":{"id":"3879:36052","type":"TEXT","fields":{"parentId":"3879:36050","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"$unsupported":"symbol"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이번 이야기에만 적용할 교정 방법을 설정해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":311,"x":0,"y":32,"styledTextSegments":[{"characters":"이번 이야기","end":6,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"},{"characters":"에만 적용할 교정 방법을 설정해주세요.","end":27,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":6,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5963;68:6227":{"id":"I3879:36053;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:36053;137:5963","childrenIds":["I3879:36053;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5967":{"id":"I3879:36053;137:5967","type":"TEXT","fields":{"parentId":"I3879:36053;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자와 함께 문체 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":203,"x":0,"y":0,"styledTextSegments":[{"characters":"AI 담당자와 함께 문체 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5962":{"id":"I3879:36053;137:5962","type":"TEXT","fields":{"parentId":"I3879:36053;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":33,"styledTextSegments":[{"characters":"AI 담당자가 문맥을 자연스럽게 수정해요","end":22,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;137:5978;68:6227":{"id":"I3879:36054;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:36054;137:5978","childrenIds":["I3879:36054;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;98:3483":{"id":"I3879:36054;98:3483","type":"TEXT","fields":{"parentId":"I3879:36054;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 그대로 맞춤법만 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":218,"x":0,"y":0,"styledTextSegments":[{"characters":"내 문장 그대로 맞춤법만 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;137:5945":{"id":"I3879:36054;137:5945","type":"TEXT","fields":{"parentId":"I3879:36054;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"입력하신 문장 그대로의 느낌을 담아내요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":233,"x":0,"y":34,"styledTextSegments":[{"characters":"입력하신 문장 그대로의 느낌을 담아내요","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;2980:19280;3879:36057":{"id":"I3879:36058;2980:19280;3879:36057","type":"TEXT","fields":{"parentId":"I3879:36058;2980:19280","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"선택하신 '담담체'를 \n이야기 전체에 적용하시겠습니까?
글을 다시 정리하므로 \n시간이 조금 소요될 수 있습니다. \n기존에 정리된 글은 사라집니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":145,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"선택하신 '담담체'를 이야기 전체에 적용하시겠습니까?
글을 다시 정리하므로 시간이 조금 소요될 수 있습니다. 기존에 정리된 글은 사라집니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":260,"x":0,"y":0,"styledTextSegments":[{"characters":"선택하신","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,"},{"characters":" '담담체","end":9,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"},{"characters":"'를 \n이야기 전체에 적용하시겠습니까?
글을 다시 정리하므로 \n시간이 조금 소요될 수 있습니다. \n기존에 정리된 글은 사라집니다.","end":81,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":9,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5154":{"id":"I3879:36058;68:5154","type":"TEXT","fields":{"parentId":"I3879:36058;68:5153","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"취소","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":30,"x":65,"y":16,"styledTextSegments":[{"characters":"취소","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36058;68:5158":{"id":"I3879:36058;68:5158","type":"TEXT","fields":{"parentId":"I3879:36058;68:5157","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"적용하기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":59,"x":50.5,"y":16,"styledTextSegments":[{"characters":"적용하기","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2029":{"id":"I3879:35980;17:2029","type":"GROUP","fields":{"parentId":"I3879:35980;17:2028","childrenIds":["I3879:35980;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35985":{"id":"3879:35985","type":"INSTANCE","fields":{"parentId":"3879:35984","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35986":{"id":"3879:35986","type":"TEXT","fields":{"parentId":"3879:35984","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 편집자에게 다듬기 맡기기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 편집자에게 다듬기 맡기기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":176,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 편집자에게 다듬기 맡기기","end":16,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35988":{"id":"3879:35988","type":"INSTANCE","fields":{"parentId":"3879:35987","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35989":{"id":"3879:35989","type":"TEXT","fields":{"parentId":"3879:35987","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 최대한 유지하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 최대한 유지하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":149,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 최대한 유지하기","end":13,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:35995":{"id":"3879:35995","type":"VECTOR","fields":{"parentId":"3879:35994","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2028":{"id":"I3879:36009;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934","childrenIds":["I3879:36009;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2028":{"id":"I3879:36013;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934","childrenIds":["I3879:36013;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2028":{"id":"I3879:36017;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934","childrenIds":["I3879:36017;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2028":{"id":"I3879:36021;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934","childrenIds":["I3879:36021;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2028":{"id":"I3879:36025;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934","childrenIds":["I3879:36025;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36038":{"id":"3879:36038","type":"TEXT","fields":{"parentId":"3879:36037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":73,"x":0,"y":0,"styledTextSegments":[{"characters":"공개 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36039":{"id":"3879:36039","type":"TEXT","fields":{"parentId":"3879:36037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":308,"x":0,"y":32,"styledTextSegments":[{"characters":"작성하신 이야기를 누구와 함께 나눌지 선택해 주세요.","end":29,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36041":{"id":"3879:36041","type":"FRAME","fields":{"parentId":"3879:36040","childrenIds":["3879:36042"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":34,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5963;68:6227":{"id":"I3879:36043;137:5963;68:6227","type":"FRAME","fields":{"parentId":"I3879:36043;137:5963","childrenIds":["I3879:36043;137:5963;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5967":{"id":"I3879:36043;137:5967","type":"TEXT","fields":{"parentId":"I3879:36043;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"동행인","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":47,"x":0,"y":0,"styledTextSegments":[{"characters":"동행인","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5962":{"id":"I3879:36043;137:5962","type":"TEXT","fields":{"parentId":"I3879:36043;137:5960","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"작가님의 동행인과 이야기를 나눕니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":276,"x":0,"y":33,"styledTextSegments":[{"characters":"작가님의 동행인과 이야기를 나눕니다.","end":20,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;137:5978;68:6227":{"id":"I3879:36044;137:5978;68:6227","type":"FRAME","fields":{"parentId":"I3879:36044;137:5978","childrenIds":["I3879:36044;137:5978;68:6228"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":18.571428298950195,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":18.571428298950195,"x":3.7142856121063232,"y":3.7142856121063232},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;98:3483":{"id":"I3879:36044;98:3483","type":"TEXT","fields":{"parentId":"I3879:36044;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":32,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"텍스트","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":67,"x":0,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;137:5945":{"id":"I3879:36044;137:5945","type":"TEXT","fields":{"parentId":"I3879:36044;137:5949","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":48,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"설명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":276,"x":0,"y":34,"styledTextSegments":[{"characters":"누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다.","end":30,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36053;137:5963;68:6228":{"id":"I3879:36053;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:36053;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36054;137:5978;68:6228":{"id":"I3879:36054;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:36054;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2039":{"id":"I3879:35980;17:2039","type":"GROUP","fields":{"parentId":"I3879:35980;17:2029","childrenIds":["I3879:35980;17:2037","I3879:35980;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2029":{"id":"I3879:36009;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2028","childrenIds":["I3879:36009;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2029":{"id":"I3879:36013;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2028","childrenIds":["I3879:36013;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2029":{"id":"I3879:36017;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2028","childrenIds":["I3879:36017;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2029":{"id":"I3879:36021;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2028","childrenIds":["I3879:36021;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2029":{"id":"I3879:36025;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2028","childrenIds":["I3879:36025;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36042":{"id":"3879:36042","type":"VECTOR","fields":{"parentId":"3879:36041","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":15.99999713897705,"x":4.000001907348633,"y":3.999999523162842},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36043;137:5963;68:6228":{"id":"I3879:36043;137:5963;68:6228","type":"VECTOR","fields":{"parentId":"I3879:36043;137:5963;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36044;137:5978;68:6228":{"id":"I3879:36044;137:5978;68:6228","type":"VECTOR","fields":{"parentId":"I3879:36044;137:5978;68:6227","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1980","type":"VARIABLE_ALIAS"}},"color":{"b":0.9022436738014221,"g":0.8989903926849365,"r":0.8979060053825378},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":10.317461013793945,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":14.44444465637207,"x":2.0634918212890625,"y":4.126983642578125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2037":{"id":"I3879:35980;17:2037","type":"GROUP","fields":{"parentId":"I3879:35980;17:2039","childrenIds":["I3879:35980;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2030":{"id":"I3879:35980;17:2030","type":"GROUP","fields":{"parentId":"I3879:35980;17:2039","childrenIds":["I3879:35980;17:2031","I3879:35980;17:2033","I3879:35980;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.827831268310547,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":18.827831268310547,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2039":{"id":"I3879:36009;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2029","childrenIds":["I3879:36009;1690:32934;17:2037","I3879:36009;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2039":{"id":"I3879:36013;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2029","childrenIds":["I3879:36013;1690:32934;17:2037","I3879:36013;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2039":{"id":"I3879:36017;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2029","childrenIds":["I3879:36017;1690:32934;17:2037","I3879:36017;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2039":{"id":"I3879:36021;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2029","childrenIds":["I3879:36021;1690:32934;17:2037","I3879:36021;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2039":{"id":"I3879:36025;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2029","childrenIds":["I3879:36025;1690:32934;17:2037","I3879:36025;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2038":{"id":"I3879:35980;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35980;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":19.999998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":19.999998092651367,"x":0,"y":20},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2031":{"id":"I3879:35980;17:2031","type":"GROUP","fields":{"parentId":"I3879:35980;17:2030","childrenIds":["I3879:35980;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2033":{"id":"I3879:35980;17:2033","type":"GROUP","fields":{"parentId":"I3879:35980;17:2030","childrenIds":["I3879:35980;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2035":{"id":"I3879:35980;17:2035","type":"GROUP","fields":{"parentId":"I3879:35980;17:2030","childrenIds":["I3879:35980;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87066650390625,"y":4.129319190979004},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2037":{"id":"I3879:36009;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2039","childrenIds":["I3879:36009;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2030":{"id":"I3879:36009;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2039","childrenIds":["I3879:36009;1690:32934;17:2031","I3879:36009;1690:32934;17:2033","I3879:36009;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2037":{"id":"I3879:36013;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2039","childrenIds":["I3879:36013;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2030":{"id":"I3879:36013;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2039","childrenIds":["I3879:36013;1690:32934;17:2031","I3879:36013;1690:32934;17:2033","I3879:36013;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2037":{"id":"I3879:36017;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2039","childrenIds":["I3879:36017;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2030":{"id":"I3879:36017;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2039","childrenIds":["I3879:36017;1690:32934;17:2031","I3879:36017;1690:32934;17:2033","I3879:36017;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2037":{"id":"I3879:36021;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2039","childrenIds":["I3879:36021;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2030":{"id":"I3879:36021;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2039","childrenIds":["I3879:36021;1690:32934;17:2031","I3879:36021;1690:32934;17:2033","I3879:36021;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2037":{"id":"I3879:36025;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2039","childrenIds":["I3879:36025;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2030":{"id":"I3879:36025;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2039","childrenIds":["I3879:36025;1690:32934;17:2031","I3879:36025;1690:32934;17:2033","I3879:36025;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2032":{"id":"I3879:35980;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35980;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.624998092651367,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":15.624998092651367,"x":0.5859375,"y":19.4140625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2034":{"id":"I3879:35980;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35980;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":11.82978343963623,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":11.82978343963623,"x":7.584281921386719,"y":12.41573429107666},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:35980;17:2036":{"id":"I3879:35980;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35980;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":2.2096872329711914,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":2.2096872329711914,"x":15.87069365104071,"y":4.129326820373535},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2038":{"id":"I3879:36009;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36009;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2031":{"id":"I3879:36009;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2030","childrenIds":["I3879:36009;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2033":{"id":"I3879:36009;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2030","childrenIds":["I3879:36009;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2035":{"id":"I3879:36009;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36009;1690:32934;17:2030","childrenIds":["I3879:36009;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2038":{"id":"I3879:36013;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36013;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2031":{"id":"I3879:36013;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2030","childrenIds":["I3879:36013;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2033":{"id":"I3879:36013;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2030","childrenIds":["I3879:36013;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2035":{"id":"I3879:36013;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36013;1690:32934;17:2030","childrenIds":["I3879:36013;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2038":{"id":"I3879:36017;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36017;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2031":{"id":"I3879:36017;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2030","childrenIds":["I3879:36017;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2033":{"id":"I3879:36017;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2030","childrenIds":["I3879:36017;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2035":{"id":"I3879:36017;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36017;1690:32934;17:2030","childrenIds":["I3879:36017;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2038":{"id":"I3879:36021;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36021;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2031":{"id":"I3879:36021;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2030","childrenIds":["I3879:36021;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2033":{"id":"I3879:36021;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2030","childrenIds":["I3879:36021;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2035":{"id":"I3879:36021;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36021;1690:32934;17:2030","childrenIds":["I3879:36021;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2038":{"id":"I3879:36025;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36025;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2031":{"id":"I3879:36025;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2030","childrenIds":["I3879:36025;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2033":{"id":"I3879:36025;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2030","childrenIds":["I3879:36025;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2035":{"id":"I3879:36025;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36025;1690:32934;17:2030","childrenIds":["I3879:36025;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2032":{"id":"I3879:36009;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36009;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2034":{"id":"I3879:36009;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36009;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36009;1690:32934;17:2036":{"id":"I3879:36009;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36009;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2032":{"id":"I3879:36013;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36013;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2034":{"id":"I3879:36013;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36013;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36013;1690:32934;17:2036":{"id":"I3879:36013;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36013;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2032":{"id":"I3879:36017;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36017;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2034":{"id":"I3879:36017;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36017;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36017;1690:32934;17:2036":{"id":"I3879:36017;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36017;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2032":{"id":"I3879:36021;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36021;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2034":{"id":"I3879:36021;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36021;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36021;1690:32934;17:2036":{"id":"I3879:36021;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36021;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2032":{"id":"I3879:36025;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36025;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2034":{"id":"I3879:36025;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36025;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36025;1690:32934;17:2036":{"id":"I3879:36025;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36025;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:278:3649","name":"primaryBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:63:1980","name":"gray200","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,","name":"bodySm","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36059.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36059.json new file mode 100644 index 0000000..e07c46c --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36059.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:36059","capture":"official Figma MCP use_figma read-only projection","nodeCount":64},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:36059"],"nodes":{"3879:36059":{"id":"3879:36059","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:36062","3879:36063","3879:36095"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-RECORD #recording","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":1179,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36062":{"id":"3879:36062","type":"INSTANCE","fields":{"parentId":"3879:36059","childrenIds":["I3879:36062;65:3062","I3879:36062;95:2140"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"Slot#2586:0":{"preferredValues":[],"type":"SLOT"},"Title#65:0":{"type":"BOOLEAN","value":false},"button#98:0":{"type":"BOOLEAN","value":true},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"back"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":66,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":8,"paddingLeft":0,"paddingRight":0,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":0,"paddingRight":0,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":0,"strokeWeight":{"$unsupported":"symbol"},"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"back"},"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36063":{"id":"3879:36063","type":"FRAME","fields":{"parentId":"3879:36059","childrenIds":["3879:36064","3879:36065","3879:36070","3879:36071","3879:36094"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":674,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":20,"layoutAlign":"STRETCH","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":30,"paddingRight":30,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":20,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":30,"paddingRight":30,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":66},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36095":{"id":"3879:36095","type":"FRAME","fields":{"parentId":"3879:36059","childrenIds":["3879:36107"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blurType":"NORMAL","boundVariables":{},"radius":8,"type":"BACKGROUND_BLUR","visible":true}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":0.699999988079071,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315194","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;65:3062":{"id":"I3879:36062;65:3062","type":"FRAME","fields":{"parentId":"3879:36062","childrenIds":["I3879:36062;65:3063"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":50,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086041","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":42,"y":42},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":50,"x":0,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140":{"id":"I3879:36062;95:2140","type":"SLOT","fields":{"parentId":"3879:36062","childrenIds":["I3879:36062;95:2140;3879:36061"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{"slotContentId":"Slot#2586:0","visible":"button#98:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":50,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":20,"paddingRight":20,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Slot","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":20,"paddingRight":20,"paddingTop":0,"primaryAxisAlignItems":"CENTER","rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":105,"x":255,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36064":{"id":"3879:36064","type":"TEXT","fields":{"parentId":"3879:36063","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":24,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":102,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,","visible":true,"width":300,"x":30,"y":20,"styledTextSegments":[{"characters":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","end":49,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":24,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36065":{"id":"3879:36065","type":"FRAME","fields":{"parentId":"3879:36063","childrenIds":["3879:36066","3879:36069"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:63:934","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:934","type":"VARIABLE_ALIAS"}},"color":{"b":0.9011186957359314,"g":0.9278846383094788,"r":0.9024569988250732},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":16,"paddingRight":16,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315259","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":16,"paddingRight":16,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":300,"x":30,"y":142},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36070":{"id":"3879:36070","type":"TEXT","fields":{"parentId":"3879:36063","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"그건 어느 추운 겨울날이었어. 바깥에는 \n첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Medium"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":268,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FILL","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그건 어느 추운 겨울날이었어. 바깥에는 첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"NONE","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,","visible":true,"width":300,"x":30,"y":208,"styledTextSegments":[{"characters":"그건 어느 추운 겨울날이었어. 바깥에는 \n첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","end":93,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Medium"},"fontSize":18,"fontWeight":500,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36071":{"id":"3879:36071","type":"FRAME","fields":{"parentId":"3879:36063","childrenIds":["3879:36072","3879:36079","3879:36088"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":112,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":30,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314906","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":260,"x":50,"y":496},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36094":{"id":"3879:36094","type":"TEXT","fields":{"parentId":"3879:36063","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"임시 저장하고 다음에 이어서 하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"임시 저장하고 다음에 이어서 하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"UNDERLINE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":207,"x":76.5,"y":628,"styledTextSegments":[{"characters":"임시 저장하고 다음에 이어서 하기","end":18,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"UNDERLINE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36107":{"id":"3879:36107","type":"INSTANCE","fields":{"parentId":"3879:36095","childrenIds":["I3879:36107;68:5150","I3879:36107;68:5159"],"blendMode":"PASS_THROUGH","bottomLeftRadius":20,"bottomRightRadius":20,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"2nd Button#68:0":{"type":"BOOLEAN","value":true},"Slot#2980:0":{"preferredValues":[],"type":"SLOT"}},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"CENTER"},"cornerRadius":20,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":347,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":20,"topRightRadius":20,"variantProperties":null,"visible":true,"width":320,"x":20,"y":196.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;65:3063":{"id":"I3879:36062;65:3063","type":"FRAME","fields":{"parentId":"I3879:36062;65:3062","childrenIds":["I3879:36062;65:3064"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":32,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":32,"x":41,"y":9},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061":{"id":"I3879:36062;95:2140;3879:36061","type":"INSTANCE","fields":{"parentId":"I3879:36062;95:2140","childrenIds":["I3879:36062;95:2140;3879:36061;2586:33547","I3879:36062;95:2140;3879:36061;2586:33209"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"ResetBtn","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":65,"x":20,"y":13},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36066":{"id":"3879:36066","type":"FRAME","fields":{"parentId":"3879:36065","childrenIds":["3879:36067"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"information-button_1176 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":23.625,"y":23.625},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":50,"y":15},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36069":{"id":"3879:36069","type":"TEXT","fields":{"parentId":"3879:36065","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 막힐 때 눌러보세요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 막힐 때 눌러보세요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":176,"x":74,"y":10,"styledTextSegments":[{"characters":"이야기가 막힐 때 눌러보세요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36072":{"id":"3879:36072","type":"FRAME","fields":{"parentId":"3879:36071","childrenIds":["3879:36073","3879:36074"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":92,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314909","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36079":{"id":"3879:36079","type":"FRAME","fields":{"parentId":"3879:36071","childrenIds":["3879:36080","3879:36081"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":112,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314907","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":80,"x":90,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36088":{"id":"3879:36088","type":"FRAME","fields":{"parentId":"3879:36071","childrenIds":["3879:36089","3879:36090"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":92,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314908","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":200,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5150":{"id":"I3879:36107;68:5150","type":"FRAME","fields":{"parentId":"3879:36107","childrenIds":["I3879:36107;68:5149","I3879:36107;2980:19280"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":286,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":180,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":30,"paddingLeft":30,"paddingRight":30,"paddingTop":30,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5159":{"id":"I3879:36107;68:5159","type":"FRAME","fields":{"parentId":"3879:36107","childrenIds":["I3879:36107;68:5153","I3879:36107;68:5157"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"AUTO","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086045","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":320,"x":0,"y":286},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;65:3064":{"id":"I3879:36062;65:3064","type":"VECTOR","fields":{"parentId":"I3879:36062;65:3063","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.667766571044922,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":10.667767524719238,"x":11.999348640441895,"y":6.666015625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061;2586:33547":{"id":"I3879:36062;95:2140;3879:36061;2586:33547","type":"FRAME","fields":{"parentId":"I3879:36062;95:2140;3879:36061","childrenIds":["I3879:36062;95:2140;3879:36061;2586:33548"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"arrow_7134700 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":512,"y":512},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":0,"y":2},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061;2586:33209":{"id":"I3879:36062;95:2140;3879:36061;2586:33209","type":"TEXT","fields":{"parentId":"I3879:36062;95:2140;3879:36061","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"초기화","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"초기화","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":39,"x":26,"y":0,"styledTextSegments":[{"characters":"초기화","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36067":{"id":"3879:36067","type":"GROUP","fields":{"parentId":"3879:36066","childrenIds":["3879:36068"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":16,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36073":{"id":"3879:36073","type":"TEXT","fields":{"parentId":"3879:36072","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"직접 입력","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"직접 입력","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":55,"x":2.5,"y":0,"styledTextSegments":[{"characters":"직접 입력","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36074":{"id":"3879:36074","type":"FRAME","fields":{"parentId":"3879:36072","childrenIds":["3879:36075","3879:36076"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36080":{"id":"3879:36080","type":"TEXT","fields":{"parentId":"3879:36079","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"녹음하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"녹음하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":52,"x":14,"y":0,"styledTextSegments":[{"characters":"녹음하기","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36081":{"id":"3879:36081","type":"FRAME","fields":{"parentId":"3879:36079","childrenIds":["3879:36082","3879:36083"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":80,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":80,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36089":{"id":"3879:36089","type":"TEXT","fields":{"parentId":"3879:36088","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"작성 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작성 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":55,"x":2.5,"y":0,"styledTextSegments":[{"characters":"작성 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36090":{"id":"3879:36090","type":"FRAME","fields":{"parentId":"3879:36088","childrenIds":["3879:36091","3879:36092"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5149":{"id":"I3879:36107;68:5149","type":"TEXT","fields":{"parentId":"I3879:36107;68:5150","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기 다듬기 시작","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":28,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"제목 영역","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,","visible":true,"width":144,"x":88,"y":30,"styledTextSegments":[{"characters":"이야기 다듬기 시작","end":10,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":20,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:a1feb32fafade1f7851c893543777997b57c2c55,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280":{"id":"I3879:36107;2980:19280","type":"SLOT","fields":{"parentId":"I3879:36107;68:5150","childrenIds":["I3879:36107;2980:19280;3879:36097","I3879:36107;2980:19280;3879:36098"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{"slotContentId":"Slot#2980:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":190,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Slot","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":260,"x":30,"y":66},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5153":{"id":"I3879:36107;68:5153","type":"FRAME","fields":{"parentId":"I3879:36107;68:5159","childrenIds":["I3879:36107;68:5154"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5157":{"id":"I3879:36107;68:5157","type":"FRAME","fields":{"parentId":"I3879:36107;68:5159","childrenIds":["I3879:36107;68:5158"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{"visible":"2nd Button#68:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":61,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":1,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Alert","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":10,"paddingRight":10,"paddingTop":16,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":1,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":160,"x":160,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061;2586:33548":{"id":"I3879:36062;95:2140;3879:36061;2586:33548","type":"GROUP","fields":{"parentId":"I3879:36062;95:2140;3879:36061;2586:33547","childrenIds":["I3879:36062;95:2140;3879:36061;2586:33549","I3879:36062;95:2140;3879:36061;2586:33550"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16.03499984741211,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icon","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.625,"x":2.1875,"y":1.9824999570846558},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36068":{"id":"3879:36068","type":"VECTOR","fields":{"parentId":"3879:36067","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":16,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36075":{"id":"3879:36075","type":"ELLIPSE","fields":{"parentId":"3879:36074","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":60,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":60,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36076":{"id":"3879:36076","type":"FRAME","fields":{"parentId":"3879:36074","childrenIds":["3879:36077","3879:36078"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"keyboard_709647 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":18,"y":18},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36082":{"id":"3879:36082","type":"ELLIPSE","fields":{"parentId":"3879:36081","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":80,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":80,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36083":{"id":"3879:36083","type":"FRAME","fields":{"parentId":"3879:36081","childrenIds":["3879:36084"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":30,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"microphone-black-shape_25682 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":30,"x":25,"y":25},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36091":{"id":"3879:36091","type":"ELLIPSE","fields":{"parentId":"3879:36090","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":60,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":60,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36092":{"id":"3879:36092","type":"FRAME","fields":{"parentId":"3879:36090","childrenIds":["3879:36093"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"check_16798878 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":18,"y":18},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36097":{"id":"I3879:36107;2980:19280;3879:36097","type":"TEXT","fields":{"parentId":"I3879:36107;2980:19280","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기를 마무리 하고\r\n글 다듬기를 시작하시겠습니까?","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":58,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기를 마무리 하고 글 다듬기를 시작하시겠습니까?","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,","visible":true,"width":260,"x":0,"y":0,"styledTextSegments":[{"characters":"이야기를 마무리 하고\r\n글 다듬기를 시작하시겠습니까?","end":29,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":17,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36098":{"id":"I3879:36107;2980:19280;3879:36098","type":"FRAME","fields":{"parentId":"I3879:36107;2980:19280","childrenIds":["I3879:36107;2980:19280;3879:36099","I3879:36107;2980:19280;3879:36100"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1759","type":"VARIABLE_ALIAS"}},"color":{"b":0.9646434783935547,"g":0.9646434783935547,"r":0.9646434783935547},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":120,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":16,"paddingRight":16,"paddingTop":12,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":260,"x":0,"y":70},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5154":{"id":"I3879:36107;68:5154","type":"TEXT","fields":{"parentId":"I3879:36107;68:5153","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"더 이야기 할게요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":110,"x":25,"y":16,"styledTextSegments":[{"characters":"더 이야기 할게요","end":9,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;68:5158":{"id":"I3879:36107;68:5158","type":"TEXT","fields":{"parentId":"I3879:36107;68:5157","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"마무리 할게요","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"버튼명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":92,"x":34,"y":16,"styledTextSegments":[{"characters":"마무리 할게요","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061;2586:33549":{"id":"I3879:36062;95:2140;3879:36061;2586:33549","type":"VECTOR","fields":{"parentId":"I3879:36062;95:2140;3879:36061;2586:33548","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.625,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":32,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.625,"x":2.1875,"y":2.3925000429153442},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36062;95:2140;3879:36061;2586:33550":{"id":"I3879:36062;95:2140;3879:36061;2586:33550","type":"VECTOR","fields":{"parentId":"I3879:36062;95:2140;3879:36061;2586:33548","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":5.409999847412109,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":32,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.409999847412109,"x":11.15250015258789,"y":1.9824999570846558},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36077":{"id":"3879:36077","type":"VECTOR","fields":{"parentId":"3879:36076","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":4.500277042388916,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":8.000702857971191,"x":7.999648571014404,"y":0.5001158714294434},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36078":{"id":"3879:36078","type":"VECTOR","fields":{"parentId":"3879:36076","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":20,"x":2,"y":9},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36084":{"id":"3879:36084","type":"GROUP","fields":{"parentId":"3879:36083","childrenIds":["3879:36085"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29.99968719482422,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.615194797515869,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36093":{"id":"3879:36093","type":"VECTOR","fields":{"parentId":"3879:36092","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.471784591674805,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":24.000240325927734,"x":0,"y":3.763671875},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36099":{"id":"I3879:36107;2980:19280;3879:36099","type":"TEXT","fields":{"parentId":"I3879:36107;2980:19280;3879:36098","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"원하는 글 다듬기 방식을 선택해주세요.","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"원하는 글 다듬기 방식을 선택해주세요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","visible":true,"width":228,"x":16,"y":12,"styledTextSegments":[{"characters":"원하는 글 다듬기 방식을 선택해주세요.","end":21,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36100":{"id":"I3879:36107;2980:19280;3879:36100","type":"FRAME","fields":{"parentId":"I3879:36107;2980:19280;3879:36098","childrenIds":["I3879:36107;2980:19280;3879:36101","I3879:36107;2980:19280;3879:36104"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":228,"x":16,"y":48},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36085":{"id":"3879:36085","type":"GROUP","fields":{"parentId":"3879:36084","childrenIds":["3879:36086","3879:36087"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29.99968719482422,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.615194797515869,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36101":{"id":"I3879:36107;2980:19280;3879:36101","type":"FRAME","fields":{"parentId":"I3879:36107;2980:19280;3879:36100","childrenIds":["I3879:36107;2980:19280;3879:36102","I3879:36107;2980:19280;3879:36103"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315483","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":228,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36104":{"id":"I3879:36107;2980:19280;3879:36104","type":"FRAME","fields":{"parentId":"I3879:36107;2980:19280;3879:36100","childrenIds":["I3879:36107;2980:19280;3879:36105","I3879:36107;2980:19280;3879:36106"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":26,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315484","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":228,"x":0,"y":34},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36086":{"id":"3879:36086","type":"VECTOR","fields":{"parentId":"3879:36085","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":20.768726348876953,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":11.538020133972168,"x":9.230706214904785,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36087":{"id":"3879:36087","type":"VECTOR","fields":{"parentId":"3879:36085","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.46160125732422,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.6151951314221265,"y":11.538398742675781},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36102":{"id":"I3879:36107;2980:19280;3879:36102","type":"INSTANCE","fields":{"parentId":"I3879:36107;2980:19280;3879:36101","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"selected"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":6,"strokeLeftWeight":6,"strokeRightWeight":6,"strokeStyleId":"","strokeTopWeight":6,"strokeWeight":6,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"selected"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36103":{"id":"I3879:36107;2980:19280;3879:36103","type":"TEXT","fields":{"parentId":"I3879:36107;2980:19280;3879:36101","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"AI 담당자와 함께 문체 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"AI 담당자와 함께 문체 다듬기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":180,"x":28,"y":0,"styledTextSegments":[{"characters":"AI 담당자와 함께 문체 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36105":{"id":"I3879:36107;2980:19280;3879:36105","type":"INSTANCE","fields":{"parentId":"I3879:36107;2980:19280;3879:36104","childrenIds":[],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Radio","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":{"x":36,"y":36},"topLeftRadius":1000,"topRightRadius":1000,"variantProperties":{"속성 1":"default"},"visible":true,"width":20,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36107;2980:19280;3879:36106":{"id":"I3879:36107;2980:19280;3879:36106","type":"TEXT","fields":{"parentId":"I3879:36107;2980:19280;3879:36104","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"내 문장 그대로 맞춤법만 다듬기","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"내 문장 그대로 맞춤법만 다듬기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":194,"x":28,"y":0,"styledTextSegments":[{"characters":"내 문장 그대로 맞춤법만 다듬기","end":17,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1759","name":"gray100","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:996","name":"secondary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:934","name":"dustyMintBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,","name":"recordText","remote":false,"styleType":"TEXT"},{"id":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,","name":"h4","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:a1feb32fafade1f7851c893543777997b57c2c55,","name":"h6","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:dbab53f60e8c4def3ceca64d8adce1a57158e692,","name":"bodySm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36108.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36108.json new file mode 100644 index 0000000..3027dfc --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36108.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:36108","capture":"official Figma MCP use_figma read-only projection","nodeCount":44},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:36108"],"nodes":{"3879:36108":{"id":"3879:36108","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:36111","3879:36112"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-F-RECORD #recording","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":655,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36111":{"id":"3879:36111","type":"INSTANCE","fields":{"parentId":"3879:36108","childrenIds":["I3879:36111;65:3062","I3879:36111;95:2140"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"Slot#2586:0":{"preferredValues":[],"type":"SLOT"},"Title#65:0":{"type":"BOOLEAN","value":false},"button#98:0":{"type":"BOOLEAN","value":true},"속성 1":{"boundVariables":{},"type":"VARIANT","value":"back"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":66,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":8,"paddingLeft":0,"paddingRight":0,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":0,"paddingRight":0,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":0,"strokeWeight":{"$unsupported":"symbol"},"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"back"},"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36112":{"id":"3879:36112","type":"FRAME","fields":{"parentId":"3879:36108","childrenIds":["3879:36113","3879:36114","3879:36119","3879:36120","3879:36143"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":674,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":20,"layoutAlign":"STRETCH","layoutGrow":1,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":20,"paddingLeft":30,"paddingRight":30,"paddingTop":20,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":20,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":20,"paddingLeft":30,"paddingRight":30,"paddingTop":20,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":66},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;65:3062":{"id":"I3879:36111;65:3062","type":"FRAME","fields":{"parentId":"3879:36111","childrenIds":["I3879:36111;65:3063"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":50,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086041","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":42,"y":42},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":50,"x":0,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140":{"id":"I3879:36111;95:2140","type":"SLOT","fields":{"parentId":"3879:36111","childrenIds":["I3879:36111;95:2140;3879:36110"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{"slotContentId":"Slot#2586:0","visible":"button#98:0"},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":50,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":20,"paddingRight":20,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"FILL","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Slot","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":20,"paddingRight":20,"paddingTop":0,"primaryAxisAlignItems":"CENTER","rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":105,"x":255,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36113":{"id":"3879:36113","type":"TEXT","fields":{"parentId":"3879:36112","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":24,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":102,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,","visible":true,"width":300,"x":30,"y":20,"styledTextSegments":[{"characters":"주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요","end":49,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":24,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36114":{"id":"3879:36114","type":"FRAME","fields":{"parentId":"3879:36112","childrenIds":["3879:36115","3879:36118"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:63:934","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:934","type":"VARIABLE_ALIAS"}},"color":{"b":0.9011186957359314,"g":0.9278846383094788,"r":0.9024569988250732},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":16,"paddingRight":16,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315259","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":16,"paddingRight":16,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":300,"x":30,"y":142},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36119":{"id":"3879:36119","type":"TEXT","fields":{"parentId":"3879:36112","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"그건 어느 추운 겨울날이었어. 바깥에는 \n첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Medium"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":268,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FILL","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그건 어느 추운 겨울날이었어. 바깥에는 첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"NONE","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,","visible":true,"width":300,"x":30,"y":208,"styledTextSegments":[{"characters":"그건 어느 추운 겨울날이었어. 바깥에는 \n첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어.","end":93,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Medium"},"fontSize":18,"fontWeight":500,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36120":{"id":"3879:36120","type":"FRAME","fields":{"parentId":"3879:36112","childrenIds":["3879:36121","3879:36128","3879:36137"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":112,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":30,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314906","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":260,"x":50,"y":496},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36143":{"id":"3879:36143","type":"TEXT","fields":{"parentId":"3879:36112","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"characters":"임시 저장하고 다음에 이어서 하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"임시 저장하고 다음에 이어서 하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"UNDERLINE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":207,"x":76.5,"y":628,"styledTextSegments":[{"characters":"임시 저장하고 다음에 이어서 하기","end":18,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"UNDERLINE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;65:3063":{"id":"I3879:36111;65:3063","type":"FRAME","fields":{"parentId":"I3879:36111;65:3062","childrenIds":["I3879:36111;65:3064"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":32,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":32,"x":41,"y":9},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110":{"id":"I3879:36111;95:2140;3879:36110","type":"INSTANCE","fields":{"parentId":"I3879:36111;95:2140","childrenIds":["I3879:36111;95:2140;3879:36110;2586:33547","I3879:36111;95:2140;3879:36110;2586:33209"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"ResetBtn","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":65,"x":20,"y":13},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36115":{"id":"3879:36115","type":"FRAME","fields":{"parentId":"3879:36114","childrenIds":["3879:36116"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"information-button_1176 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":23.625,"y":23.625},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":50,"y":15},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36118":{"id":"3879:36118","type":"TEXT","fields":{"parentId":"3879:36114","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 막힐 때 눌러보세요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 막힐 때 눌러보세요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":176,"x":74,"y":10,"styledTextSegments":[{"characters":"이야기가 막힐 때 눌러보세요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36121":{"id":"3879:36121","type":"FRAME","fields":{"parentId":"3879:36120","childrenIds":["3879:36122","3879:36123"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":92,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314909","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36128":{"id":"3879:36128","type":"FRAME","fields":{"parentId":"3879:36120","childrenIds":["3879:36129","3879:36130"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":112,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314907","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":80,"x":90,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36137":{"id":"3879:36137","type":"FRAME","fields":{"parentId":"3879:36120","childrenIds":["3879:36138","3879:36139"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":92,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":8,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314908","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":200,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;65:3064":{"id":"I3879:36111;65:3064","type":"VECTOR","fields":{"parentId":"I3879:36111;65:3063","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.667766571044922,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":10.667767524719238,"x":11.999348640441895,"y":6.666015625},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110;2586:33547":{"id":"I3879:36111;95:2140;3879:36110;2586:33547","type":"FRAME","fields":{"parentId":"I3879:36111;95:2140;3879:36110","childrenIds":["I3879:36111;95:2140;3879:36110;2586:33548"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"arrow_7134700 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":512,"y":512},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":0,"y":2},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110;2586:33209":{"id":"I3879:36111;95:2140;3879:36110;2586:33209","type":"TEXT","fields":{"parentId":"I3879:36111;95:2140;3879:36110","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"초기화","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"초기화","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":39,"x":26,"y":0,"styledTextSegments":[{"characters":"초기화","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36116":{"id":"3879:36116","type":"GROUP","fields":{"parentId":"3879:36115","childrenIds":["3879:36117"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":16,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36122":{"id":"3879:36122","type":"TEXT","fields":{"parentId":"3879:36121","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"직접 입력","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"직접 입력","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":55,"x":2.5,"y":0,"styledTextSegments":[{"characters":"직접 입력","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36123":{"id":"3879:36123","type":"FRAME","fields":{"parentId":"3879:36121","childrenIds":["3879:36124","3879:36125"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36129":{"id":"3879:36129","type":"TEXT","fields":{"parentId":"3879:36128","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"녹음하기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"녹음하기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":52,"x":14,"y":0,"styledTextSegments":[{"characters":"녹음하기","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36130":{"id":"3879:36130","type":"FRAME","fields":{"parentId":"3879:36128","childrenIds":["3879:36131","3879:36132"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":80,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":80,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36138":{"id":"3879:36138","type":"TEXT","fields":{"parentId":"3879:36137","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"작성 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":24,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작성 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","visible":true,"width":55,"x":2.5,"y":0,"styledTextSegments":[{"characters":"작성 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36139":{"id":"3879:36139","type":"FRAME","fields":{"parentId":"3879:36137","childrenIds":["3879:36140","3879:36141"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.25,"b":0.529411792755127,"g":0.3764705955982208,"r":0.27450981736183167},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":true}],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":60,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"플레이 버튼","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":64,"y":64},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":60,"x":0,"y":32},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110;2586:33548":{"id":"I3879:36111;95:2140;3879:36110;2586:33548","type":"GROUP","fields":{"parentId":"I3879:36111;95:2140;3879:36110;2586:33547","childrenIds":["I3879:36111;95:2140;3879:36110;2586:33549","I3879:36111;95:2140;3879:36110;2586:33550"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16.03499984741211,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icon","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.625,"x":2.1875,"y":1.9824999570846558},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36117":{"id":"3879:36117","type":"VECTOR","fields":{"parentId":"3879:36116","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":16,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":16,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36124":{"id":"3879:36124","type":"ELLIPSE","fields":{"parentId":"3879:36123","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":60,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":60,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36125":{"id":"3879:36125","type":"FRAME","fields":{"parentId":"3879:36123","childrenIds":["3879:36126","3879:36127"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"keyboard_709647 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":18,"y":18},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36131":{"id":"3879:36131","type":"ELLIPSE","fields":{"parentId":"3879:36130","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":80,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":80,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36132":{"id":"3879:36132","type":"FRAME","fields":{"parentId":"3879:36130","childrenIds":["3879:36133"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":30,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"microphone-black-shape_25682 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":30,"x":25,"y":25},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36140":{"id":"3879:36140","type":"ELLIPSE","fields":{"parentId":"3879:36139","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[{"blendMode":"NORMAL","boundVariables":{},"color":{"a":0.15000000596046448,"b":0,"g":0,"r":0},"offset":{"x":0,"y":4},"radius":32,"showShadowBehindNode":true,"spread":0,"type":"DROP_SHADOW","visible":false}],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:996","type":"VARIABLE_ALIAS"}},"color":{"b":0.5251548886299133,"g":0.5608974099159241,"r":0.34247100353240967},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":60,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Ellipse","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":5,"strokes":[],"targetAspectRatio":null,"visible":true,"width":60,"x":0,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36141":{"id":"3879:36141","type":"FRAME","fields":{"parentId":"3879:36139","childrenIds":["3879:36142"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":24,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"check_16798878 1","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":24,"x":18,"y":18},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110;2586:33549":{"id":"I3879:36111;95:2140;3879:36110;2586:33549","type":"VECTOR","fields":{"parentId":"I3879:36111;95:2140;3879:36110;2586:33548","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.625,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":32,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.625,"x":2.1875,"y":2.3925000429153442},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36111;95:2140;3879:36110;2586:33550":{"id":"I3879:36111;95:2140;3879:36110;2586:33550","type":"VECTOR","fields":{"parentId":"I3879:36111;95:2140;3879:36110;2586:33548","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":5.409999847412109,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":32,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.409999847412109,"x":11.15250015258789,"y":1.9824999570846558},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36126":{"id":"3879:36126","type":"VECTOR","fields":{"parentId":"3879:36125","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":4.500277042388916,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":8.000702857971191,"x":7.999648571014404,"y":0.5001158714294434},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36127":{"id":"3879:36127","type":"VECTOR","fields":{"parentId":"3879:36125","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":0,"strokes":[],"targetAspectRatio":null,"visible":true,"width":20,"x":2,"y":9},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36133":{"id":"3879:36133","type":"GROUP","fields":{"parentId":"3879:36132","childrenIds":["3879:36134"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29.99968719482422,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.615194797515869,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36142":{"id":"3879:36142","type":"VECTOR","fields":{"parentId":"3879:36141","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.471784591674805,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":24.000240325927734,"x":0,"y":3.763671875},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36134":{"id":"3879:36134","type":"GROUP","fields":{"parentId":"3879:36133","childrenIds":["3879:36135","3879:36136"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29.99968719482422,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.615194797515869,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36135":{"id":"3879:36135","type":"VECTOR","fields":{"parentId":"3879:36134","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":20.768726348876953,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":11.538020133972168,"x":9.230706214904785,"y":0},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36136":{"id":"3879:36136","type":"VECTOR","fields":{"parentId":"3879:36134","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":18.46160125732422,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"visible":true,"width":20.769607543945312,"x":4.6151951314221265,"y":11.538398742675781},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:996","name":"secondary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:934","name":"dustyMintBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:2719cb5b4c133cdf10bfe0bad06eeada1104bab5,","name":"recordText","remote":false,"styleType":"TEXT"},{"id":"S:6646d53069fc8c24eed906edaf8aee78d1a1127a,","name":"h4","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:5740aa8fd49a2485a03f0362a351a2f7e6a27ea7/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:f106577b267721beec7e84f75f1e1bf1fa7c4189/4:85","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:93beed88c39fcbe315b2535774491acd1b2f3bed/4:84"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36144.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36144.json new file mode 100644 index 0000000..3a5406d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/3879-36144.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:36144","capture":"official Figma MCP use_figma read-only projection","nodeCount":128},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:36144"],"nodes":{"3879:36144":{"id":"3879:36144","type":"FRAME","fields":{"parentId":"4217:7743","childrenIds":["3879:36145","3879:36165","3879:36186"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":740,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"A : STORY-PROOFREAD","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":2871,"y":458},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36145":{"id":"3879:36145","type":"FRAME","fields":{"parentId":"3879:36144","childrenIds":["3879:36146","3879:36147","3879:36154","3879:36159"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":696,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":30,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 26086002","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36165":{"id":"3879:36165","type":"FRAME","fields":{"parentId":"3879:36144","childrenIds":["3879:36166","3879:36170","3879:36174","3879:36178","3879:36182"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":3477,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314922","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":696},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36186":{"id":"3879:36186","type":"FRAME","fields":{"parentId":"3879:36144","childrenIds":["3879:36187","3879:36189"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":true,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MAX"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":67,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":4,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Header","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":0,"strokeLeftWeight":0,"strokeRightWeight":0,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":{"$unsupported":"symbol"},"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":673},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36146":{"id":"3879:36146","type":"TEXT","fields":{"parentId":"3879:36145","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"이야기가 글로 \n정리되었어요","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"이야기가 글로 정리되었어요","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","visible":true,"width":328,"x":16,"y":50,"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36147":{"id":"3879:36147","type":"FRAME","fields":{"parentId":"3879:36145","childrenIds":["3879:36148"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":20,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":20,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315453","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":158},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36154":{"id":"3879:36154","type":"FRAME","fields":{"parentId":"3879:36145","childrenIds":["3879:36155","3879:36158"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":241,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":328,"x":16,"y":241},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36159":{"id":"3879:36159","type":"FRAME","fields":{"parentId":"3879:36145","childrenIds":["3879:36160","3879:36161","3879:36162"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":144,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314914","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":16,"y":512},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36166":{"id":"3879:36166","type":"FRAME","fields":{"parentId":"3879:36165","childrenIds":["3879:36167","3879:36168"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":125,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314924","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36170":{"id":"3879:36170","type":"FRAME","fields":{"parentId":"3879:36165","childrenIds":["3879:36171","3879:36172"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":542,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314926","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":125},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36174":{"id":"3879:36174","type":"FRAME","fields":{"parentId":"3879:36165","childrenIds":["3879:36175","3879:36176"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":766,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314927","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":667},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36178":{"id":"3879:36178","type":"FRAME","fields":{"parentId":"3879:36165","childrenIds":["3879:36179","3879:36180"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":990,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314928","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":1433},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36182":{"id":"3879:36182","type":"FRAME","fields":{"parentId":"3879:36165","childrenIds":["3879:36183","3879:36184"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1054,"inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314929","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":2423},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36187":{"id":"3879:36187","type":"FRAME","fields":{"parentId":"3879:36186","childrenIds":["3879:36188"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314935","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":10,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36189":{"id":"3879:36189","type":"FRAME","fields":{"parentId":"3879:36186","childrenIds":["3879:36190"],"blendMode":"PASS_THROUGH","bottomLeftRadius":10,"bottomRightRadius":10,"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":10,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":51,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314934","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":10,"topRightRadius":10,"visible":true,"width":106,"x":244,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36148":{"id":"3879:36148","type":"FRAME","fields":{"parentId":"3879:36147","childrenIds":["3879:36149"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":53,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315248","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36155":{"id":"3879:36155","type":"FRAME","fields":{"parentId":"3879:36154","childrenIds":["3879:36156","3879:36157"],"blendMode":"PASS_THROUGH","bottomLeftRadius":12,"bottomRightRadius":12,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":12,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[4,4],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":185,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":8,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314916","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":2,"strokeLeftWeight":2,"strokeRightWeight":2,"strokeStyleId":"","strokeTopWeight":2,"strokeWeight":2,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"topLeftRadius":12,"topRightRadius":12,"visible":true,"width":328,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36158":{"id":"3879:36158","type":"TEXT","fields":{"parentId":"3879:36154","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":44,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","visible":true,"width":328,"x":0,"y":197,"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36160":{"id":"3879:36160","type":"TEXT","fields":{"parentId":"3879:36159","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"TIP","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"TIP","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":24,"x":16,"y":16,"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36161":{"id":"3879:36161","type":"TEXT","fields":{"parentId":"3879:36159","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":78,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":296,"x":16,"y":50,"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36162":{"id":"3879:36162","type":"FRAME","fields":{"parentId":"3879:36159","childrenIds":["3879:36163"],"blendMode":"PASS_THROUGH","bottomLeftRadius":1000,"bottomRightRadius":1000,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MAX","vertical":"MIN"},"cornerRadius":1000,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"X 아이콘","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":1000,"topRightRadius":1000,"visible":true,"width":40,"x":280,"y":8},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36167":{"id":"3879:36167","type":"INSTANCE","fields":{"parentId":"3879:36166","childrenIds":["I3879:36167;1690:32933","I3879:36167;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36168":{"id":"3879:36168","type":"FRAME","fields":{"parentId":"3879:36166","childrenIds":["3879:36169"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":79,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314917","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36171":{"id":"3879:36171","type":"INSTANCE","fields":{"parentId":"3879:36170","childrenIds":["I3879:36171;1690:32933","I3879:36171;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36172":{"id":"3879:36172","type":"FRAME","fields":{"parentId":"3879:36170","childrenIds":["3879:36173"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":496,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36175":{"id":"3879:36175","type":"INSTANCE","fields":{"parentId":"3879:36174","childrenIds":["I3879:36175;1690:32933","I3879:36175;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36176":{"id":"3879:36176","type":"FRAME","fields":{"parentId":"3879:36174","childrenIds":["3879:36177"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":720,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36179":{"id":"3879:36179","type":"INSTANCE","fields":{"parentId":"3879:36178","childrenIds":["I3879:36179;1690:32933","I3879:36179;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36180":{"id":"3879:36180","type":"FRAME","fields":{"parentId":"3879:36178","childrenIds":["3879:36181"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":944,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36183":{"id":"3879:36183","type":"INSTANCE","fields":{"parentId":"3879:36182","childrenIds":["I3879:36183;1690:32933","I3879:36183;1690:32948"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentProperties":{},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":46,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"SectionTitle","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"variantProperties":null,"visible":true,"width":360,"x":0,"y":0},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36184":{"id":"3879:36184","type":"FRAME","fields":{"parentId":"3879:36182","childrenIds":["3879:36185"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":1008,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":10,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321314918","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":360,"x":0,"y":46},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36188":{"id":"3879:36188","type":"TEXT","fields":{"parentId":"3879:36187","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"교정 설정","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"교정 설정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"교정 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36190":{"id":"3879:36190","type":"TEXT","fields":{"parentId":"3879:36189","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"characters":"검토 완료","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"검토 완료","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","visible":true,"width":66,"x":20,"y":10,"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36149":{"id":"3879:36149","type":"FRAME","fields":{"parentId":"3879:36148","childrenIds":["3879:36150","3879:36151","3879:36152"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":29,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":12,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315390","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":170,"x":79,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36156":{"id":"3879:36156","type":"INSTANCE","fields":{"parentId":"3879:36155","childrenIds":["I3879:36156;20:3849"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentProperties":{"Property 1":{"boundVariables":{},"type":"VARIANT","value":"imagePlus"}},"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":40,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":24,"y":24},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"Property 1":"imagePlus"},"visible":true,"width":40,"x":144,"y":20.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36157":{"id":"3879:36157","type":"TEXT","fields":{"parentId":"3879:36155","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":15,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":96,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":296,"x":16,"y":68.5,"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36163":{"id":"3879:36163","type":"FRAME","fields":{"parentId":"3879:36162","childrenIds":["3879:36164"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":20,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-180,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":20,"x":30,"y":10},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32933":{"id":"I3879:36167;1690:32933","type":"TEXT","fields":{"parentId":"3879:36167","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"제목","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":28,"x":20,"y":10,"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32948":{"id":"I3879:36167;1690:32948","type":"FRAME","fields":{"parentId":"3879:36167","childrenIds":["I3879:36167;1690:32934","I3879:36167;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36169":{"id":"3879:36169","type":"TEXT","fields":{"parentId":"3879:36168","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"작은 시장, 큰 사랑","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":31,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"작은 시장, 큰 사랑","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32933":{"id":"I3879:36171;1690:32933","type":"TEXT","fields":{"parentId":"3879:36171","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"1단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":35,"x":20,"y":10,"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32948":{"id":"I3879:36171;1690:32948","type":"FRAME","fields":{"parentId":"3879:36171","childrenIds":["I3879:36171;1690:32934","I3879:36171;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36173":{"id":"3879:36173","type":"TEXT","fields":{"parentId":"3879:36172","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":448,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32933":{"id":"I3879:36175;1690:32933","type":"TEXT","fields":{"parentId":"3879:36175","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"2단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":37,"x":20,"y":10,"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32948":{"id":"I3879:36175;1690:32948","type":"FRAME","fields":{"parentId":"3879:36175","childrenIds":["I3879:36175;1690:32934","I3879:36175;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36177":{"id":"3879:36177","type":"TEXT","fields":{"parentId":"3879:36176","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":{"$unsupported":"symbol"},"fontName":{"$unsupported":"symbol"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":672,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"$unsupported":"symbol"},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":{"$unsupported":"symbol"},"visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32933":{"id":"I3879:36179;1690:32933","type":"TEXT","fields":{"parentId":"3879:36179","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"3단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32948":{"id":"I3879:36179;1690:32948","type":"FRAME","fields":{"parentId":"3879:36179","childrenIds":["I3879:36179;1690:32934","I3879:36179;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36181":{"id":"3879:36181","type":"TEXT","fields":{"parentId":"3879:36180","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":896,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32933":{"id":"I3879:36183;1690:32933","type":"TEXT","fields":{"parentId":"3879:36183","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"4단락","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"단락명","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","visible":true,"width":38,"x":20,"y":10,"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32948":{"id":"I3879:36183;1690:32948","type":"FRAME","fields":{"parentId":"3879:36183","childrenIds":["I3879:36183;1690:32934","I3879:36183;1690:32947"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":22,"inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"isAsset":false,"isMask":false,"itemSpacing":6,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Frame 1321315263","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":null,"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":47,"x":293,"y":12},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36185":{"id":"3879:36185","type":"TEXT","fields":{"parentId":"3879:36184","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":960,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","visible":true,"width":320,"x":20,"y":24,"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36150":{"id":"3879:36150","type":"TEXT","fields":{"parentId":"3879:36149","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"characters":"공개 설정 :","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"공개 설정 :","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","visible":true,"width":67,"x":0,"y":1.5,"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36151":{"id":"3879:36151","type":"TEXT","fields":{"parentId":"3879:36149","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"characters":"나만 보기","componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":29,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"나만 보기","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","visible":true,"width":63,"x":79,"y":0,"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36152":{"id":"3879:36152","type":"FRAME","fields":{"parentId":"3879:36149","childrenIds":["3879:36153"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":false,"componentPropertyReferences":null,"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Icons","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":-90,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":16,"y":16},"topLeftRadius":0,"topRightRadius":0,"visible":true,"width":16,"x":170,"y":6.5},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36156;20:3849":{"id":"I3879:36156;20:3849","type":"VECTOR","fields":{"parentId":"3879:36156","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":26.66666603088379,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Union","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":4,"strokes":[],"targetAspectRatio":null,"visible":true,"width":31.66666603088379,"x":4.166666507720947,"y":6.666666507720947},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36164":{"id":"3879:36164","type":"VECTOR","fields":{"parentId":"3879:36163","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":13.333332061767578,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector 2 (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":2.4000000953674316,"strokes":[],"targetAspectRatio":{"x":18,"y":18},"visible":true,"width":13.333332061767578,"x":3.333334445953369,"y":3.3333330154418945},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934":{"id":"I3879:36167;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36167;1690:32948","childrenIds":["I3879:36167;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32947":{"id":"I3879:36167;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36167;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934":{"id":"I3879:36171;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36171;1690:32948","childrenIds":["I3879:36171;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32947":{"id":"I3879:36171;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36171;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934":{"id":"I3879:36175;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36175;1690:32948","childrenIds":["I3879:36175;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32947":{"id":"I3879:36175;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36175;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934":{"id":"I3879:36179;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36179;1690:32948","childrenIds":["I3879:36179;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32947":{"id":"I3879:36179;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36179;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934":{"id":"I3879:36183;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:36183;1690:32948","childrenIds":["I3879:36183;1690:32934;17:2028"],"blendMode":"PASS_THROUGH","bottomLeftRadius":0,"bottomRightRadius":0,"boundVariables":{},"clipsContent":true,"componentProperties":{"속성 1":{"boundVariables":{},"type":"VARIANT","value":"default"}},"componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"cornerRadius":0,"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"gridStyleId":"","height":16,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"itemSpacing":0,"layoutMode":"NONE","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"write","numberOfFixedChildren":0,"opacity":1,"overflowDirection":"NONE","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeBottomWeight":1,"strokeLeftWeight":1,"strokeRightWeight":1,"strokeStyleId":"","strokeTopWeight":1,"strokeWeight":1,"strokes":[],"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"topLeftRadius":0,"topRightRadius":0,"variantProperties":{"속성 1":"default"},"visible":true,"width":16,"x":0,"y":3},"extra":{},"fieldErrors":{"devStatus":"in get_devStatus: \"devStatus\" is not a supported API","isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32947":{"id":"I3879:36183;1690:32947","type":"TEXT","fields":{"parentId":"I3879:36183;1690:32948","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"characters":"수정","componentPropertyReferences":{},"constraints":{"horizontal":"MIN","vertical":"MIN"},"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":22,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"수정","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"OUTSIDE","strokeStyleId":"","strokeWeight":1,"strokes":[],"targetAspectRatio":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","visible":true,"width":25,"x":22,"y":0,"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"3879:36153":{"id":"3879:36153","type":"VECTOR","fields":{"parentId":"3879:36152","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":null,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.333883285522461,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Vector (Stroke)","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.3333333730697632,"strokes":[],"targetAspectRatio":null,"visible":true,"width":5.333883762359619,"x":5.999674320220947,"y":3.3330078125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2028":{"id":"I3879:36167;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934","childrenIds":["I3879:36167;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2028":{"id":"I3879:36171;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934","childrenIds":["I3879:36171;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2028":{"id":"I3879:36175;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934","childrenIds":["I3879:36175;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2028":{"id":"I3879:36179;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934","childrenIds":["I3879:36179;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2028":{"id":"I3879:36183;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934","childrenIds":["I3879:36183;1690:32934;17:2029"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":true,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3051","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2029":{"id":"I3879:36167;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2028","childrenIds":["I3879:36167;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2029":{"id":"I3879:36171;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2028","childrenIds":["I3879:36171;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2029":{"id":"I3879:36175;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2028","childrenIds":["I3879:36175;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2029":{"id":"I3879:36179;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2028","childrenIds":["I3879:36179;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2029":{"id":"I3879:36183;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2028","childrenIds":["I3879:36183;1690:32934;17:2039"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3053","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2039":{"id":"I3879:36167;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2029","childrenIds":["I3879:36167;1690:32934;17:2037","I3879:36167;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2039":{"id":"I3879:36171;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2029","childrenIds":["I3879:36171;1690:32934;17:2037","I3879:36171;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2039":{"id":"I3879:36175;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2029","childrenIds":["I3879:36175;1690:32934;17:2037","I3879:36175;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2039":{"id":"I3879:36179;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2029","childrenIds":["I3879:36179;1690:32934;17:2037","I3879:36179;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2039":{"id":"I3879:36183;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2029","childrenIds":["I3879:36183;1690:32934;17:2037","I3879:36183;1690:32934;17:2030"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"Clip path group","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2037":{"id":"I3879:36167;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2039","childrenIds":["I3879:36167;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2030":{"id":"I3879:36167;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2039","childrenIds":["I3879:36167;1690:32934;17:2031","I3879:36167;1690:32934;17:2033","I3879:36167;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2037":{"id":"I3879:36171;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2039","childrenIds":["I3879:36171;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2030":{"id":"I3879:36171;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2039","childrenIds":["I3879:36171;1690:32934;17:2031","I3879:36171;1690:32934;17:2033","I3879:36171;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2037":{"id":"I3879:36175;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2039","childrenIds":["I3879:36175;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2030":{"id":"I3879:36175;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2039","childrenIds":["I3879:36175;1690:32934;17:2031","I3879:36175;1690:32934;17:2033","I3879:36175;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2037":{"id":"I3879:36179;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2039","childrenIds":["I3879:36179;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2030":{"id":"I3879:36179;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2039","childrenIds":["I3879:36179;1690:32934;17:2031","I3879:36179;1690:32934;17:2033","I3879:36179;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2037":{"id":"I3879:36183;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2039","childrenIds":["I3879:36183;1690:32934;17:2038"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":true,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"clipPath3059","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2030":{"id":"I3879:36183;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2039","childrenIds":["I3879:36183;1690:32934;17:2031","I3879:36183;1690:32934;17:2033","I3879:36183;1690:32934;17:2035"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.062459945678711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3055","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":15.062459945678711,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2038":{"id":"I3879:36167;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36167;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2031":{"id":"I3879:36167;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2030","childrenIds":["I3879:36167;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2033":{"id":"I3879:36167;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2030","childrenIds":["I3879:36167;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2035":{"id":"I3879:36167;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36167;1690:32934;17:2030","childrenIds":["I3879:36167;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2038":{"id":"I3879:36171;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36171;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2031":{"id":"I3879:36171;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2030","childrenIds":["I3879:36171;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2033":{"id":"I3879:36171;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2030","childrenIds":["I3879:36171;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2035":{"id":"I3879:36171;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36171;1690:32934;17:2030","childrenIds":["I3879:36171;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2038":{"id":"I3879:36175;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36175;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2031":{"id":"I3879:36175;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2030","childrenIds":["I3879:36175;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2033":{"id":"I3879:36175;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2030","childrenIds":["I3879:36175;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2035":{"id":"I3879:36175;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36175;1690:32934;17:2030","childrenIds":["I3879:36175;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2038":{"id":"I3879:36179;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36179;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2031":{"id":"I3879:36179;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2030","childrenIds":["I3879:36179;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2033":{"id":"I3879:36179;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2030","childrenIds":["I3879:36179;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2035":{"id":"I3879:36179;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36179;1690:32934;17:2030","childrenIds":["I3879:36179;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2038":{"id":"I3879:36183;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:36183;1690:32934;17:2037","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":15.999999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3057","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"INSIDE","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[],"targetAspectRatio":null,"visible":true,"width":15.999999046325684,"x":0,"y":16},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2031":{"id":"I3879:36183;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2030","childrenIds":["I3879:36183;1690:32934;17:2032"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3061","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2033":{"id":"I3879:36183;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2030","childrenIds":["I3879:36183;1690:32934;17:2034"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3065","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2035":{"id":"I3879:36183;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:36183;1690:32934;17:2030","childrenIds":["I3879:36183;1690:32934;17:2036"],"blendMode":"PASS_THROUGH","boundVariables":{},"componentPropertyReferences":{},"effectStyleId":"","effects":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"inferredAutoLayout":null,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"g3069","opacity":1,"reactions":[],"rotation":0,"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.696533203125,"y":3.303455352783203},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2032":{"id":"I3879:36167;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36167;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2034":{"id":"I3879:36167;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36167;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36167;1690:32934;17:2036":{"id":"I3879:36167;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36167;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2032":{"id":"I3879:36171;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36171;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2034":{"id":"I3879:36171;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36171;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36171;1690:32934;17:2036":{"id":"I3879:36171;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36171;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2032":{"id":"I3879:36175;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36175;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2034":{"id":"I3879:36175;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36175;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36175;1690:32934;17:2036":{"id":"I3879:36175;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36175;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2032":{"id":"I3879:36179;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36179;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2034":{"id":"I3879:36179;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36179;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36179;1690:32934;17:2036":{"id":"I3879:36179;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36179;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2032":{"id":"I3879:36183;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:36183;1690:32934;17:2031","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":12.499999046325684,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3063","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":12.499999046325684,"x":0.46875,"y":15.53125},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2034":{"id":"I3879:36183;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:36183;1690:32934;17:2033","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":9.463827133178711,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3067","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":9.463827133178711,"x":6.06742525100708,"y":9.932587146759033},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}},"I3879:36183;1690:32934;17:2036":{"id":"I3879:36183;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:36183;1690:32934;17:2035","childrenIds":[],"blendMode":"PASS_THROUGH","boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]},"componentPropertyReferences":{},"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"cornerRadius":0,"dashPattern":[],"effectStyleId":"","effects":[],"fillStyleId":"","fills":[],"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"height":1.7677497863769531,"isAsset":false,"isMask":false,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","maxHeight":null,"maxWidth":null,"minHeight":null,"minWidth":null,"name":"path3071","opacity":1,"reactions":[],"rotation":0,"strokeAlign":"CENTER","strokeStyleId":"","strokeWeight":1.600000023841858,"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"targetAspectRatio":null,"visible":true,"width":1.7677497863769531,"x":12.69656035025946,"y":3.3034629821777344},"extra":{},"fieldErrors":{"isClip":"in get_isClip: \"isClip\" is not a supported API","isClipBackedComponentInstance":"in get_isClipBackedComponentInstance: \"isClipBackedComponentInstance\" is not a supported API","rotationOrigin":"in get_rotationOrigin: \"rotationOrigin\" is not a supported API","widgetHoverStyle":"in get_widgetHoverStyle: \"widgetHoverStyle\" is not a supported API"}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1006","name":"base","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1007","name":"negativeBase","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[{"id":"VariableID:767f04d30caf20c0c878e8546732b78b74fb70e1/156:471","name":"white","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:a01f35bf66e644ecb6fb9343dbef6146ccf77918/155:11","name":"inputBg","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:b1ac3f2d99f4f584780a1b02b0bdf70873612d7d/2324:176","name":"White","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:cacebd5da2ae161b002c8195de9558ff7bb42be5/2282:14"},{"id":"VariableID:fc5c8b3838fdbe6abf30bcbc881a5a6c2da71856/155:1","name":"base","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:bb2d72392a1a2ba682ffcdfbf07c64a2d1f8f56c/1:4"},{"id":"VariableID:fcaedff9cb2ddcaecc38b8cd5b5f5a926aa02c09/4:86","name":"Black","remote":true,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:294549cdf30d37067419833a8720ddd015a58611/4:84"}],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json new file mode 100644 index 0000000..e91a101 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json @@ -0,0 +1 @@ +{"source":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","nodeId":"3879:35518","capture":"official Figma MCP use_figma read-only projection","nodeCount":144},"snapshot":{"fileKey":"85CgSws3o5XsLv7aAwWJyS","version":null,"roots":["3879:35518"],"nodes":{"3879:35518":{"id":"3879:35518","type":"FRAME","fields":{"parentId":"3686:1678","childrenIds":["3879:35519","3879:35543","3879:35564"],"name":"A : STORY-F-PROOFREAD","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":740,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":8946,"y":10200,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35519":{"id":"3879:35519","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35520","3879:35521","3879:35532","3879:35537"],"name":"Frame 26086002","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":30,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":40,"paddingLeft":16,"paddingRight":16,"paddingTop":50,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":30,"paddingTop":50,"paddingRight":16,"paddingBottom":40,"paddingLeft":16,"width":360,"height":757,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35543":{"id":"3879:35543","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35544","3879:35548","3879:35552","3879:35556","3879:35560"],"name":"Frame 1321314922","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":3477,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":757,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35564":{"id":"3879:35564","type":"FRAME","fields":{"parentId":"3879:35518","childrenIds":["3879:35565","3879:35567"],"name":"Header","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":4,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":8,"paddingLeft":10,"paddingRight":10,"paddingTop":8,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":4,"paddingTop":8,"paddingRight":10,"paddingBottom":8,"paddingLeft":10,"width":360,"height":67,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":673,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MAX"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":{"$unsupported":"symbol"},"strokeTopWeight":1,"strokeRightWeight":0,"strokeBottomWeight":0,"strokeLeftWeight":0,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35520":{"id":"3879:35520","type":"TEXT","fields":{"parentId":"3879:35519","childrenIds":[],"name":"이야기가 글로 정리되었어요","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":328,"height":78,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":50,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"이야기가 글로 \n정리되었어요","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"letterSpacing":{"unit":"PERCENT","value":-2},"textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"이야기가 글로 \n정리되었어요","end":15,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":28,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,"}]},"extra":{},"fieldErrors":{}},"3879:35521":{"id":"3879:35521","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35522","3879:35526"],"name":"Frame 1321315405","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":8,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":328,"height":114,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":158,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35532":{"id":"3879:35532","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35533","3879:35536"],"name":"Frame 1321314916","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":12,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":328,"height":241,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":302,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35537":{"id":"3879:35537","type":"FRAME","fields":{"parentId":"3879:35519","childrenIds":["3879:35538","3879:35539","3879:35540"],"name":"Frame 1321314914","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":16,"paddingLeft":16,"paddingRight":16,"paddingTop":16,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":8,"paddingTop":16,"paddingRight":16,"paddingBottom":16,"paddingLeft":16,"width":328,"height":144,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":573,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}},"color":{"b":0.9244915843009949,"g":0.9529501795768738,"r":0.9695512056350708},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":12,"topLeftRadius":12,"topRightRadius":12,"bottomLeftRadius":12,"bottomRightRadius":12,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:999","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35544":{"id":"3879:35544","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35545","3879:35546"],"name":"Frame 1321314924","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":125,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35548":{"id":"3879:35548","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35549","3879:35550"],"name":"Frame 1321314926","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":542,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":125,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35552":{"id":"3879:35552","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35553","3879:35554"],"name":"Frame 1321314927","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":766,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":667,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35556":{"id":"3879:35556","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35557","3879:35558"],"name":"Frame 1321314928","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":990,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":1433,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35560":{"id":"3879:35560","type":"FRAME","fields":{"parentId":"3879:35543","childrenIds":["3879:35561","3879:35562"],"name":"Frame 1321314929","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"MIN","counterAxisSizingMode":"FIXED","itemSpacing":0,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":360,"height":1054,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":2423,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35565":{"id":"3879:35565","type":"FRAME","fields":{"parentId":"3879:35564","childrenIds":["3879:35566"],"name":"Frame 1321314936","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":106,"height":51,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":10,"y":8,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}},"color":{"b":0.7843137383460999,"g":0.7843137383460999,"r":0.7882353067398071},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":10,"topLeftRadius":10,"topRightRadius":10,"bottomLeftRadius":10,"bottomRightRadius":10,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:68:6122","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:320:9071","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35567":{"id":"3879:35567","type":"FRAME","fields":{"parentId":"3879:35564","childrenIds":["3879:35568"],"name":"Frame 1321314934","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":106,"height":51,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":244,"y":8,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":10,"topLeftRadius":10,"topRightRadius":10,"bottomLeftRadius":10,"bottomRightRadius":10,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35522":{"id":"3879:35522","type":"FRAME","fields":{"parentId":"3879:35521","childrenIds":["3879:35523","3879:35524","3879:35525"],"name":"Frame 1321315248","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":12,"paddingTop":12,"paddingRight":12,"paddingBottom":12,"paddingLeft":12,"width":328,"height":53,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":12,"topLeftRadius":12,"topRightRadius":12,"bottomLeftRadius":12,"bottomRightRadius":12,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35526":{"id":"3879:35526","type":"FRAME","fields":{"parentId":"3879:35521","childrenIds":["3879:35527"],"name":"Frame 1321315456","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":12,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":12,"paddingLeft":12,"paddingRight":12,"paddingTop":12,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":12,"paddingTop":12,"paddingRight":12,"paddingBottom":12,"paddingLeft":12,"width":328,"height":53,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":61,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}},"color":{"b":0.8784313797950745,"g":0.8784313797950745,"r":0.8784313797950745},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":12,"topLeftRadius":12,"topRightRadius":12,"bottomLeftRadius":12,"bottomRightRadius":12,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:1:1001","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35533":{"id":"3879:35533","type":"FRAME","fields":{"parentId":"3879:35532","childrenIds":["3879:35534","3879:35535"],"name":"Frame 1321314915","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":8,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":16,"paddingRight":16,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":8,"paddingTop":24,"paddingRight":16,"paddingBottom":24,"paddingLeft":16,"width":328,"height":185,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}},"color":{"b":0.8189101815223694,"g":0.7939752340316772,"r":0.7952219843864441},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":2,"strokeAlign":"INSIDE","cornerRadius":12,"topLeftRadius":12,"topRightRadius":12,"bottomLeftRadius":12,"bottomRightRadius":12,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}],"strokes":[{"id":"VariableID:63:1981","type":"VARIABLE_ALIAS"}]},"dashPattern":[4,4]},"extra":{},"fieldErrors":{}},"3879:35536":{"id":"3879:35536","type":"TEXT","fields":{"parentId":"3879:35532","childrenIds":[],"name":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":328,"height":44,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":197,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요.","end":52,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":14,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,"}]},"extra":{},"fieldErrors":{}},"3879:35538":{"id":"3879:35538","type":"TEXT","fields":{"parentId":"3879:35537","childrenIds":[],"name":"TIP","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":24,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":16,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"TIP","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"TIP","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"3879:35539":{"id":"3879:35539","type":"TEXT","fields":{"parentId":"3879:35537","childrenIds":[],"name":"각 단락을 선택해서 고유명사를 수정하거나, 의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":296,"height":78,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":50,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"각 단락을 선택해서 고유명사를 수정하거나, \n의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다. ","end":65,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{}},"3879:35540":{"id":"3879:35540","type":"FRAME","fields":{"parentId":"3879:35537","childrenIds":["3879:35541"],"name":"X 아이콘","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"ABSOLUTE","paddingBottom":10,"paddingLeft":10,"paddingRight":10,"paddingTop":10,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"ABSOLUTE","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":10,"paddingRight":10,"paddingBottom":10,"paddingLeft":10,"width":40,"height":40,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":280,"y":8,"rotation":0,"constraints":{"horizontal":"MAX","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":1000,"topLeftRadius":1000,"topRightRadius":1000,"bottomLeftRadius":1000,"bottomRightRadius":1000,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35545":{"id":"3879:35545","type":"INSTANCE","fields":{"parentId":"3879:35544","childrenIds":["I3879:35545;1690:32933","I3879:35545;1690:32948"],"name":"SectionTitle","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":360,"height":46,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"variantProperties":null,"mainComponent":{"$nodeId":"1690:32949","$nodeType":"COMPONENT"},"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35546":{"id":"3879:35546","type":"FRAME","fields":{"parentId":"3879:35544","childrenIds":["3879:35547"],"name":"Frame 1321314917","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":24,"paddingRight":20,"paddingBottom":24,"paddingLeft":20,"width":360,"height":79,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":46,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35549":{"id":"3879:35549","type":"INSTANCE","fields":{"parentId":"3879:35548","childrenIds":["I3879:35549;1690:32933","I3879:35549;1690:32948"],"name":"SectionTitle","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":360,"height":46,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"variantProperties":null,"mainComponent":{"$nodeId":"1690:32949","$nodeType":"COMPONENT"},"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35550":{"id":"3879:35550","type":"FRAME","fields":{"parentId":"3879:35548","childrenIds":["3879:35551"],"name":"Frame 1321314918","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":24,"paddingRight":20,"paddingBottom":24,"paddingLeft":20,"width":360,"height":496,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":46,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35553":{"id":"3879:35553","type":"INSTANCE","fields":{"parentId":"3879:35552","childrenIds":["I3879:35553;1690:32933","I3879:35553;1690:32948"],"name":"SectionTitle","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":360,"height":46,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"variantProperties":null,"mainComponent":{"$nodeId":"1690:32949","$nodeType":"COMPONENT"},"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35554":{"id":"3879:35554","type":"FRAME","fields":{"parentId":"3879:35552","childrenIds":["3879:35555"],"name":"Frame 1321314918","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":24,"paddingRight":20,"paddingBottom":24,"paddingLeft":20,"width":360,"height":720,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":46,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35557":{"id":"3879:35557","type":"INSTANCE","fields":{"parentId":"3879:35556","childrenIds":["I3879:35557;1690:32933","I3879:35557;1690:32948"],"name":"SectionTitle","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":360,"height":46,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"variantProperties":null,"mainComponent":{"$nodeId":"1690:32949","$nodeType":"COMPONENT"},"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35558":{"id":"3879:35558","type":"FRAME","fields":{"parentId":"3879:35556","childrenIds":["3879:35559"],"name":"Frame 1321314918","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":24,"paddingRight":20,"paddingBottom":24,"paddingLeft":20,"width":360,"height":944,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":46,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35561":{"id":"3879:35561","type":"INSTANCE","fields":{"parentId":"3879:35560","childrenIds":["I3879:35561;1690:32933","I3879:35561;1690:32948"],"name":"SectionTitle","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":10,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":10,"paddingLeft":20,"paddingRight":20,"paddingTop":10,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"HUG","primaryAxisAlignItems":"SPACE_BETWEEN","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":10,"paddingRight":20,"paddingBottom":10,"paddingLeft":20,"width":360,"height":46,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}},"color":{"b":0.9586742520332336,"g":0.96465665102005,"r":0.9695513844490051},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"variantProperties":null,"mainComponent":{"$nodeId":"1690:32949","$nodeType":"COMPONENT"},"boundVariables":{"fills":[{"id":"VariableID:17:1548","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35562":{"id":"3879:35562","type":"FRAME","fields":{"parentId":"3879:35560","childrenIds":["3879:35563"],"name":"Frame 1321314918","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"VERTICAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","itemSpacing":10,"layoutAlign":"STRETCH","layoutGrow":0,"layoutMode":"VERTICAL","layoutPositioning":"AUTO","paddingBottom":24,"paddingLeft":20,"paddingRight":20,"paddingTop":24,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","primaryAxisAlignItems":"CENTER","counterAxisAlignItems":"CENTER","itemSpacing":10,"paddingTop":24,"paddingRight":20,"paddingBottom":24,"paddingLeft":20,"width":360,"height":1008,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":46,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1000","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35566":{"id":"3879:35566","type":"TEXT","fields":{"parentId":"3879:35565","childrenIds":[],"name":"편집 설정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":66,"height":31,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"편집 설정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"편집 설정","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{}},"3879:35568":{"id":"3879:35568","type":"TEXT","fields":{"parentId":"3879:35567","childrenIds":[],"name":"검토 완료","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":66,"height":31,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"검토 완료","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","fillStyleId":"","reactions":[],"boundVariables":{},"styledTextSegments":[{"characters":"검토 완료","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"}]},"extra":{},"fieldErrors":{}},"3879:35523":{"id":"3879:35523","type":"TEXT","fields":{"parentId":"3879:35522","childrenIds":[],"name":"현재 적용된 문체 :","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":112,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":64,"y":13.5,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"현재 적용된 문체 :","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"현재 적용된 문체 :","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{}},"3879:35524":{"id":"3879:35524","type":"TEXT","fields":{"parentId":"3879:35522","childrenIds":[],"name":"담담체","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":44,"height":29,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":188,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"담담체","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"담담체","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{}},"3879:35525":{"id":"3879:35525","type":"INSTANCE","fields":{"parentId":"3879:35522","childrenIds":["I3879:35525;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":20,"height":20,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":244,"y":16.5,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35527":{"id":"3879:35527","type":"FRAME","fields":{"parentId":"3879:35526","childrenIds":["3879:35528","3879:35529","3879:35530"],"name":"Frame 1321315390","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":12,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":12,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":170,"height":29,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":79,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35534":{"id":"3879:35534","type":"INSTANCE","fields":{"parentId":"3879:35533","childrenIds":["I3879:35534;20:3849"],"name":"icons","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":40,"height":40,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":24,"y":24},"x":144,"y":20.5,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"Property 1":"imagePlus"},"mainComponent":{"$nodeId":"95:7147","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35535":{"id":"3879:35535","type":"TEXT","fields":{"parentId":"3879:35533","childrenIds":[],"name":"[여기]를 눌러 이야기에 어울리는 사진을 추가해보세요. 사진은 선택사항이며, 나중에 천천히 추가하셔도 괜찮습니다.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":296,"height":96,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":16,"y":68.5,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":{"$unsupported":"symbol"},"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"[여기]를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"$unsupported":"symbol"},"fontSize":15,"fontWeight":{"$unsupported":"symbol"},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":{"$unsupported":"symbol"},"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"},{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"[여기]","end":4,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":15,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,"},{"characters":"를 눌러 이야기에 \n어울리는 사진을 추가해보세요.\r\n사진은 선택사항이며, \n나중에 천천히 추가하셔도 괜찮습니다.","end":66,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":15,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":4,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,"}]},"extra":{},"fieldErrors":{}},"3879:35541":{"id":"3879:35541","type":"FRAME","fields":{"parentId":"3879:35540","childrenIds":["3879:35542"],"name":"Icons","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":20,"height":20,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":16,"y":16},"x":30,"y":10,"rotation":-180,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32933":{"id":"I3879:35545;1690:32933","type":"TEXT","fields":{"parentId":"3879:35545","childrenIds":[],"name":"단락명","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":28,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"제목","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"제목","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32948":{"id":"I3879:35545;1690:32948","type":"FRAME","fields":{"parentId":"3879:35545","childrenIds":["I3879:35545;1690:32934","I3879:35545;1690:32947"],"name":"Frame 1321315263","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":47,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":293,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35547":{"id":"3879:35547","type":"TEXT","fields":{"parentId":"3879:35546","childrenIds":[],"name":"작은 시장, 큰 사랑","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":320,"height":31,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":24,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"작은 시장, 큰 사랑","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"letterSpacing":{"unit":"PERCENT","value":-2},"textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"작은 시장, 큰 사랑","end":11,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Bold"},"fontSize":22,"fontWeight":700,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-2},"lineHeight":{"unit":"PERCENT","value":139.9999976158142},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,"}]},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32933":{"id":"I3879:35549;1690:32933","type":"TEXT","fields":{"parentId":"3879:35549","childrenIds":[],"name":"단락명","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":35,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"1단락","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"1단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32948":{"id":"I3879:35549;1690:32948","type":"FRAME","fields":{"parentId":"3879:35549","childrenIds":["I3879:35549;1690:32934","I3879:35549;1690:32947"],"name":"Frame 1321315263","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":47,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":293,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35551":{"id":"3879:35551","type":"TEXT","fields":{"parentId":"3879:35550","childrenIds":[],"name":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다. 겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":320,"height":448,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":24,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.\n\n겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다.","end":299,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32933":{"id":"I3879:35553;1690:32933","type":"TEXT","fields":{"parentId":"3879:35553","childrenIds":[],"name":"단락명","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":37,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"2단락","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"2단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32948":{"id":"I3879:35553;1690:32948","type":"FRAME","fields":{"parentId":"3879:35553","childrenIds":["I3879:35553;1690:32934","I3879:35553;1690:32947"],"name":"Frame 1321315263","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":47,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":293,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35555":{"id":"3879:35555","type":"TEXT","fields":{"parentId":"3879:35554","childrenIds":[],"name":"“엄마!” 나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다. “우리 [1. 이름] 왔어?” 어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다. “괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":320,"height":672,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":24,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":{"$unsupported":"symbol"},"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 [1. 이름] 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. [1. 이름] 학교 끝났어? 배고프지?”","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"$unsupported":"symbol"},"fontSize":18,"fontWeight":{"$unsupported":"symbol"},"lineHeight":{"$unsupported":"symbol"},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":{"$unsupported":"symbol"},"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}],"textRangeFills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"},{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"“엄마!”\n\n나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.\n\n“우리 ","end":189,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":196,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":189,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 왔어?”\n\n어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.\n\n“괜찮아. 엄마가 들 수 있어. ","end":359,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":196,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"},{"characters":"[1. 이름]","end":366,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:98:3276","type":"VARIABLE_ALIAS"}},"color":{"b":0.14482630789279938,"g":0.14482630789279938,"r":0.6794871091842651},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":18,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":359,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,"},{"characters":" 학교 끝났어? 배고프지?”","end":381,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":366,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32933":{"id":"I3879:35557;1690:32933","type":"TEXT","fields":{"parentId":"3879:35557","childrenIds":[],"name":"단락명","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":38,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"3단락","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"3단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32948":{"id":"I3879:35557;1690:32948","type":"FRAME","fields":{"parentId":"3879:35557","childrenIds":["I3879:35557;1690:32934","I3879:35557;1690:32947"],"name":"Frame 1321315263","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":47,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":293,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35559":{"id":"3879:35559","type":"TEXT","fields":{"parentId":"3879:35558","childrenIds":[],"name":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다. 어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다. “오늘은 떡볶이 먹고 갈까?” 나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다. 어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":320,"height":896,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":24,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.\n\n어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.\n\n“오늘은 떡볶이 먹고 갈까?”\n\n나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.\n\n어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다.","end":555,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32933":{"id":"I3879:35561;1690:32933","type":"TEXT","fields":{"parentId":"3879:35561","childrenIds":[],"name":"단락명","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":38,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":10,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"4단락","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"4단락","end":3,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":16,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:750268e778c58f7acf839269cb2e1fb140e113d7,"}]},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32948":{"id":"I3879:35561;1690:32948","type":"FRAME","fields":{"parentId":"3879:35561","childrenIds":["I3879:35561;1690:32934","I3879:35561;1690:32947"],"name":"Frame 1321315263","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"HORIZONTAL","inferredAutoLayout":{"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"AUTO","itemSpacing":6,"layoutAlign":"INHERIT","layoutGrow":0,"layoutMode":"HORIZONTAL","layoutPositioning":"AUTO","paddingBottom":0,"paddingLeft":0,"paddingRight":0,"paddingTop":0,"primaryAxisAlignItems":"MIN","primaryAxisSizingMode":"AUTO"},"layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"CENTER","itemSpacing":6,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":47,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":293,"y":12,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35563":{"id":"3879:35563","type":"TEXT","fields":{"parentId":"3879:35562","childrenIds":[],"name":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를. 집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다. 그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다. 그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FILL","layoutSizingVertical":"HUG","width":320,"height":960,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":20,"y":24,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.\n\n집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.\n\n그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.\n\n그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다.","end":626,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":18,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":179.99999523162842},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,"}]},"extra":{},"fieldErrors":{}},"I3879:35525;17:2028":{"id":"I3879:35525;17:2028","type":"GROUP","fields":{"parentId":"3879:35525","childrenIds":["I3879:35525;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":19.999998092651367,"height":19.999998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":20,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35528":{"id":"3879:35528","type":"TEXT","fields":{"parentId":"3879:35527","childrenIds":[],"name":"공개 설정 :","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":67,"height":26,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":1.5,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"공개 설정 :","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"공개 설정 :","end":7,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"Regular"},"fontSize":16,"fontWeight":400,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,"}]},"extra":{},"fieldErrors":{}},"3879:35529":{"id":"3879:35529","type":"TEXT","fields":{"parentId":"3879:35527","childrenIds":[],"name":"나만 보기","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":63,"height":29,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":79,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"나만 보기","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"나만 보기","end":5,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:995","type":"VARIABLE_ALIAS"}},"color":{"b":0.1764705926179886,"g":0.1764705926179886,"r":0.4588235318660736},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":17,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":170.00000476837158},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,"}]},"extra":{},"fieldErrors":{}},"3879:35530":{"id":"3879:35530","type":"FRAME","fields":{"parentId":"3879:35527","childrenIds":["3879:35531"],"name":"Icons","visible":true,"opacity":1,"isMask":false,"clipsContent":false,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":16,"y":16},"x":170,"y":6.5,"rotation":-90,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35534;20:3849":{"id":"I3879:35534;20:3849","type":"VECTOR","fields":{"parentId":"3879:35534","childrenIds":[],"name":"Union","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":31.66666603088379,"height":26.66666603088379,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":4.166666507720947,"y":6.666666507720947,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":4,"strokeAlign":"OUTSIDE","cornerRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"3879:35542":{"id":"3879:35542","type":"VECTOR","fields":{"parentId":"3879:35541","childrenIds":[],"name":"Vector 2 (Stroke)","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":13.333332061767578,"height":13.333332061767578,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":18,"y":18},"x":3.333334445953369,"y":3.3333330154418945,"rotation":0,"constraints":{"horizontal":"CENTER","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}},"color":{"b":0.19891290366649628,"g":0.19891290366649628,"r":0.21474339067935944},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":2.4000000953674316,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:998","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934":{"id":"I3879:35545;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35545;1690:32948","childrenIds":["I3879:35545;1690:32934;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":0,"y":3,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32947":{"id":"I3879:35545;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35545;1690:32948","childrenIds":[],"name":"수정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":25,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":22,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"수정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934":{"id":"I3879:35549;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35549;1690:32948","childrenIds":["I3879:35549;1690:32934;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":0,"y":3,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32947":{"id":"I3879:35549;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35549;1690:32948","childrenIds":[],"name":"수정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":25,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":22,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"수정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934":{"id":"I3879:35553;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35553;1690:32948","childrenIds":["I3879:35553;1690:32934;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":0,"y":3,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32947":{"id":"I3879:35553;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35553;1690:32948","childrenIds":[],"name":"수정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":25,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":22,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"수정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934":{"id":"I3879:35557;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35557;1690:32948","childrenIds":["I3879:35557;1690:32934;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":0,"y":3,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32947":{"id":"I3879:35557;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35557;1690:32948","childrenIds":[],"name":"수정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":25,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":22,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"수정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934":{"id":"I3879:35561;1690:32934","type":"INSTANCE","fields":{"parentId":"I3879:35561;1690:32948","childrenIds":["I3879:35561;1690:32934;17:2028"],"name":"write","visible":true,"opacity":1,"isMask":false,"clipsContent":true,"blendMode":"PASS_THROUGH","layoutMode":"NONE","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","primaryAxisAlignItems":"MIN","counterAxisAlignItems":"MIN","itemSpacing":0,"paddingTop":0,"paddingRight":0,"paddingBottom":0,"paddingLeft":0,"width":16,"height":16,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":{"x":682.6666870117188,"y":682.6666870117188},"x":0,"y":3,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridColumnCount":0,"gridColumnGap":0,"gridRowAnchorIndex":-1,"gridRowCount":0,"gridRowGap":0,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":1,"g":1,"r":1},"opacity":1,"type":"SOLID","visible":false}],"strokes":[],"strokeWeight":1,"strokeAlign":"INSIDE","cornerRadius":0,"topLeftRadius":0,"topRightRadius":0,"bottomLeftRadius":0,"bottomRightRadius":0,"effects":[],"isAsset":true,"fillStyleId":"","reactions":[],"variantProperties":{"속성 1":"default"},"mainComponent":{"$nodeId":"48:2039","$nodeType":"COMPONENT"},"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32947":{"id":"I3879:35561;1690:32947","type":"TEXT","fields":{"parentId":"I3879:35561;1690:32948","childrenIds":[],"name":"수정","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"HUG","layoutSizingVertical":"HUG","width":25,"height":22,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":22,"y":0,"rotation":0,"constraints":{"horizontal":"MIN","vertical":"MIN"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1,"strokeAlign":"OUTSIDE","effects":[],"isAsset":false,"characters":"수정","textTruncation":"DISABLED","maxLines":null,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","textAutoResize":"WIDTH_AND_HEIGHT","fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"letterSpacing":{"unit":"PERCENT","value":-1},"textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}]},"styledTextSegments":[{"characters":"수정","end":2,"fillStyleId":"","fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:17:1554","type":"VARIABLE_ALIAS"}},"color":{"b":0.40705108642578125,"g":0.3920474350452423,"r":0.3920474350452423},"opacity":1,"type":"SOLID","visible":true}],"fontName":{"family":"Pretendard","style":"SemiBold"},"fontSize":14,"fontWeight":600,"hyperlink":null,"indentation":0,"letterSpacing":{"unit":"PERCENT","value":-1},"lineHeight":{"unit":"PERCENT","value":160.0000023841858},"listOptions":{"type":"NONE"},"start":0,"textCase":"ORIGINAL","textDecoration":"NONE","textStyleId":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,"}]},"extra":{},"fieldErrors":{}},"I3879:35525;17:2029":{"id":"I3879:35525;17:2029","type":"GROUP","fields":{"parentId":"I3879:35525;17:2028","childrenIds":["I3879:35525;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":19.999998092651367,"height":19.999998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":20,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"3879:35531":{"id":"3879:35531","type":"VECTOR","fields":{"parentId":"3879:35530","childrenIds":[],"name":"Vector (Stroke)","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":5.333883762359619,"height":9.333883285522461,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":5.999674320220947,"y":3.3330078125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.3333333730697632,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"fills":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2028":{"id":"I3879:35545;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934","childrenIds":["I3879:35545;1690:32934;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2028":{"id":"I3879:35549;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934","childrenIds":["I3879:35549;1690:32934;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2028":{"id":"I3879:35553;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934","childrenIds":["I3879:35553;1690:32934;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2028":{"id":"I3879:35557;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934","childrenIds":["I3879:35557;1690:32934;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2028":{"id":"I3879:35561;1690:32934;17:2028","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934","childrenIds":["I3879:35561;1690:32934;17:2029"],"name":"g3051","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":true,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2039":{"id":"I3879:35525;17:2039","type":"GROUP","fields":{"parentId":"I3879:35525;17:2029","childrenIds":["I3879:35525;17:2037","I3879:35525;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":19.999998092651367,"height":19.999998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":20,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2029":{"id":"I3879:35545;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2028","childrenIds":["I3879:35545;1690:32934;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2029":{"id":"I3879:35549;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2028","childrenIds":["I3879:35549;1690:32934;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2029":{"id":"I3879:35553;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2028","childrenIds":["I3879:35553;1690:32934;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2029":{"id":"I3879:35557;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2028","childrenIds":["I3879:35557;1690:32934;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2029":{"id":"I3879:35561;1690:32934;17:2029","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2028","childrenIds":["I3879:35561;1690:32934;17:2039"],"name":"g3053","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2037":{"id":"I3879:35525;17:2037","type":"GROUP","fields":{"parentId":"I3879:35525;17:2039","childrenIds":["I3879:35525;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":19.999998092651367,"height":19.999998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":20,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2030":{"id":"I3879:35525;17:2030","type":"GROUP","fields":{"parentId":"I3879:35525;17:2039","childrenIds":["I3879:35525;17:2031","I3879:35525;17:2033","I3879:35525;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":18.827831268310547,"height":18.827831268310547,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.5859375,"y":19.4140625,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2039":{"id":"I3879:35545;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2029","childrenIds":["I3879:35545;1690:32934;17:2037","I3879:35545;1690:32934;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2039":{"id":"I3879:35549;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2029","childrenIds":["I3879:35549;1690:32934;17:2037","I3879:35549;1690:32934;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2039":{"id":"I3879:35553;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2029","childrenIds":["I3879:35553;1690:32934;17:2037","I3879:35553;1690:32934;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2039":{"id":"I3879:35557;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2029","childrenIds":["I3879:35557;1690:32934;17:2037","I3879:35557;1690:32934;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2039":{"id":"I3879:35561;1690:32934;17:2039","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2029","childrenIds":["I3879:35561;1690:32934;17:2037","I3879:35561;1690:32934;17:2030"],"name":"Clip path group","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2038":{"id":"I3879:35525;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":19.999998092651367,"height":19.999998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":20,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2031":{"id":"I3879:35525;17:2031","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.624998092651367,"height":15.624998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.5859375,"y":19.4140625,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2033":{"id":"I3879:35525;17:2033","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":11.82978343963623,"height":11.82978343963623,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":7.584281921386719,"y":12.41573429107666,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2035":{"id":"I3879:35525;17:2035","type":"GROUP","fields":{"parentId":"I3879:35525;17:2030","childrenIds":["I3879:35525;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":2.2096872329711914,"height":2.2096872329711914,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":15.87066650390625,"y":4.129319190979004,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2037":{"id":"I3879:35545;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2039","childrenIds":["I3879:35545;1690:32934;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2030":{"id":"I3879:35545;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2039","childrenIds":["I3879:35545;1690:32934;17:2031","I3879:35545;1690:32934;17:2033","I3879:35545;1690:32934;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.062459945678711,"height":15.062459945678711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2037":{"id":"I3879:35549;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2039","childrenIds":["I3879:35549;1690:32934;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2030":{"id":"I3879:35549;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2039","childrenIds":["I3879:35549;1690:32934;17:2031","I3879:35549;1690:32934;17:2033","I3879:35549;1690:32934;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.062459945678711,"height":15.062459945678711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2037":{"id":"I3879:35553;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2039","childrenIds":["I3879:35553;1690:32934;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2030":{"id":"I3879:35553;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2039","childrenIds":["I3879:35553;1690:32934;17:2031","I3879:35553;1690:32934;17:2033","I3879:35553;1690:32934;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.062459945678711,"height":15.062459945678711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2037":{"id":"I3879:35557;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2039","childrenIds":["I3879:35557;1690:32934;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2030":{"id":"I3879:35557;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2039","childrenIds":["I3879:35557;1690:32934;17:2031","I3879:35557;1690:32934;17:2033","I3879:35557;1690:32934;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.062459945678711,"height":15.062459945678711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2037":{"id":"I3879:35561;1690:32934;17:2037","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2039","childrenIds":["I3879:35561;1690:32934;17:2038"],"name":"clipPath3059","visible":true,"opacity":1,"isMask":true,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2030":{"id":"I3879:35561;1690:32934;17:2030","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2039","childrenIds":["I3879:35561;1690:32934;17:2031","I3879:35561;1690:32934;17:2033","I3879:35561;1690:32934;17:2035"],"name":"g3055","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.062459945678711,"height":15.062459945678711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2032":{"id":"I3879:35525;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.624998092651367,"height":15.624998092651367,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.5859375,"y":19.4140625,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2034":{"id":"I3879:35525;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":11.82978343963623,"height":11.82978343963623,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":7.584281921386719,"y":12.41573429107666,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35525;17:2036":{"id":"I3879:35525;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35525;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":2.2096872329711914,"height":2.2096872329711914,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":15.87069365104071,"y":4.129326820373535,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}},"color":{"b":0.5144230723381042,"g":0.49649232625961304,"r":0.4905153810977936},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:1:1009","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2038":{"id":"I3879:35545;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2031":{"id":"I3879:35545;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2033":{"id":"I3879:35545;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2035":{"id":"I3879:35545;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35545;1690:32934;17:2030","childrenIds":["I3879:35545;1690:32934;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.696533203125,"y":3.303455352783203,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2038":{"id":"I3879:35549;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2031":{"id":"I3879:35549;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2033":{"id":"I3879:35549;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2035":{"id":"I3879:35549;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35549;1690:32934;17:2030","childrenIds":["I3879:35549;1690:32934;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.696533203125,"y":3.303455352783203,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2038":{"id":"I3879:35553;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2031":{"id":"I3879:35553;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2033":{"id":"I3879:35553;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2035":{"id":"I3879:35553;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35553;1690:32934;17:2030","childrenIds":["I3879:35553;1690:32934;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.696533203125,"y":3.303455352783203,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2038":{"id":"I3879:35557;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2031":{"id":"I3879:35557;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2033":{"id":"I3879:35557;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2035":{"id":"I3879:35557;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35557;1690:32934;17:2030","childrenIds":["I3879:35557;1690:32934;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.696533203125,"y":3.303455352783203,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2038":{"id":"I3879:35561;1690:32934;17:2038","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2037","childrenIds":[],"name":"path3057","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":15.999999046325684,"height":15.999999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0,"y":16,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[{"blendMode":"NORMAL","boundVariables":{},"color":{"b":0,"g":0,"r":0},"opacity":1,"type":"SOLID","visible":true}],"strokes":[],"strokeWeight":1.600000023841858,"strokeAlign":"INSIDE","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2031":{"id":"I3879:35561;1690:32934;17:2031","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2032"],"name":"g3061","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2033":{"id":"I3879:35561;1690:32934;17:2033","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2034"],"name":"g3065","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2035":{"id":"I3879:35561;1690:32934;17:2035","type":"GROUP","fields":{"parentId":"I3879:35561;1690:32934;17:2030","childrenIds":["I3879:35561;1690:32934;17:2036"],"name":"g3069","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","inferredAutoLayout":null,"layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.696533203125,"y":3.303455352783203,"rotation":0,"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"effects":[],"isAsset":false,"reactions":[],"boundVariables":{}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2032":{"id":"I3879:35545;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2034":{"id":"I3879:35545;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35545;1690:32934;17:2036":{"id":"I3879:35545;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35545;1690:32934;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.69656035025946,"y":3.3034629821777344,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2032":{"id":"I3879:35549;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2034":{"id":"I3879:35549;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35549;1690:32934;17:2036":{"id":"I3879:35549;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35549;1690:32934;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.69656035025946,"y":3.3034629821777344,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2032":{"id":"I3879:35553;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2034":{"id":"I3879:35553;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35553;1690:32934;17:2036":{"id":"I3879:35553;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35553;1690:32934;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.69656035025946,"y":3.3034629821777344,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2032":{"id":"I3879:35557;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2034":{"id":"I3879:35557;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35557;1690:32934;17:2036":{"id":"I3879:35557;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35557;1690:32934;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.69656035025946,"y":3.3034629821777344,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2032":{"id":"I3879:35561;1690:32934;17:2032","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2031","childrenIds":[],"name":"path3063","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":12.499999046325684,"height":12.499999046325684,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":0.46875,"y":15.53125,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2034":{"id":"I3879:35561;1690:32934;17:2034","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2033","childrenIds":[],"name":"path3067","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":9.463827133178711,"height":9.463827133178711,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":6.06742525100708,"y":9.932587146759033,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}},"I3879:35561;1690:32934;17:2036":{"id":"I3879:35561;1690:32934;17:2036","type":"VECTOR","fields":{"parentId":"I3879:35561;1690:32934;17:2035","childrenIds":[],"name":"path3071","visible":true,"opacity":1,"isMask":false,"blendMode":"PASS_THROUGH","layoutPositioning":"AUTO","layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED","width":1.7677497863769531,"height":1.7677497863769531,"minWidth":null,"maxWidth":null,"minHeight":null,"maxHeight":null,"targetAspectRatio":null,"x":12.69656035025946,"y":3.3034629821777344,"rotation":0,"constraints":{"horizontal":"SCALE","vertical":"SCALE"},"gridColumnAnchorIndex":-1,"gridRowAnchorIndex":-1,"fills":[],"strokes":[{"blendMode":"NORMAL","boundVariables":{"color":{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}},"color":{"b":0.6009615659713745,"g":0.6109775304794312,"r":0.625},"opacity":1,"type":"SOLID","visible":true}],"strokeWeight":1.600000023841858,"strokeAlign":"CENTER","cornerRadius":0,"effects":[],"isAsset":false,"fillStyleId":"","reactions":[],"boundVariables":{"strokes":[{"id":"VariableID:63:2093","type":"VARIABLE_ALIAS"}]}},"extra":{},"fieldErrors":{}}},"diagnostics":[]},"resources":{"raw":{"collections":[],"variables":[{"id":"VariableID:17:1548","name":"backgroundLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:17:1554","name":"textLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1000","name":"containerBackground","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1001","name":"border","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:1009","name":"caption","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:995","name":"primary","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:998","name":"text","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:1:999","name":"background","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:320:9071","name":"borderBold","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:1981","name":"gray300","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:63:2093","name":"captionLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:68:6122","name":"innerBg","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"},{"id":"VariableID:98:3276","name":"primaryLight","remote":false,"resolvedType":"COLOR","variableCollectionId":"VariableCollectionId:1:994"}],"styles":[{"id":"S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,","name":"captionSemibold","remote":false,"styleType":"TEXT"},{"id":"S:0e215484a78b7be9bbbfa4c6ada772650e82023b,","name":"caption","remote":false,"styleType":"TEXT"},{"id":"S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,","name":"body","remote":false,"styleType":"TEXT"},{"id":"S:750268e778c58f7acf839269cb2e1fb140e113d7,","name":"bodyXsSemibold","remote":false,"styleType":"TEXT"},{"id":"S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,","name":"captionSmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,","name":"h5","remote":false,"styleType":"TEXT"},{"id":"S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,","name":"bodySmSemibold","remote":false,"styleType":"TEXT"},{"id":"S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,","name":"h3","remote":false,"styleType":"TEXT"},{"id":"S:c5bf8fa1fe5f6bffe79f76cae556417528687add,","name":"bodySemibold","remote":false,"styleType":"TEXT"},{"id":"S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,","name":"bodyXs","remote":false,"styleType":"TEXT"},{"id":"S:ddba35e8431e5a8140cb2a918793e8682b58ba39,","name":"captionSm","remote":false,"styleType":"TEXT"}],"usedRemoteVariables":[],"localComplete":false,"usedRemoteComplete":true,"unresolved":[]}}} diff --git a/crates/devup-mcp-devup-ui/tests/plugin_compat.rs b/crates/devup-mcp-devup-ui/tests/plugin_compat.rs new file mode 100644 index 0000000..bc60b36 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/plugin_compat.rs @@ -0,0 +1,126 @@ +use devup_mcp_devup_ui::codegen::{ + extract_custom_component_imports, extract_devup_imports, generate_import_statements, + render_codegen_provider, render_component_usage, render_variant_tree_merge, + render_viewport_component, +}; +use serde_json::json; + +#[test] +fn import_metadata_is_sorted_deduplicated_and_stable() { + let components = vec![ + json!({ + "name": "Card", + "metadata": { + "devupImports": ["Flex", "Box"], + "customImports": ["Zebra", "Button"], + "usesKeyframes": true + } + }), + json!({ + "name": "Panel", + "metadata": { + "devupImports": ["Box", "Text"], + "customImports": ["Button", "Card"], + "usesKeyframes": false + } + }), + ]; + + assert_eq!( + extract_devup_imports(&components), + ["Box", "Flex", "Text", "keyframes"] + ); + assert_eq!( + extract_custom_component_imports(&components), + ["Button", "Card", "Zebra"] + ); + let imports = generate_import_statements(&components); + assert_eq!( + imports, + concat!( + "import { Box, Flex, Text, keyframes } from '@devup-ui/react'\n", + "import { Button } from '@/components/Button'\n", + "import { Card } from '@/components/Card'\n", + "import { Zebra } from '@/components/Zebra'\n\n", + ) + ); + assert_eq!(generate_import_statements(&components), imports); + assert_eq!(generate_import_statements(&[]), ""); +} + +#[test] +fn component_usage_preserves_variants_boolean_and_text_properties() { + let component_set = json!({ + "type": "COMPONENT_SET", + "name": "MyButton", + "componentPropertyDefinitions": { + "variant#123:456": {"type": "VARIANT", "defaultValue": "primary"}, + "viewport": {"type": "VARIANT", "defaultValue": "desktop"}, + "hasIcon": {"type": "BOOLEAN", "defaultValue": true}, + "hidden": {"type": "BOOLEAN", "defaultValue": false}, + "label#80:456": {"type": "TEXT", "defaultValue": "Click me"}, + "icon": {"type": "INSTANCE_SWAP", "defaultValue": "some-id"} + } + }); + assert_eq!( + render_component_usage(&component_set).as_deref(), + Some("Click me") + ); + + let instance = json!({ + "type": "INSTANCE", + "name": "PrimaryButton", + "componentProperties": { + "variant#1:2": {"type": "VARIANT", "value": "secondary"}, + "size#3:4": {"type": "VARIANT", "value": "lg"}, + "label#5:6": {"type": "TEXT", "value": "Save"} + } + }); + let usage = render_component_usage(&instance).expect("instance usage"); + assert!(usage.starts_with("Save")); + + assert!(render_component_usage(&json!({"type": "FRAME", "name": "Screen"})).is_none()); +} + +#[test] +fn responsive_provider_covers_sections_variants_and_pure_code_first() { + let section = json!({ + "language": "devup-ui", + "node": { + "type": "SECTION", + "name": "Responsive Section", + "children": [{"type": "FRAME"}, {"type": "FRAME"}] + } + }); + let provider = render_codegen_provider(§ion, "").expect("provider output"); + assert!(provider.find("Pure Code") < provider.find("ResponsiveSection - Responsive")); + + let viewport = json!({ + "type": "COMPONENT_SET", + "name": "Icon", + "componentPropertyDefinitions": { + "viewport": {"type": "VARIANT", "variantOptions": ["mobile", "desktop"]} + }, + "children": [ + {"name": "mobile", "isAsset": false, "variantProperties": {"viewport": "mobile"}}, + {"name": "desktop", "isAsset": false, "variantProperties": {"viewport": "desktop"}} + ] + }); + let viewport = render_viewport_component(&viewport).expect("viewport output"); + assert!(viewport.contains("'mobile' | 'desktop'")); + assert!(viewport.contains("src=")); + + let merged = render_variant_tree_merge(&json!({ + "variantKey": "size", + "treesByVariant": [ + ["sm", {"component": "Box", "props": {"p": "4px"}, "children": []}], + ["lg", {"component": "Box", "props": {"p": "8px"}, "children": []}] + ] + })) + .expect("merged responsive tree"); + assert!(merged.contains("__variantProp")); + assert!(merged.contains("\"size\"")); +} diff --git a/crates/devup-mcp-devup-ui/tests/provenance.rs b/crates/devup-mcp-devup-ui/tests/provenance.rs new file mode 100644 index 0000000..337e190 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/provenance.rs @@ -0,0 +1,675 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use devup_mcp_devup_ui::{ + codegen::{ + CodegenOptions, generate_component, generate_component_set_target, + generate_inlined_component_instance, + }, + provenance::{ProjectionDisposition, validate_fidelity}, + theme::{ + ThemeScope, VariableCollection, VariableDefinition, VariableMode, VariableSnapshot, + VariableStyle, generate_devup_json, + }, +}; +use devup_mcp_figma::{RawNode, Snapshot}; +use serde_json::{Map, json}; + +fn node(id: &str, node_type: &str, fields: serde_json::Value) -> RawNode { + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(fields).unwrap(), + extra: Map::new(), + field_errors: BTreeMap::new(), + } +} + +fn fidelity_snapshot(characters: &str) -> Snapshot { + Snapshot { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + roots: vec!["1:1".to_owned()], + nodes: [ + node( + "1:1", + "FRAME", + json!({ + "name": "Card", "childrenIds": ["1:2"], "layoutMode": "VERTICAL", + "inferredAutoLayout": {"layoutMode": "VERTICAL"}, + "width": 320, "height": 200, "clipsContent": true, + "fills": [{ + "type": "SOLID", "color": {"r": 1, "g": 0, "b": 0}, + "boundVariables": {"color": {"type": "VARIABLE_ALIAS", "id": "v"}} + }] + }), + ), + node( + "1:2", + "TEXT", + json!({ + "name": "Label", "parentId": "1:1", "childrenIds": [], + "characters": characters, "textStyleId": "s", + "styledTextSegments": [{ + "characters": characters, "start": 0, "end": characters.len(), + "textStyleId": "s", "fontName": {"family": "Inter", "style": "Regular"}, + "fontSize": 16, "fontWeight": 400, + "fills": [{"type": "SOLID", "color": {"r": 0, "g": 0, "b": 0}}] + }], + "fills": [{"type": "SOLID", "color": {"r": 0, "g": 0, "b": 0}}] + }), + ), + ] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + } +} + +fn fidelity_options() -> CodegenOptions { + CodegenOptions { + variable_tokens: BTreeMap::from([ + ("short".to_owned(), "pri".to_owned()), + ("v".to_owned(), "primary".to_owned()), + ]), + text_style_tokens: BTreeMap::from([("s".to_owned(), "body".to_owned())]), + ..CodegenOptions::default() + } +} + +#[test] +fn tsx_byte_ranges_trace_components_text_props_and_resources() { + let snapshot = fidelity_snapshot("Hello provenance"); + let output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + + assert!(!output.tsx.contains("DEVUP_PROVENANCE")); + assert!(!output.tsx.contains("1:1")); + for entry in &output.source_map.entries { + let range = entry.generated_range.as_ref().expect("tsx range"); + assert!(range.start < range.end && range.end <= output.tsx.len()); + assert!(output.tsx.is_char_boundary(range.start)); + assert!(output.tsx.is_char_boundary(range.end)); + } + let find = |node_id: &str, property: &str| { + output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some(node_id) + && entry.property.as_deref() == Some(property) + }) + .expect("provenance entry") + }; + let component = find("1:1", "type"); + assert_eq!(slice(&output.tsx, component), "VStack"); + let fill = find("1:1", "fills"); + assert_eq!(slice(&output.tsx, fill), "bg=\"$primary\""); + assert_eq!(fill.variable_id.as_deref(), Some("v")); + assert_eq!(fill.resolution, "variable-token"); + let width = find("1:1", "width"); + assert!(matches!( + slice(&output.tsx, width), + "boxSize=\"100%\"" | "w=\"320px\"" + )); + let overflow = find("1:1", "clipsContent"); + assert_eq!(slice(&output.tsx, overflow), "overflow=\"hidden\""); + let text = find("1:2", "characters"); + assert_eq!(slice(&output.tsx, text), "Hello provenance"); + let typography = find("1:2", "textStyleId"); + assert_eq!(slice(&output.tsx, typography), "typography=\"body\""); + assert_eq!(typography.style_id.as_deref(), Some("s")); + assert_eq!(typography.resolution, "style-token"); + + assert_eq!(output.fidelity_report.nodes.total, 2); + assert_eq!(output.fidelity_report.nodes.covered, 2); + assert_eq!(output.fidelity_report.nodes.basis_points, 10_000); + assert!(output.fidelity_report.strict_compatible()); + assert_eq!(output.projection_trace.entries.len(), 2); + assert!(output.projection_trace.entries.iter().all(|entry| { + entry.disposition == ProjectionDisposition::Emitted + && entry + .generated_range + .as_ref() + .is_some_and(|range| range.start < range.end) + })); + + let mut incomplete = output.clone(); + incomplete.projection_trace.entries.pop(); + let error = validate_fidelity(&snapshot, "1:1", &incomplete) + .expect_err("missing trace disposition must fail"); + assert_eq!(error.code, devup_mcp_figma::ErrorCode::DevupCodegenFailed); + assert!(!error.details.to_string().contains("Hello provenance")); +} + +#[test] +fn strict_fidelity_uses_snapshot_variables_instead_of_emitted_mappings_as_denominator() { + let snapshot = fidelity_snapshot("Hello provenance"); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + let variable = output + .source_map + .entries + .iter_mut() + .find(|entry| entry.variable_id.as_deref() == Some("v")) + .unwrap(); + variable.variable_id = Some("wrong-variable".to_owned()); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert_eq!(report.variables.total, 1); + assert_eq!(report.variables.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn strict_fidelity_rejects_corrupted_text_style_identity() { + let snapshot = fidelity_snapshot("Hello provenance"); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + let mut corrupted = 0; + for typography in output + .source_map + .entries + .iter_mut() + .filter(|entry| entry.style_id.as_deref() == Some("s")) + { + typography.style_id = Some("wrong-style".to_owned()); + corrupted += 1; + } + assert!(corrupted > 0); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert_eq!(report.typography.total, 1); + assert_eq!(report.typography.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn strict_fidelity_uses_snapshot_semantics_even_if_trace_disposition_is_corrupted() { + let snapshot = fidelity_snapshot("Hello provenance"); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + let text = output + .projection_trace + .entries + .iter_mut() + .find(|entry| entry.node_id == "1:2") + .unwrap(); + text.disposition = ProjectionDisposition::Ignored; + output + .source_map + .entries + .retain(|entry| entry.node_id.as_deref() != Some("1:2")); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert_eq!( + report.text, + devup_mcp_devup_ui::provenance::FidelityCoverage { + total: 1, + covered: 0, + basis_points: 0, + } + ); + assert_eq!(report.typography.total, 1); + assert_eq!(report.typography.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn strict_fidelity_requires_every_multiline_text_segment_in_the_mapped_final_range() { + let snapshot = fidelity_snapshot("First line\nSecond line"); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + let characters = output + .source_map + .entries + .iter_mut() + .find(|entry| { + entry.node_id.as_deref() == Some("1:2") + && entry.property.as_deref() == Some("characters") + }) + .unwrap(); + let first_line = output.tsx.find("First line").unwrap(); + characters.generated_range = Some(devup_mcp_devup_ui::provenance::GeneratedRange { + start: first_line, + end: first_line + "First line".len(), + }); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert_eq!(report.text.total, 1); + assert_eq!(report.text.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn text_fidelity_matches_the_final_jsx_encoding_of_multiline_special_characters() { + let snapshot = fidelity_snapshot("A < B\nC & D"); + let output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + + assert!(output.tsx.contains("A {\"<\"} B
    C {\"&\"} D")); + assert!(output.fidelity_report.text.complete()); + assert!(output.fidelity_report.strict_compatible()); +} + +#[test] +fn strict_fidelity_consumes_repeated_text_segment_mappings_one_to_one() { + let mut snapshot = fidelity_snapshot("AA"); + snapshot.nodes.get_mut("1:2").unwrap().fields.insert( + "styledTextSegments".to_owned(), + json!([ + { + "characters": "A", "start": 0, "end": 1, "textStyleId": "s", + "fontName": {"family": "Inter", "style": "Regular"}, + "fontSize": 16, "fontWeight": 400, + "fills": [{"type": "SOLID", "color": {"r": 0, "g": 0, "b": 0}}] + }, + { + "characters": "A", "start": 1, "end": 2, "textStyleId": "s", + "fontName": {"family": "Inter", "style": "Regular"}, + "fontSize": 16, "fontWeight": 400, + "fills": [{"type": "SOLID", "color": {"r": 0, "g": 0, "b": 0}}] + } + ]), + ); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + let mut seen = false; + output.source_map.entries.retain(|entry| { + let is_text = entry.node_id.as_deref() == Some("1:2") + && entry.property.as_deref() == Some("characters"); + if is_text && seen { + false + } else { + seen |= is_text; + true + } + }); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert_eq!(report.text.total, 2); + assert_eq!(report.text.covered, 1); + assert!(!report.strict_compatible()); +} + +#[test] +fn strict_fidelity_requires_layout_property_mappings_not_only_node_trace() { + let snapshot = fidelity_snapshot("Hello provenance"); + let mut output = generate_component(&snapshot, "1:1", &fidelity_options()).unwrap(); + output.source_map.entries.retain(|entry| { + entry.node_id.as_deref() != Some("1:1") + || !matches!( + entry.property.as_deref(), + Some("layoutMode" | "width" | "height") + ) + }); + + let report = validate_fidelity(&snapshot, "1:1", &output).unwrap(); + assert!(report.layout.total >= 3); + assert_eq!(report.layout.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn strict_fidelity_requires_source_asset_identity_mapping() { + let snapshot = Snapshot { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + roots: vec!["asset".to_owned()], + nodes: [node( + "asset", + "VECTOR", + json!({ + "name": "Check", "childrenIds": [], + "fills": [{"type": "SOLID", "color": {"r": 0, "g": 0, "b": 0}}] + }), + )] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + }; + let mut output = generate_component(&snapshot, "asset", &CodegenOptions::default()).unwrap(); + let serialized = serde_json::to_value(&output.source_map).unwrap(); + assert!( + serialized["entries"] + .as_array() + .unwrap() + .iter() + .any(|entry| entry["assetId"] == "asset:node") + ); + let asset = output + .source_map + .entries + .iter_mut() + .find(|entry| entry.resolution == "asset") + .unwrap(); + asset.asset_id = Some("asset:wrong".to_owned()); + + let report = validate_fidelity(&snapshot, "asset", &output).unwrap(); + assert_eq!(report.assets.total, 1); + assert_eq!(report.assets.covered, 0); + assert!(!report.strict_compatible()); +} + +#[test] +fn component_set_provenance_offsets_reference_the_wrapped_final_tsx() { + let snapshot = component_set_snapshot(false); + let output = + generate_component_set_target(&snapshot, "set", "Card", &CodegenOptions::default()) + .unwrap(); + + let component_type = output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some("default") && entry.property.as_deref() == Some("type") + }) + .expect("final component type provenance"); + assert_eq!(slice(&output.tsx, component_type), "Box"); + assert!(!output.projection_trace.entries.is_empty()); + assert!(output.fidelity_report.nodes.total > 0); +} + +#[test] +fn inline_instance_provenance_offsets_reference_sorted_and_prefixed_final_tsx() { + let mut snapshot = component_set_snapshot(false); + snapshot.roots = vec!["root".to_owned()]; + snapshot.nodes.insert( + "root".to_owned(), + node( + "root", + "FRAME", + json!({"name": "Host", "childrenIds": ["instance"], "width": 200, "height": 80}), + ), + ); + snapshot.nodes.insert( + "instance".to_owned(), + node( + "instance", + "INSTANCE", + json!({ + "name": "Card", "parentId": "root", "childrenIds": [], + "componentProperties": {"size": {"type": "VARIANT", "value": "small"}} + }), + ), + ); + let output = generate_inlined_component_instance( + &snapshot, + "root", + "instance", + &CodegenOptions::default(), + ) + .unwrap(); + + let component_type = output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some("default") && entry.property.as_deref() == Some("type") + }) + .expect("final inline component type provenance"); + assert_eq!(slice(&output.tsx, component_type), "Box"); + assert!(output.tsx.starts_with("{/* */}")); + assert!(!output.projection_trace.entries.is_empty()); + assert!(output.fidelity_report.nodes.total > 0); +} + +#[test] +fn variant_component_set_rebuilds_nonempty_provenance_over_final_tsx() { + let snapshot = component_set_snapshot(true); + let output = + generate_component_set_target(&snapshot, "set", "Card", &CodegenOptions::default()) + .unwrap(); + + assert!(output.tsx.contains("_hover")); + assert!(!output.source_map.entries.is_empty()); + assert!(!output.projection_trace.entries.is_empty()); + assert!(output.fidelity_report.nodes.total > 0); + let hover_opacity = output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some("hover") + && entry.property.as_deref() == Some("opacity") + }) + .expect("non-default variant selector provenance"); + assert!(slice(&output.tsx, hover_opacity).contains("opacity")); + assert!( + output.fidelity_report.layout.complete(), + "layout fidelity: {:?}; source map: {:#?}", + output.fidelity_report.layout, + output.source_map.entries + ); + assert!(output.fidelity_report.strict_compatible()); + for entry in &output.source_map.entries { + let range = entry.generated_range.as_ref().expect("final TSX range"); + assert!(range.start < range.end && range.end <= output.tsx.len()); + assert!(output.tsx.is_char_boundary(range.start)); + assert!(output.tsx.is_char_boundary(range.end)); + } +} + +#[test] +fn non_default_nested_variant_difference_is_lossy_not_falsely_covered() { + let mut snapshot = component_set_snapshot(true); + snapshot + .nodes + .get_mut("default") + .unwrap() + .fields + .insert("childrenIds".to_owned(), json!(["default-child"])); + snapshot + .nodes + .get_mut("hover") + .unwrap() + .fields + .insert("childrenIds".to_owned(), json!(["hover-child"])); + for (id, parent_id, width) in [ + ("default-child", "default", 100), + ("hover-child", "hover", 200), + ] { + snapshot.nodes.insert( + id.to_owned(), + node( + id, + "FRAME", + json!({ + "name": "Nested", "parentId": parent_id, "childrenIds": [], + "width": width, "height": 20, + "layoutSizingHorizontal": "FIXED", "layoutSizingVertical": "FIXED" + }), + ), + ); + } + + let output = + generate_component_set_target(&snapshot, "set", "Card", &CodegenOptions::default()) + .unwrap(); + + assert!(output.tsx.contains("w=\"100px\"")); + assert!(!output.tsx.contains("w=\"200px\"")); + assert!(!output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some("hover-child") && entry.property.is_some() + })); + assert!(output.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "DEVUP_CODEGEN_VARIANT_CHILD_FALLBACK" + && diagnostic.node_id.as_deref() == Some("hover-child") + && diagnostic.fidelity_impact() == devup_mcp_figma::FidelityImpact::Lossy + })); + assert_eq!(output.fidelity_report.impacts.lossy, 1); + assert!(!output.fidelity_report.layout.complete()); + assert!(!output.fidelity_report.strict_compatible()); +} + +#[test] +fn non_default_variant_missing_child_is_lossy_not_falsely_covered() { + let mut snapshot = component_set_snapshot(true); + snapshot + .nodes + .get_mut("default") + .unwrap() + .fields + .insert("childrenIds".to_owned(), json!(["default-child"])); + snapshot.nodes.insert( + "default-child".to_owned(), + node( + "default-child", + "FRAME", + json!({ + "name": "Default only", "parentId": "default", "childrenIds": [], + "width": 100, "height": 20, + "layoutSizingHorizontal": "FIXED", "layoutSizingVertical": "FIXED" + }), + ), + ); + + let output = + generate_component_set_target(&snapshot, "set", "Card", &CodegenOptions::default()) + .unwrap(); + + assert!(output.tsx.contains("Default only") || output.tsx.contains("w=\"100px\"")); + assert!(output.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "DEVUP_CODEGEN_VARIANT_CHILD_FALLBACK" + && diagnostic.node_id.as_deref() == Some("hover") + && diagnostic.fidelity_impact() == devup_mcp_figma::FidelityImpact::Lossy + })); + assert!(!output.fidelity_report.strict_compatible()); +} + +fn component_set_snapshot(with_effect: bool) -> Snapshot { + let definitions = if with_effect { + json!({ + "effect": { + "type": "VARIANT", "defaultValue": "default", + "variantOptions": ["default", "hover"] + } + }) + } else { + json!({ + "size": { + "type": "VARIANT", "defaultValue": "small", "variantOptions": ["small"] + } + }) + }; + let default_variants = if with_effect { + json!({"effect": "default"}) + } else { + json!({"size": "small"}) + }; + let mut nodes = vec![ + node( + "set", + "COMPONENT_SET", + json!({ + "name": "Card", "childrenIds": if with_effect { json!(["default", "hover"]) } else { json!(["default"]) }, + "defaultVariant": {"name": "Default"}, + "componentPropertyDefinitions": definitions + }), + ), + node( + "default", + "COMPONENT", + json!({ + "name": "Default", "parentId": "set", "childrenIds": [], + "variantProperties": default_variants, "width": 100, "height": 40, + "opacity": 1 + }), + ), + ]; + if with_effect { + nodes.push(node( + "hover", + "COMPONENT", + json!({ + "name": "Hover", "parentId": "set", "childrenIds": [], + "variantProperties": {"effect": "hover"}, "width": 100, "height": 40, + "opacity": 0.5 + }), + )); + } + Snapshot { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + roots: vec!["set".to_owned()], + nodes: nodes + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + } +} + +#[test] +fn devup_json_pointers_trace_variable_alias_and_style_sources() { + let snapshot = VariableSnapshot { + collections: vec![VariableCollection { + id: "c".to_owned(), + name: "Theme".to_owned(), + default_mode_id: "m".to_owned(), + modes: vec![VariableMode { + mode_id: "m".to_owned(), + name: "Default".to_owned(), + }], + }], + variables: vec![ + VariableDefinition { + id: "base".to_owned(), + name: "base".to_owned(), + resolved_type: "COLOR".to_owned(), + variable_collection_id: "c".to_owned(), + code_syntax: BTreeMap::new(), + values_by_mode: BTreeMap::from([( + "m".to_owned(), + json!({"r": 1, "g": 0, "b": 0, "a": 1}), + )]), + }, + VariableDefinition { + id: "primary".to_owned(), + name: "primary".to_owned(), + resolved_type: "COLOR".to_owned(), + variable_collection_id: "c".to_owned(), + code_syntax: BTreeMap::from([("WEB".to_owned(), "primary".to_owned())]), + values_by_mode: BTreeMap::from([( + "m".to_owned(), + json!({"type": "VARIABLE_ALIAS", "id": "base"}), + )]), + }, + ], + styles: vec![VariableStyle { + id: "body-style".to_owned(), + name: "body".to_owned(), + style_type: "TEXT".to_owned(), + value: json!({"fontSize": 16, "fontWeight": 400}), + }], + used_remote_variables: Vec::new(), + used_variable_ids: Vec::new(), + used_style_ids: Vec::new(), + local_complete: true, + used_remote_complete: true, + }; + let output = generate_devup_json(&snapshot, ThemeScope::File).unwrap(); + let entries = &output.source_map.entries; + let primary = entries + .iter() + .find(|entry| entry.json_pointer.as_deref() == Some("/theme/colors/default/primary")) + .expect("primary pointer"); + assert_eq!(primary.variable_id.as_deref(), Some("primary")); + assert_eq!(primary.resolution, "alias"); + let typography = entries + .iter() + .find(|entry| entry.json_pointer.as_deref() == Some("/theme/typography/body")) + .expect("typography pointer"); + assert_eq!(typography.style_id.as_deref(), Some("body-style")); + assert_eq!(typography.resolution, "style"); + assert_eq!( + entries + .iter() + .map(|entry| entry.json_pointer.as_deref().unwrap()) + .collect::>() + .len(), + entries.len() + ); +} + +fn slice<'a>(tsx: &'a str, entry: &devup_mcp_devup_ui::provenance::ProvenanceEntry) -> &'a str { + let range = entry.generated_range.as_ref().unwrap(); + &tsx[range.start..range.end] +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap new file mode 100644 index 0000000..8a072e2 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap @@ -0,0 +1,303 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function AStoryFProofread() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 편집 설정 + +
    +
    + + 검토 완료 + +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap new file mode 100644 index 0000000..b3dc78c --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap @@ -0,0 +1,297 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151.rs +expression: embedded.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function AStoryFProofread() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 편집 설정 + +
    +
    + + 검토 완료 + +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap new file mode 100644 index 0000000..f46f882 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap @@ -0,0 +1,18 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151.rs +expression: json!(output.diagnostics) +--- +[ + { + "code": "DEVUP_CODEGEN_ABSOLUTE_FALLBACK", + "message": "절대 배치는 position props로 제한적으로 변환됩니다.", + "nodeId": "3879:35540", + "fidelityImpact": "approximated" + }, + { + "code": "DEVUP_CODEGEN_ABSOLUTE_FALLBACK", + "message": "절대 배치는 position props로 제한적으로 변환됩니다.", + "nodeId": "3879:35564", + "fidelityImpact": "approximated" + } +] diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap new file mode 100644 index 0000000..62a3654 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap @@ -0,0 +1,5502 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151.rs +expression: output.source_map +--- +{ + "version": 1, + "entries": [ + { + "generatedRange": { + "start": 127, + "end": 14425 + }, + "nodeId": "3879:35518", + "resolution": "node" + }, + { + "generatedRange": { + "start": 128, + "end": 134 + }, + "nodeId": "3879:35518", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 128, + "end": 134 + }, + "nodeId": "3879:35518", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 141, + "end": 162 + }, + "nodeId": "3879:35518", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 169, + "end": 178 + }, + "nodeId": "3879:35518", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 185, + "end": 202 + }, + "nodeId": "3879:35518", + "property": "clipsContent", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 209, + "end": 223 + }, + "nodeId": "3879:35518", + "property": "layoutPositioning", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 230, + "end": 239 + }, + "nodeId": "3879:35518", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 250, + "end": 4286 + }, + "nodeId": "3879:35519", + "resolution": "node" + }, + { + "generatedRange": { + "start": 253, + "end": 259 + }, + "nodeId": "3879:35519", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 253, + "end": 259 + }, + "nodeId": "3879:35519", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 268, + "end": 287 + }, + "nodeId": "3879:35519", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 296, + "end": 321 + }, + "nodeId": "3879:35519", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 330, + "end": 340 + }, + "nodeId": "3879:35519", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 349, + "end": 358 + }, + "nodeId": "3879:35519", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 367, + "end": 376 + }, + "nodeId": "3879:35519", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 385, + "end": 394 + }, + "nodeId": "3879:35519", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 385, + "end": 394 + }, + "nodeId": "3879:35519", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 407, + "end": 626 + }, + "nodeId": "3879:35520", + "resolution": "node" + }, + { + "generatedRange": { + "start": 412, + "end": 416 + }, + "nodeId": "3879:35520", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 427, + "end": 440 + }, + "nodeId": "3879:35520", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 427, + "end": 440 + }, + "nodeId": "3879:35520", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 451, + "end": 469 + }, + "nodeId": "3879:35520", + "property": "textAlignHorizontal", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 480, + "end": 495 + }, + "nodeId": "3879:35520", + "property": "styledTextSegments", + "styleId": "S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 480, + "end": 495 + }, + "nodeId": "3879:35520", + "property": "textStyleId", + "styleId": "S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 506, + "end": 514 + }, + "nodeId": "3879:35520", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 525, + "end": 545 + }, + "nodeId": "3879:35520", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 566, + "end": 610 + }, + "nodeId": "3879:35520", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 631, + "end": 1877 + }, + "nodeId": "3879:35521", + "resolution": "node" + }, + { + "generatedRange": { + "start": 636, + "end": 642 + }, + "nodeId": "3879:35521", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 636, + "end": 642 + }, + "nodeId": "3879:35521", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 643, + "end": 652 + }, + "nodeId": "3879:35521", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 653, + "end": 661 + }, + "nodeId": "3879:35521", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 667, + "end": 1080 + }, + "nodeId": "3879:35522", + "resolution": "node" + }, + { + "generatedRange": { + "start": 674, + "end": 680 + }, + "nodeId": "3879:35522", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 674, + "end": 680 + }, + "nodeId": "3879:35522", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 681, + "end": 700 + }, + "nodeId": "3879:35522", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 701, + "end": 711 + }, + "nodeId": "3879:35522", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 712, + "end": 720 + }, + "nodeId": "3879:35522", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 712, + "end": 720 + }, + "nodeId": "3879:35522", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 712, + "end": 720 + }, + "nodeId": "3879:35522", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 712, + "end": 720 + }, + "nodeId": "3879:35522", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 726, + "end": 855 + }, + "nodeId": "3879:35523", + "resolution": "node" + }, + { + "generatedRange": { + "start": 735, + "end": 739 + }, + "nodeId": "3879:35523", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 740, + "end": 753 + }, + "nodeId": "3879:35523", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 740, + "end": 753 + }, + "nodeId": "3879:35523", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 754, + "end": 773 + }, + "nodeId": "3879:35523", + "property": "styledTextSegments", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 754, + "end": 773 + }, + "nodeId": "3879:35523", + "property": "textStyleId", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 774, + "end": 794 + }, + "nodeId": "3879:35523", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 810, + "end": 835 + }, + "nodeId": "3879:35523", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 860, + "end": 984 + }, + "nodeId": "3879:35524", + "resolution": "node" + }, + { + "generatedRange": { + "start": 869, + "end": 873 + }, + "nodeId": "3879:35524", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 874, + "end": 890 + }, + "nodeId": "3879:35524", + "property": "fills", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 874, + "end": 890 + }, + "nodeId": "3879:35524", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 891, + "end": 918 + }, + "nodeId": "3879:35524", + "property": "styledTextSegments", + "styleId": "S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 891, + "end": 918 + }, + "nodeId": "3879:35524", + "property": "textStyleId", + "styleId": "S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 919, + "end": 939 + }, + "nodeId": "3879:35524", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 955, + "end": 964 + }, + "nodeId": "3879:35524", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 989, + "end": 1060 + }, + "nodeId": "3879:35525", + "resolution": "node" + }, + { + "generatedRange": { + "start": 998, + "end": 1003 + }, + "nodeId": "3879:35525", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1004, + "end": 1019 + }, + "nodeId": "3879:35525", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1020, + "end": 1034 + }, + "nodeId": "3879:35525", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1020, + "end": 1034 + }, + "nodeId": "3879:35525", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1035, + "end": 1057 + }, + "nodeId": "I3879:35525;17:2032", + "property": "node", + "assetId": "I3879:35525;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 1035, + "end": 1057 + }, + "nodeId": "I3879:35525;17:2034", + "property": "node", + "assetId": "I3879:35525;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 1035, + "end": 1057 + }, + "nodeId": "I3879:35525;17:2036", + "property": "node", + "assetId": "I3879:35525;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 1035, + "end": 1057 + }, + "nodeId": "I3879:35525;17:2038", + "property": "node", + "assetId": "I3879:35525;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 1085, + "end": 1859 + }, + "nodeId": "3879:35526", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1092, + "end": 1098 + }, + "nodeId": "3879:35526", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1092, + "end": 1098 + }, + "nodeId": "3879:35526", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1099, + "end": 1125 + }, + "nodeId": "3879:35526", + "property": "strokes", + "variableId": "VariableID:1:1001", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1126, + "end": 1145 + }, + "nodeId": "3879:35526", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1146, + "end": 1162 + }, + "nodeId": "3879:35526", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1163, + "end": 1171 + }, + "nodeId": "3879:35526", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1163, + "end": 1171 + }, + "nodeId": "3879:35526", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1163, + "end": 1171 + }, + "nodeId": "3879:35526", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1163, + "end": 1171 + }, + "nodeId": "3879:35526", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1177, + "end": 1839 + }, + "nodeId": "3879:35527", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1186, + "end": 1190 + }, + "nodeId": "3879:35527", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1186, + "end": 1190 + }, + "nodeId": "3879:35527", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1191, + "end": 1210 + }, + "nodeId": "3879:35527", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1211, + "end": 1221 + }, + "nodeId": "3879:35527", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1227, + "end": 1352 + }, + "nodeId": "3879:35528", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1238, + "end": 1242 + }, + "nodeId": "3879:35528", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1243, + "end": 1256 + }, + "nodeId": "3879:35528", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1243, + "end": 1256 + }, + "nodeId": "3879:35528", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1257, + "end": 1276 + }, + "nodeId": "3879:35528", + "property": "styledTextSegments", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 1257, + "end": 1276 + }, + "nodeId": "3879:35528", + "property": "textStyleId", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 1277, + "end": 1297 + }, + "nodeId": "3879:35528", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1315, + "end": 1330 + }, + "nodeId": "3879:35528", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1357, + "end": 1491 + }, + "nodeId": "3879:35529", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1368, + "end": 1372 + }, + "nodeId": "3879:35529", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1373, + "end": 1389 + }, + "nodeId": "3879:35529", + "property": "fills", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1373, + "end": 1389 + }, + "nodeId": "3879:35529", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1390, + "end": 1417 + }, + "nodeId": "3879:35529", + "property": "styledTextSegments", + "styleId": "S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 1390, + "end": 1417 + }, + "nodeId": "3879:35529", + "property": "textStyleId", + "styleId": "S:b0ec2fec2239b9ee92dddb29cac074b93e2f98fa,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 1418, + "end": 1438 + }, + "nodeId": "3879:35529", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1456, + "end": 1469 + }, + "nodeId": "3879:35529", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1496, + "end": 1819 + }, + "nodeId": "3879:35530", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1507, + "end": 1510 + }, + "nodeId": "3879:35530", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1527, + "end": 1542 + }, + "nodeId": "3879:35530", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1559, + "end": 1572 + }, + "nodeId": "3879:35530", + "property": "fills", + "variableId": "VariableID:1:1009", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1559, + "end": 1572 + }, + "nodeId": "3879:35531", + "property": "fills", + "variableId": "VariableID:1:1009", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1559, + "end": 1572 + }, + "nodeId": "I3879:35525;17:2032", + "property": "strokes", + "variableId": "VariableID:1:1009", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1559, + "end": 1572 + }, + "nodeId": "I3879:35525;17:2034", + "property": "strokes", + "variableId": "VariableID:1:1009", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1559, + "end": 1572 + }, + "nodeId": "I3879:35525;17:2036", + "property": "strokes", + "variableId": "VariableID:1:1009", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1589, + "end": 1603 + }, + "nodeId": "3879:35530", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1589, + "end": 1603 + }, + "nodeId": "3879:35530", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1620, + "end": 1653 + }, + "nodeId": "3879:35531", + "property": "node", + "assetId": "3879:35531:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 1882, + "end": 3210 + }, + "nodeId": "3879:35532", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1887, + "end": 1893 + }, + "nodeId": "3879:35532", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1887, + "end": 1893 + }, + "nodeId": "3879:35532", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1894, + "end": 1904 + }, + "nodeId": "3879:35532", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1905, + "end": 1913 + }, + "nodeId": "3879:35532", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1919, + "end": 2967 + }, + "nodeId": "3879:35533", + "resolution": "node" + }, + { + "generatedRange": { + "start": 1926, + "end": 1932 + }, + "nodeId": "3879:35533", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 1926, + "end": 1932 + }, + "nodeId": "3879:35533", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 1945, + "end": 1966 + }, + "nodeId": "3879:35533", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 1979, + "end": 2007 + }, + "nodeId": "3879:35533", + "property": "strokes", + "variableId": "VariableID:63:1981", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2020, + "end": 2039 + }, + "nodeId": "3879:35533", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2052, + "end": 2068 + }, + "nodeId": "3879:35533", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2081, + "end": 2090 + }, + "nodeId": "3879:35533", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2103, + "end": 2112 + }, + "nodeId": "3879:35533", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2125, + "end": 2134 + }, + "nodeId": "3879:35533", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2125, + "end": 2134 + }, + "nodeId": "3879:35533", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2147, + "end": 2156 + }, + "nodeId": "3879:35533", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2147, + "end": 2156 + }, + "nodeId": "3879:35533", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2173, + "end": 2441 + }, + "nodeId": "3879:35534", + "resolution": "node" + }, + { + "generatedRange": { + "start": 2182, + "end": 2185 + }, + "nodeId": "3879:35534", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 2200, + "end": 2215 + }, + "nodeId": "3879:35534", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "3879:35534", + "property": "fills", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35534;20:3849", + "property": "fills", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35545;1690:32934;17:2032", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35545;1690:32934;17:2034", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35545;1690:32934;17:2036", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35549;1690:32934;17:2032", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35549;1690:32934;17:2034", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35549;1690:32934;17:2036", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35553;1690:32934;17:2032", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35553;1690:32934;17:2034", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35553;1690:32934;17:2036", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35557;1690:32934;17:2032", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35557;1690:32934;17:2034", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35557;1690:32934;17:2036", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35561;1690:32934;17:2032", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35561;1690:32934;17:2034", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2230, + "end": 2248 + }, + "nodeId": "I3879:35561;1690:32934;17:2036", + "property": "strokes", + "variableId": "VariableID:63:2093", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2263, + "end": 2277 + }, + "nodeId": "3879:35534", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2263, + "end": 2277 + }, + "nodeId": "3879:35534", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2292, + "end": 2325 + }, + "nodeId": "I3879:35534;20:3849", + "property": "node", + "assetId": "I3879:35534;20:3849:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 2446, + "end": 2947 + }, + "nodeId": "3879:35535", + "resolution": "node" + }, + { + "generatedRange": { + "start": 2455, + "end": 2459 + }, + "nodeId": "3879:35535", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 2474, + "end": 2492 + }, + "nodeId": "3879:35535", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2474, + "end": 2492 + }, + "nodeId": "3879:35535", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2474, + "end": 2492 + }, + "nodeId": "3879:35535", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2507, + "end": 2525 + }, + "nodeId": "3879:35535", + "property": "textAlignHorizontal", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2540, + "end": 2560 + }, + "nodeId": "3879:35535", + "property": "styledTextSegments", + "styleId": "S:0e215484a78b7be9bbbfa4c6ada772650e82023b,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 2540, + "end": 2560 + }, + "nodeId": "3879:35535", + "property": "textStyleId", + "styleId": "S:0e215484a78b7be9bbbfa4c6ada772650e82023b,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 2575, + "end": 2583 + }, + "nodeId": "3879:35535", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2598, + "end": 2618 + }, + "nodeId": "3879:35535", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 2653, + "end": 2669 + }, + "nodeId": "3879:35535", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2670, + "end": 2698 + }, + "nodeId": "3879:35535", + "property": "styledTextSegments", + "styleId": "S:0a76ff5553bb722fb68fd9b379ca5f85f913cadb,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 2716, + "end": 2724 + }, + "nodeId": "3879:35535", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 2761, + "end": 2927 + }, + "nodeId": "3879:35535", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 2972, + "end": 3192 + }, + "nodeId": "3879:35536", + "resolution": "node" + }, + { + "generatedRange": { + "start": 2979, + "end": 2983 + }, + "nodeId": "3879:35536", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 2984, + "end": 3002 + }, + "nodeId": "3879:35536", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2984, + "end": 3002 + }, + "nodeId": "3879:35536", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 2984, + "end": 3002 + }, + "nodeId": "3879:35536", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3003, + "end": 3025 + }, + "nodeId": "3879:35536", + "property": "styledTextSegments", + "styleId": "S:ddba35e8431e5a8140cb2a918793e8682b58ba39,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3003, + "end": 3025 + }, + "nodeId": "3879:35536", + "property": "textStyleId", + "styleId": "S:ddba35e8431e5a8140cb2a918793e8682b58ba39,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3026, + "end": 3046 + }, + "nodeId": "3879:35536", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3060, + "end": 3174 + }, + "nodeId": "3879:35536", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3215, + "end": 4270 + }, + "nodeId": "3879:35537", + "resolution": "node" + }, + { + "generatedRange": { + "start": 3220, + "end": 3226 + }, + "nodeId": "3879:35537", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3220, + "end": 3226 + }, + "nodeId": "3879:35537", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3237, + "end": 3253 + }, + "nodeId": "3879:35537", + "property": "fills", + "variableId": "VariableID:1:999", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3264, + "end": 3283 + }, + "nodeId": "3879:35537", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3294, + "end": 3303 + }, + "nodeId": "3879:35537", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3314, + "end": 3322 + }, + "nodeId": "3879:35537", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3314, + "end": 3322 + }, + "nodeId": "3879:35537", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3314, + "end": 3322 + }, + "nodeId": "3879:35537", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3314, + "end": 3322 + }, + "nodeId": "3879:35537", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3333, + "end": 3347 + }, + "nodeId": "3879:35537", + "property": "layoutPositioning", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3358, + "end": 3366 + }, + "nodeId": "3879:35537", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3381, + "end": 3469 + }, + "nodeId": "3879:35538", + "resolution": "node" + }, + { + "generatedRange": { + "start": 3388, + "end": 3392 + }, + "nodeId": "3879:35538", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3393, + "end": 3406 + }, + "nodeId": "3879:35538", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3393, + "end": 3406 + }, + "nodeId": "3879:35538", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3407, + "end": 3434 + }, + "nodeId": "3879:35538", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3407, + "end": 3434 + }, + "nodeId": "3879:35538", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3448, + "end": 3451 + }, + "nodeId": "3879:35538", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3474, + "end": 3740 + }, + "nodeId": "3879:35539", + "resolution": "node" + }, + { + "generatedRange": { + "start": 3481, + "end": 3485 + }, + "nodeId": "3879:35539", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3486, + "end": 3499 + }, + "nodeId": "3879:35539", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3486, + "end": 3499 + }, + "nodeId": "3879:35539", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3500, + "end": 3519 + }, + "nodeId": "3879:35539", + "property": "styledTextSegments", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3500, + "end": 3519 + }, + "nodeId": "3879:35539", + "property": "textStyleId", + "styleId": "S:d9dd5a9bed529cda847dd9aab216e2e34b570b37,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 3520, + "end": 3540 + }, + "nodeId": "3879:35539", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3554, + "end": 3722 + }, + "nodeId": "3879:35539", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3745, + "end": 4252 + }, + "nodeId": "3879:35540", + "resolution": "node" + }, + { + "generatedRange": { + "start": 3752, + "end": 3756 + }, + "nodeId": "3879:35540", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3752, + "end": 3756 + }, + "nodeId": "3879:35540", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3769, + "end": 3788 + }, + "nodeId": "3879:35540", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3801, + "end": 3822 + }, + "nodeId": "3879:35540", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3835, + "end": 3843 + }, + "nodeId": "3879:35540", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3835, + "end": 3843 + }, + "nodeId": "3879:35540", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3835, + "end": 3843 + }, + "nodeId": "3879:35540", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3835, + "end": 3843 + }, + "nodeId": "3879:35540", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3856, + "end": 3870 + }, + "nodeId": "3879:35540", + "property": "layoutPositioning", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3883, + "end": 3894 + }, + "nodeId": "3879:35540", + "property": "x", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3907, + "end": 3916 + }, + "nodeId": "3879:35540", + "property": "y", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3933, + "end": 4234 + }, + "nodeId": "3879:35541", + "resolution": "node" + }, + { + "generatedRange": { + "start": 3942, + "end": 3945 + }, + "nodeId": "3879:35541", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 3960, + "end": 3975 + }, + "nodeId": "3879:35541", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 3990, + "end": 4000 + }, + "nodeId": "3879:35541", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 3990, + "end": 4000 + }, + "nodeId": "3879:35542", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4015, + "end": 4029 + }, + "nodeId": "3879:35541", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4015, + "end": 4029 + }, + "nodeId": "3879:35541", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4044, + "end": 4077 + }, + "nodeId": "3879:35542", + "property": "node", + "assetId": "3879:35542:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 4291, + "end": 13586 + }, + "nodeId": "3879:35543", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4294, + "end": 4300 + }, + "nodeId": "3879:35543", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4294, + "end": 4300 + }, + "nodeId": "3879:35543", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4306, + "end": 5191 + }, + "nodeId": "3879:35544", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4311, + "end": 4317 + }, + "nodeId": "3879:35544", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4311, + "end": 4317 + }, + "nodeId": "3879:35544", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4323, + "end": 4946 + }, + "nodeId": "3879:35545", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4330, + "end": 4334 + }, + "nodeId": "3879:35545", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4330, + "end": 4334 + }, + "nodeId": "3879:35545", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4347, + "end": 4366 + }, + "nodeId": "3879:35545", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4379, + "end": 4400 + }, + "nodeId": "3879:35545", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4413, + "end": 4443 + }, + "nodeId": "3879:35545", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4456, + "end": 4465 + }, + "nodeId": "3879:35545", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4456, + "end": 4465 + }, + "nodeId": "3879:35545", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4478, + "end": 4487 + }, + "nodeId": "3879:35545", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4478, + "end": 4487 + }, + "nodeId": "3879:35545", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4500, + "end": 4509 + }, + "nodeId": "3879:35545", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4526, + "end": 4644 + }, + "nodeId": "I3879:35545;1690:32933", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4535, + "end": 4539 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4540, + "end": 4553 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4540, + "end": 4553 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4554, + "end": 4581 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 4554, + "end": 4581 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 4582, + "end": 4602 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4618, + "end": 4624 + }, + "nodeId": "I3879:35545;1690:32933", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4649, + "end": 4928 + }, + "nodeId": "I3879:35545;1690:32948", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4658, + "end": 4662 + }, + "nodeId": "I3879:35545;1690:32948", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4658, + "end": 4662 + }, + "nodeId": "I3879:35545;1690:32948", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4663, + "end": 4682 + }, + "nodeId": "I3879:35545;1690:32948", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4683, + "end": 4692 + }, + "nodeId": "I3879:35545;1690:32948", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4698, + "end": 4771 + }, + "nodeId": "I3879:35545;1690:32934", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4709, + "end": 4714 + }, + "nodeId": "I3879:35545;1690:32934", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4715, + "end": 4730 + }, + "nodeId": "I3879:35545;1690:32934", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4731, + "end": 4745 + }, + "nodeId": "I3879:35545;1690:32934", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4731, + "end": 4745 + }, + "nodeId": "I3879:35545;1690:32934", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4746, + "end": 4768 + }, + "nodeId": "I3879:35545;1690:32934;17:2032", + "property": "node", + "assetId": "I3879:35545;1690:32934;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 4746, + "end": 4768 + }, + "nodeId": "I3879:35545;1690:32934;17:2034", + "property": "node", + "assetId": "I3879:35545;1690:32934;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 4746, + "end": 4768 + }, + "nodeId": "I3879:35545;1690:32934;17:2036", + "property": "node", + "assetId": "I3879:35545;1690:32934;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 4746, + "end": 4768 + }, + "nodeId": "I3879:35545;1690:32934;17:2038", + "property": "node", + "assetId": "I3879:35545;1690:32934;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 4776, + "end": 4908 + }, + "nodeId": "I3879:35545;1690:32947", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4787, + "end": 4791 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4792, + "end": 4810 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4792, + "end": 4810 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4792, + "end": 4810 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4811, + "end": 4841 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "styledTextSegments", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 4811, + "end": 4841 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "textStyleId", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 4842, + "end": 4862 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4880, + "end": 4886 + }, + "nodeId": "I3879:35545;1690:32947", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4951, + "end": 5173 + }, + "nodeId": "3879:35546", + "resolution": "node" + }, + { + "generatedRange": { + "start": 4958, + "end": 4964 + }, + "nodeId": "3879:35546", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4958, + "end": 4964 + }, + "nodeId": "3879:35546", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 4965, + "end": 4990 + }, + "nodeId": "3879:35546", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 4991, + "end": 5000 + }, + "nodeId": "3879:35546", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 4991, + "end": 5000 + }, + "nodeId": "3879:35546", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5001, + "end": 5010 + }, + "nodeId": "3879:35546", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5001, + "end": 5010 + }, + "nodeId": "3879:35546", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5016, + "end": 5153 + }, + "nodeId": "3879:35547", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5025, + "end": 5029 + }, + "nodeId": "3879:35547", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5030, + "end": 5046 + }, + "nodeId": "3879:35547", + "property": "fills", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5030, + "end": 5046 + }, + "nodeId": "3879:35547", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5047, + "end": 5055 + }, + "nodeId": "3879:35547", + "property": "layoutGrow", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5056, + "end": 5071 + }, + "nodeId": "3879:35547", + "property": "styledTextSegments", + "styleId": "S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5056, + "end": 5071 + }, + "nodeId": "3879:35547", + "property": "textStyleId", + "styleId": "S:93f063a4fce3179ba5079044a05b56a3d9fa60f5,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5072, + "end": 5092 + }, + "nodeId": "3879:35547", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5108, + "end": 5133 + }, + "nodeId": "3879:35547", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5196, + "end": 6802 + }, + "nodeId": "3879:35548", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5201, + "end": 5207 + }, + "nodeId": "3879:35548", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5201, + "end": 5207 + }, + "nodeId": "3879:35548", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5213, + "end": 5837 + }, + "nodeId": "3879:35549", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5220, + "end": 5224 + }, + "nodeId": "3879:35549", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5220, + "end": 5224 + }, + "nodeId": "3879:35549", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5237, + "end": 5256 + }, + "nodeId": "3879:35549", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5269, + "end": 5290 + }, + "nodeId": "3879:35549", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5303, + "end": 5333 + }, + "nodeId": "3879:35549", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5346, + "end": 5355 + }, + "nodeId": "3879:35549", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5346, + "end": 5355 + }, + "nodeId": "3879:35549", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5368, + "end": 5377 + }, + "nodeId": "3879:35549", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5368, + "end": 5377 + }, + "nodeId": "3879:35549", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5390, + "end": 5399 + }, + "nodeId": "3879:35549", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5416, + "end": 5535 + }, + "nodeId": "I3879:35549;1690:32933", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5425, + "end": 5429 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5430, + "end": 5443 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5430, + "end": 5443 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5444, + "end": 5471 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5444, + "end": 5471 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5472, + "end": 5492 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5508, + "end": 5515 + }, + "nodeId": "I3879:35549;1690:32933", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5540, + "end": 5819 + }, + "nodeId": "I3879:35549;1690:32948", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5549, + "end": 5553 + }, + "nodeId": "I3879:35549;1690:32948", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5549, + "end": 5553 + }, + "nodeId": "I3879:35549;1690:32948", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5554, + "end": 5573 + }, + "nodeId": "I3879:35549;1690:32948", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5574, + "end": 5583 + }, + "nodeId": "I3879:35549;1690:32948", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5589, + "end": 5662 + }, + "nodeId": "I3879:35549;1690:32934", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5600, + "end": 5605 + }, + "nodeId": "I3879:35549;1690:32934", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5606, + "end": 5621 + }, + "nodeId": "I3879:35549;1690:32934", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5622, + "end": 5636 + }, + "nodeId": "I3879:35549;1690:32934", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5622, + "end": 5636 + }, + "nodeId": "I3879:35549;1690:32934", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5637, + "end": 5659 + }, + "nodeId": "I3879:35549;1690:32934;17:2032", + "property": "node", + "assetId": "I3879:35549;1690:32934;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 5637, + "end": 5659 + }, + "nodeId": "I3879:35549;1690:32934;17:2034", + "property": "node", + "assetId": "I3879:35549;1690:32934;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 5637, + "end": 5659 + }, + "nodeId": "I3879:35549;1690:32934;17:2036", + "property": "node", + "assetId": "I3879:35549;1690:32934;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 5637, + "end": 5659 + }, + "nodeId": "I3879:35549;1690:32934;17:2038", + "property": "node", + "assetId": "I3879:35549;1690:32934;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 5667, + "end": 5799 + }, + "nodeId": "I3879:35549;1690:32947", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5678, + "end": 5682 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5683, + "end": 5701 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5683, + "end": 5701 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5683, + "end": 5701 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5702, + "end": 5732 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "styledTextSegments", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5702, + "end": 5732 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "textStyleId", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5733, + "end": 5753 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5771, + "end": 5777 + }, + "nodeId": "I3879:35549;1690:32947", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5842, + "end": 6784 + }, + "nodeId": "3879:35550", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5849, + "end": 5855 + }, + "nodeId": "3879:35550", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5849, + "end": 5855 + }, + "nodeId": "3879:35550", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5856, + "end": 5881 + }, + "nodeId": "3879:35550", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5882, + "end": 5898 + }, + "nodeId": "3879:35550", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5899, + "end": 5908 + }, + "nodeId": "3879:35550", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5899, + "end": 5908 + }, + "nodeId": "3879:35550", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5909, + "end": 5918 + }, + "nodeId": "3879:35550", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5909, + "end": 5918 + }, + "nodeId": "3879:35550", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5924, + "end": 6764 + }, + "nodeId": "3879:35551", + "resolution": "node" + }, + { + "generatedRange": { + "start": 5933, + "end": 5937 + }, + "nodeId": "3879:35551", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 5938, + "end": 5951 + }, + "nodeId": "3879:35551", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5938, + "end": 5951 + }, + "nodeId": "3879:35551", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 5952, + "end": 5969 + }, + "nodeId": "3879:35551", + "property": "styledTextSegments", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5952, + "end": 5969 + }, + "nodeId": "3879:35551", + "property": "textStyleId", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 5970, + "end": 5978 + }, + "nodeId": "3879:35551", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 5979, + "end": 5999 + }, + "nodeId": "3879:35551", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6015, + "end": 6744 + }, + "nodeId": "3879:35551", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 6807, + "end": 8893 + }, + "nodeId": "3879:35552", + "resolution": "node" + }, + { + "generatedRange": { + "start": 6812, + "end": 6818 + }, + "nodeId": "3879:35552", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6812, + "end": 6818 + }, + "nodeId": "3879:35552", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 6824, + "end": 7448 + }, + "nodeId": "3879:35553", + "resolution": "node" + }, + { + "generatedRange": { + "start": 6831, + "end": 6835 + }, + "nodeId": "3879:35553", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6831, + "end": 6835 + }, + "nodeId": "3879:35553", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 6848, + "end": 6867 + }, + "nodeId": "3879:35553", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6880, + "end": 6901 + }, + "nodeId": "3879:35553", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 6914, + "end": 6944 + }, + "nodeId": "3879:35553", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6957, + "end": 6966 + }, + "nodeId": "3879:35553", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6957, + "end": 6966 + }, + "nodeId": "3879:35553", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6979, + "end": 6988 + }, + "nodeId": "3879:35553", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 6979, + "end": 6988 + }, + "nodeId": "3879:35553", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7001, + "end": 7010 + }, + "nodeId": "3879:35553", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7027, + "end": 7146 + }, + "nodeId": "I3879:35553;1690:32933", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7036, + "end": 7040 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7041, + "end": 7054 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7041, + "end": 7054 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7055, + "end": 7082 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7055, + "end": 7082 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7083, + "end": 7103 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7119, + "end": 7126 + }, + "nodeId": "I3879:35553;1690:32933", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7151, + "end": 7430 + }, + "nodeId": "I3879:35553;1690:32948", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7160, + "end": 7164 + }, + "nodeId": "I3879:35553;1690:32948", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7160, + "end": 7164 + }, + "nodeId": "I3879:35553;1690:32948", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7165, + "end": 7184 + }, + "nodeId": "I3879:35553;1690:32948", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7185, + "end": 7194 + }, + "nodeId": "I3879:35553;1690:32948", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7200, + "end": 7273 + }, + "nodeId": "I3879:35553;1690:32934", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7211, + "end": 7216 + }, + "nodeId": "I3879:35553;1690:32934", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7217, + "end": 7232 + }, + "nodeId": "I3879:35553;1690:32934", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7233, + "end": 7247 + }, + "nodeId": "I3879:35553;1690:32934", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7233, + "end": 7247 + }, + "nodeId": "I3879:35553;1690:32934", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7248, + "end": 7270 + }, + "nodeId": "I3879:35553;1690:32934;17:2032", + "property": "node", + "assetId": "I3879:35553;1690:32934;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 7248, + "end": 7270 + }, + "nodeId": "I3879:35553;1690:32934;17:2034", + "property": "node", + "assetId": "I3879:35553;1690:32934;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 7248, + "end": 7270 + }, + "nodeId": "I3879:35553;1690:32934;17:2036", + "property": "node", + "assetId": "I3879:35553;1690:32934;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 7248, + "end": 7270 + }, + "nodeId": "I3879:35553;1690:32934;17:2038", + "property": "node", + "assetId": "I3879:35553;1690:32934;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 7278, + "end": 7410 + }, + "nodeId": "I3879:35553;1690:32947", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7289, + "end": 7293 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7294, + "end": 7312 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7294, + "end": 7312 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7294, + "end": 7312 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7313, + "end": 7343 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "styledTextSegments", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7313, + "end": 7343 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "textStyleId", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7344, + "end": 7364 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7382, + "end": 7388 + }, + "nodeId": "I3879:35553;1690:32947", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7453, + "end": 8875 + }, + "nodeId": "3879:35554", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7460, + "end": 7466 + }, + "nodeId": "3879:35554", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7460, + "end": 7466 + }, + "nodeId": "3879:35554", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7467, + "end": 7492 + }, + "nodeId": "3879:35554", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7493, + "end": 7509 + }, + "nodeId": "3879:35554", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7510, + "end": 7519 + }, + "nodeId": "3879:35554", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7510, + "end": 7519 + }, + "nodeId": "3879:35554", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7520, + "end": 7529 + }, + "nodeId": "3879:35554", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7520, + "end": 7529 + }, + "nodeId": "3879:35554", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7535, + "end": 8855 + }, + "nodeId": "3879:35555", + "resolution": "node" + }, + { + "generatedRange": { + "start": 7544, + "end": 7548 + }, + "nodeId": "3879:35555", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 7549, + "end": 7562 + }, + "nodeId": "3879:35555", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7549, + "end": 7562 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 7563, + "end": 7580 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7563, + "end": 7580 + }, + "nodeId": "3879:35555", + "property": "textStyleId", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 7581, + "end": 7589 + }, + "nodeId": "3879:35555", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7590, + "end": 7610 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 7626, + "end": 8109 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8130, + "end": 8151 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 8130, + "end": 8151 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "variableId": "VariableID:98:3276", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 8152, + "end": 8177 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 8195, + "end": 8206 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8243, + "end": 8662 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8683, + "end": 8704 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 8683, + "end": 8704 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "variableId": "VariableID:98:3276", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 8705, + "end": 8730 + }, + "nodeId": "3879:35555", + "property": "styledTextSegments", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 8748, + "end": 8759 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8796, + "end": 8835 + }, + "nodeId": "3879:35555", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8898, + "end": 11146 + }, + "nodeId": "3879:35556", + "resolution": "node" + }, + { + "generatedRange": { + "start": 8903, + "end": 8909 + }, + "nodeId": "3879:35556", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 8903, + "end": 8909 + }, + "nodeId": "3879:35556", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8915, + "end": 9539 + }, + "nodeId": "3879:35557", + "resolution": "node" + }, + { + "generatedRange": { + "start": 8922, + "end": 8926 + }, + "nodeId": "3879:35557", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 8922, + "end": 8926 + }, + "nodeId": "3879:35557", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 8939, + "end": 8958 + }, + "nodeId": "3879:35557", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 8971, + "end": 8992 + }, + "nodeId": "3879:35557", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9005, + "end": 9035 + }, + "nodeId": "3879:35557", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9048, + "end": 9057 + }, + "nodeId": "3879:35557", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9048, + "end": 9057 + }, + "nodeId": "3879:35557", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9070, + "end": 9079 + }, + "nodeId": "3879:35557", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9070, + "end": 9079 + }, + "nodeId": "3879:35557", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9092, + "end": 9101 + }, + "nodeId": "3879:35557", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9118, + "end": 9237 + }, + "nodeId": "I3879:35557;1690:32933", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9127, + "end": 9131 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9132, + "end": 9145 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9132, + "end": 9145 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9146, + "end": 9173 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9146, + "end": 9173 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9174, + "end": 9194 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9210, + "end": 9217 + }, + "nodeId": "I3879:35557;1690:32933", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9242, + "end": 9521 + }, + "nodeId": "I3879:35557;1690:32948", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9251, + "end": 9255 + }, + "nodeId": "I3879:35557;1690:32948", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9251, + "end": 9255 + }, + "nodeId": "I3879:35557;1690:32948", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9256, + "end": 9275 + }, + "nodeId": "I3879:35557;1690:32948", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9276, + "end": 9285 + }, + "nodeId": "I3879:35557;1690:32948", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9291, + "end": 9364 + }, + "nodeId": "I3879:35557;1690:32934", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9302, + "end": 9307 + }, + "nodeId": "I3879:35557;1690:32934", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9308, + "end": 9323 + }, + "nodeId": "I3879:35557;1690:32934", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9324, + "end": 9338 + }, + "nodeId": "I3879:35557;1690:32934", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9324, + "end": 9338 + }, + "nodeId": "I3879:35557;1690:32934", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9339, + "end": 9361 + }, + "nodeId": "I3879:35557;1690:32934;17:2032", + "property": "node", + "assetId": "I3879:35557;1690:32934;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 9339, + "end": 9361 + }, + "nodeId": "I3879:35557;1690:32934;17:2034", + "property": "node", + "assetId": "I3879:35557;1690:32934;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 9339, + "end": 9361 + }, + "nodeId": "I3879:35557;1690:32934;17:2036", + "property": "node", + "assetId": "I3879:35557;1690:32934;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 9339, + "end": 9361 + }, + "nodeId": "I3879:35557;1690:32934;17:2038", + "property": "node", + "assetId": "I3879:35557;1690:32934;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 9369, + "end": 9501 + }, + "nodeId": "I3879:35557;1690:32947", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9380, + "end": 9384 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9385, + "end": 9403 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9385, + "end": 9403 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9385, + "end": 9403 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9404, + "end": 9434 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "styledTextSegments", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9404, + "end": 9434 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "textStyleId", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9435, + "end": 9455 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9473, + "end": 9479 + }, + "nodeId": "I3879:35557;1690:32947", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9544, + "end": 11128 + }, + "nodeId": "3879:35558", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9551, + "end": 9557 + }, + "nodeId": "3879:35558", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9551, + "end": 9557 + }, + "nodeId": "3879:35558", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9558, + "end": 9583 + }, + "nodeId": "3879:35558", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9584, + "end": 9600 + }, + "nodeId": "3879:35558", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9601, + "end": 9610 + }, + "nodeId": "3879:35558", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9601, + "end": 9610 + }, + "nodeId": "3879:35558", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9611, + "end": 9620 + }, + "nodeId": "3879:35558", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9611, + "end": 9620 + }, + "nodeId": "3879:35558", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9626, + "end": 11108 + }, + "nodeId": "3879:35559", + "resolution": "node" + }, + { + "generatedRange": { + "start": 9635, + "end": 9639 + }, + "nodeId": "3879:35559", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 9640, + "end": 9653 + }, + "nodeId": "3879:35559", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9640, + "end": 9653 + }, + "nodeId": "3879:35559", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 9654, + "end": 9671 + }, + "nodeId": "3879:35559", + "property": "styledTextSegments", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9654, + "end": 9671 + }, + "nodeId": "3879:35559", + "property": "textStyleId", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 9672, + "end": 9680 + }, + "nodeId": "3879:35559", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9681, + "end": 9701 + }, + "nodeId": "3879:35559", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 9717, + "end": 11088 + }, + "nodeId": "3879:35559", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11151, + "end": 13570 + }, + "nodeId": "3879:35560", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11156, + "end": 11162 + }, + "nodeId": "3879:35560", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11156, + "end": 11162 + }, + "nodeId": "3879:35560", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11168, + "end": 11792 + }, + "nodeId": "3879:35561", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11175, + "end": 11179 + }, + "nodeId": "3879:35561", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11175, + "end": 11179 + }, + "nodeId": "3879:35561", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11192, + "end": 11211 + }, + "nodeId": "3879:35561", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11224, + "end": 11245 + }, + "nodeId": "3879:35561", + "property": "fills", + "variableId": "VariableID:17:1548", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11258, + "end": 11288 + }, + "nodeId": "3879:35561", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11301, + "end": 11310 + }, + "nodeId": "3879:35561", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11301, + "end": 11310 + }, + "nodeId": "3879:35561", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11323, + "end": 11332 + }, + "nodeId": "3879:35561", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11323, + "end": 11332 + }, + "nodeId": "3879:35561", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11345, + "end": 11354 + }, + "nodeId": "3879:35561", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11371, + "end": 11490 + }, + "nodeId": "I3879:35561;1690:32933", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11380, + "end": 11384 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11385, + "end": 11398 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11385, + "end": 11398 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11399, + "end": 11426 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "styledTextSegments", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11399, + "end": 11426 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "textStyleId", + "styleId": "S:750268e778c58f7acf839269cb2e1fb140e113d7,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11427, + "end": 11447 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11463, + "end": 11470 + }, + "nodeId": "I3879:35561;1690:32933", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11495, + "end": 11774 + }, + "nodeId": "I3879:35561;1690:32948", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11504, + "end": 11508 + }, + "nodeId": "I3879:35561;1690:32948", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11504, + "end": 11508 + }, + "nodeId": "I3879:35561;1690:32948", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11509, + "end": 11528 + }, + "nodeId": "I3879:35561;1690:32948", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11529, + "end": 11538 + }, + "nodeId": "I3879:35561;1690:32948", + "property": "itemSpacing", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11544, + "end": 11617 + }, + "nodeId": "I3879:35561;1690:32934", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11555, + "end": 11560 + }, + "nodeId": "I3879:35561;1690:32934", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11561, + "end": 11576 + }, + "nodeId": "I3879:35561;1690:32934", + "property": "targetAspectRatio", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11577, + "end": 11591 + }, + "nodeId": "I3879:35561;1690:32934", + "property": "height", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11577, + "end": 11591 + }, + "nodeId": "I3879:35561;1690:32934", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11592, + "end": 11614 + }, + "nodeId": "I3879:35561;1690:32934;17:2032", + "property": "node", + "assetId": "I3879:35561;1690:32934;17:2032:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 11592, + "end": 11614 + }, + "nodeId": "I3879:35561;1690:32934;17:2034", + "property": "node", + "assetId": "I3879:35561;1690:32934;17:2034:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 11592, + "end": 11614 + }, + "nodeId": "I3879:35561;1690:32934;17:2036", + "property": "node", + "assetId": "I3879:35561;1690:32934;17:2036:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 11592, + "end": 11614 + }, + "nodeId": "I3879:35561;1690:32934;17:2038", + "property": "node", + "assetId": "I3879:35561;1690:32934;17:2038:node", + "resolution": "asset" + }, + { + "generatedRange": { + "start": 11622, + "end": 11754 + }, + "nodeId": "I3879:35561;1690:32947", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11633, + "end": 11637 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11638, + "end": 11656 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "fills", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11638, + "end": 11656 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:17:1554", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11638, + "end": 11656 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11657, + "end": 11687 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "styledTextSegments", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11657, + "end": 11687 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "textStyleId", + "styleId": "S:7cad4f3244d4a2f4e94f753af8b0ba320b846b4d,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11688, + "end": 11708 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11726, + "end": 11732 + }, + "nodeId": "I3879:35561;1690:32947", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11797, + "end": 13552 + }, + "nodeId": "3879:35562", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11804, + "end": 11810 + }, + "nodeId": "3879:35562", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11804, + "end": 11810 + }, + "nodeId": "3879:35562", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11811, + "end": 11836 + }, + "nodeId": "3879:35562", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11837, + "end": 11853 + }, + "nodeId": "3879:35562", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11854, + "end": 11863 + }, + "nodeId": "3879:35562", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11854, + "end": 11863 + }, + "nodeId": "3879:35562", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11864, + "end": 11873 + }, + "nodeId": "3879:35562", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11864, + "end": 11873 + }, + "nodeId": "3879:35562", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11879, + "end": 13532 + }, + "nodeId": "3879:35563", + "resolution": "node" + }, + { + "generatedRange": { + "start": 11888, + "end": 11892 + }, + "nodeId": "3879:35563", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 11893, + "end": 11906 + }, + "nodeId": "3879:35563", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11893, + "end": 11906 + }, + "nodeId": "3879:35563", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 11907, + "end": 11924 + }, + "nodeId": "3879:35563", + "property": "styledTextSegments", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11907, + "end": 11924 + }, + "nodeId": "3879:35563", + "property": "textStyleId", + "styleId": "S:3dbbcdf26742b272a0f23eae240c9bbebd5089b8,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 11925, + "end": 11933 + }, + "nodeId": "3879:35563", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11934, + "end": 11954 + }, + "nodeId": "3879:35563", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 11970, + "end": 13512 + }, + "nodeId": "3879:35563", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 13591, + "end": 14411 + }, + "nodeId": "3879:35564", + "resolution": "node" + }, + { + "generatedRange": { + "start": 13594, + "end": 13598 + }, + "nodeId": "3879:35564", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13594, + "end": 13598 + }, + "nodeId": "3879:35564", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 13607, + "end": 13626 + }, + "nodeId": "3879:35564", + "property": "counterAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13635, + "end": 13660 + }, + "nodeId": "3879:35564", + "property": "fills", + "variableId": "VariableID:1:1000", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 13669, + "end": 13698 + }, + "nodeId": "3879:35564", + "property": "strokes", + "variableId": "VariableID:1:1001", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 13707, + "end": 13719 + }, + "nodeId": "3879:35564", + "property": "y", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13728, + "end": 13758 + }, + "nodeId": "3879:35564", + "property": "primaryAxisAlignItems", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13767, + "end": 13777 + }, + "nodeId": "3879:35564", + "property": "x", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13786, + "end": 13803 + }, + "nodeId": "3879:35564", + "property": "clipsContent", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13812, + "end": 13826 + }, + "nodeId": "3879:35564", + "property": "layoutPositioning", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13835, + "end": 13844 + }, + "nodeId": "3879:35564", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13835, + "end": 13844 + }, + "nodeId": "3879:35564", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13853, + "end": 13861 + }, + "nodeId": "3879:35564", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13853, + "end": 13861 + }, + "nodeId": "3879:35564", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13870, + "end": 13878 + }, + "nodeId": "3879:35564", + "property": "width", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13891, + "end": 14187 + }, + "nodeId": "3879:35565", + "resolution": "node" + }, + { + "generatedRange": { + "start": 13896, + "end": 13902 + }, + "nodeId": "3879:35565", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 13896, + "end": 13902 + }, + "nodeId": "3879:35565", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 13913, + "end": 13926 + }, + "nodeId": "3879:35565", + "property": "fills", + "variableId": "VariableID:68:6122", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 13937, + "end": 13967 + }, + "nodeId": "3879:35565", + "property": "strokes", + "variableId": "VariableID:320:9071", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 13978, + "end": 13997 + }, + "nodeId": "3879:35565", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14008, + "end": 14017 + }, + "nodeId": "3879:35565", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14008, + "end": 14017 + }, + "nodeId": "3879:35565", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14028, + "end": 14037 + }, + "nodeId": "3879:35565", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14028, + "end": 14037 + }, + "nodeId": "3879:35565", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14052, + "end": 14169 + }, + "nodeId": "3879:35566", + "resolution": "node" + }, + { + "generatedRange": { + "start": 14059, + "end": 14063 + }, + "nodeId": "3879:35566", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 14064, + "end": 14077 + }, + "nodeId": "3879:35566", + "property": "fills", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 14064, + "end": 14077 + }, + "nodeId": "3879:35566", + "property": "styledTextSegments", + "variableId": "VariableID:1:998", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 14078, + "end": 14103 + }, + "nodeId": "3879:35566", + "property": "styledTextSegments", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 14078, + "end": 14103 + }, + "nodeId": "3879:35566", + "property": "textStyleId", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 14104, + "end": 14124 + }, + "nodeId": "3879:35566", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14138, + "end": 14151 + }, + "nodeId": "3879:35566", + "property": "characters", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 14192, + "end": 14397 + }, + "nodeId": "3879:35567", + "resolution": "node" + }, + { + "generatedRange": { + "start": 14197, + "end": 14203 + }, + "nodeId": "3879:35567", + "property": "layoutMode", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14197, + "end": 14203 + }, + "nodeId": "3879:35567", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 14204, + "end": 14217 + }, + "nodeId": "3879:35567", + "property": "fills", + "variableId": "VariableID:1:995", + "resolution": "variable-token" + }, + { + "generatedRange": { + "start": 14218, + "end": 14237 + }, + "nodeId": "3879:35567", + "property": "cornerRadius", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14238, + "end": 14247 + }, + "nodeId": "3879:35567", + "property": "paddingLeft", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14238, + "end": 14247 + }, + "nodeId": "3879:35567", + "property": "paddingRight", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14248, + "end": 14257 + }, + "nodeId": "3879:35567", + "property": "paddingBottom", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14248, + "end": 14257 + }, + "nodeId": "3879:35567", + "property": "paddingTop", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14263, + "end": 14379 + }, + "nodeId": "3879:35568", + "resolution": "node" + }, + { + "generatedRange": { + "start": 14270, + "end": 14274 + }, + "nodeId": "3879:35568", + "property": "type", + "resolution": "exact" + }, + { + "generatedRange": { + "start": 14275, + "end": 14287 + }, + "nodeId": "3879:35568", + "property": "fills", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14288, + "end": 14313 + }, + "nodeId": "3879:35568", + "property": "styledTextSegments", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 14288, + "end": 14313 + }, + "nodeId": "3879:35568", + "property": "textStyleId", + "styleId": "S:c5bf8fa1fe5f6bffe79f76cae556417528687add,", + "resolution": "style-token" + }, + { + "generatedRange": { + "start": 14314, + "end": 14334 + }, + "nodeId": "3879:35568", + "property": "characters", + "resolution": "raw-fallback" + }, + { + "generatedRange": { + "start": 14348, + "end": 14361 + }, + "nodeId": "3879:35568", + "property": "characters", + "resolution": "exact" + } + ] +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_used_tokens.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_used_tokens.snap new file mode 100644 index 0000000..11230ea --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_used_tokens.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151.rs +expression: output.used_tokens +--- +[ + "background", + "backgroundLight", + "border", + "borderBold", + "caption", + "captionLight", + "containerBackground", + "gray300", + "innerBg", + "primary", + "primaryLight", + "text", + "textLight" +] diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap new file mode 100644 index 0000000..44892ac --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap @@ -0,0 +1,69 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935503() { + return ( + +
    + + + 기록해주신 이야기를
    정리하고 있어요
    잠시만 기다려주세요 +
    +
    + +
    + + 기억을 더듬어 기록하는 시간은
    그 자체로 훌륭한 여행이랍니다. +
    +
    + +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap new file mode 100644 index 0000000..4d22ceb --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap @@ -0,0 +1,354 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935518() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 편집 설정 + +
    +
    + + 검토 완료 + +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap new file mode 100644 index 0000000..854353c --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap @@ -0,0 +1,584 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935569() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    + + + 교정 옵션을 선택해주세요. + + + + + + AI 편집자에게 다듬기 맡기기 + + + + + + 내 문장 최대한 유지하기 + + + + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 문체 변경 + +
    +
    + + 검토 완료 + +
    +
    + + + + + + + 문체 변경 + + + + 책 전체 + + 에 적용할 문체를 설정해주세요. + + + + + + + + + + + 담담체 + + + 차분하고 담백한 문체 + + + + + + + + 서정체 + + + 감성적이고 부드러운 문체 + + + + + + + + 강건체 + + + 단호하고 힘찬 문체 + + + + + + + 선택지 + + + + + 선택지 + + + + + + 교정 설정 + + + + 이번 이야기 + + 에만 적용할 교정 방법을 설정해주세요. + + + + + + + + AI 담당자와 함께 문체 다듬기 + + + AI 담당자가 문맥을 자연스럽게 수정해요 + + + + + + + + 내 문장 그대로 맞춤법만 다듬기 + + + 입력하신 문장 그대로의 느낌을 담아내요 + + + + + +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap new file mode 100644 index 0000000..f9eb53d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap @@ -0,0 +1,531 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935652() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    + + + 교정 옵션을 선택해주세요. + + + + + + AI 편집자에게 다듬기 맡기기 + + + + + + 내 문장 최대한 유지하기 + + + + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 문체 변경 + +
    +
    + + 검토 완료 + +
    +
    + + + + + + + 문체 변경 + + + + 책 전체 + + 에 적용할 문체를 설정해주세요. + + + + + + + + + + + 담담체 + + + 차분하고 담백한 문체 + + + + + + + + 서정체 + + + 감성적이고 부드러운 문체 + + + + + + + + 강건체 + + + 단호하고 힘찬 문체 + + + + + + + 선택지 + + + + + 선택지 + + + + +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap new file mode 100644 index 0000000..bde8a81 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap @@ -0,0 +1,511 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935729() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    + + + 교정 옵션을 선택해주세요. + + + + + + AI 편집자에게 다듬기 맡기기 + + + + + + 내 문장 최대한 유지하기 + + + + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 문체 변경 + +
    +
    + + 검토 완료 + +
    +
    + + + + + + + 교정 설정 + + + + 이번 이야기 + + 에만 적용할 교정 방법을 설정해주세요. + + + + + + + + + + + AI 담당자와 함께 문체 다듬기 + + + AI 담당자가 문맥을 자연스럽게 수정해요 + + + + + + + + 내 문장 그대로 맞춤법만 다듬기 + + + 입력하신 문장 그대로의 느낌을 담아내요 + + + + + + + 선택지 + + + + + 선택지 + + + + +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap new file mode 100644 index 0000000..a88be3f --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap @@ -0,0 +1,628 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935887() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    + + + 교정 옵션을 선택해주세요. + + + + + + AI 편집자에게 다듬기 맡기기 + + + + + + 내 문장 최대한 유지하기 + + + + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 문체 변경 + +
    +
    + + 검토 완료 + +
    +
    + + + + + + + 공개 설정 + + + 작성하신 이야기를 누구와 함께 나눌지 선택해 주세요. + + + + + + + + + + + 동행인 + + + 작가님의 동행인과 이야기를 나눕니다. + + + + + + + + 나만 보기 + + + 누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다. + + + + + + + 선택지 + + + + + 선택지 + + + + + + 교정 설정 + + + + 이번 이야기 + + 에만 적용할 교정 방법을 설정해주세요. + + + + + + + + AI 담당자와 함께 문체 다듬기 + + + AI 담당자가 문맥을 자연스럽게 수정해요 + + + + + + + + 내 문장 그대로 맞춤법만 다듬기 + + + 입력하신 문장 그대로의 느낌을 담아내요 + + + + + + + +
    + + 글 다듬기 방식을 변경할까요? + +
    + + 새로운 방식에 맞춰
    글을 다시 정리하므로
    시간이 조금 소요될 수 있습니다.
    기존에 정리된 글은 사라집니다. +
    +
    +
    + +
    + + 취소 + +
    +
    + + 다시 교정하기 + +
    +
    +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap new file mode 100644 index 0000000..fea50e7 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap @@ -0,0 +1,632 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387935973() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + 현재 적용된 문체 : + + + 담담체 + + +
    + + + 교정 옵션을 선택해주세요. + + + + + + AI 편집자에게 다듬기 맡기기 + + + + + + 내 문장 최대한 유지하기 + + + + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 문체 변경 + +
    +
    + + 검토 완료 + +
    +
    + + + + + + + 공개 설정 + + + 작성하신 이야기를 누구와 함께 나눌지 선택해 주세요. + + + + + + + + + + + 동행인 + + + 작가님의 동행인과 이야기를 나눕니다. + + + + + + + + 나만 보기 + + + 누구에게도 공유하지 않고 나 혼자만 조용히 간직합니다. + + + + + + + 선택지 + + + + + 선택지 + + + + + + 교정 설정 + + + + 이번 이야기 + + 에만 적용할 교정 방법을 설정해주세요. + + + + + + + + AI 담당자와 함께 문체 다듬기 + + + AI 담당자가 문맥을 자연스럽게 수정해요 + + + + + + + + 내 문장 그대로 맞춤법만 다듬기 + + + 입력하신 문장 그대로의 느낌을 담아내요 + + + + + + + +
    + + 문체를 적용합니다. + +
    + + 선택하신 + + {" "}{"'"}담담체 + + {"'"}를
    이야기 전체에 적용하시겠습니까?
글을 다시 정리하므로
    시간이 조금 소요될 수 있습니다.
    기존에 정리된 글은 사라집니다. +
    +
    +
    + +
    + + 취소 + +
    +
    + + 적용하기 + +
    +
    +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap new file mode 100644 index 0000000..1242885 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap @@ -0,0 +1,223 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387936059() { + return ( + + +
    + +
    +
    + + + + 초기화 + + +
    +
    + + + 주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요 + +
    + + + 이야기가 막힐 때 눌러보세요 + +
    + + 그건 어느 추운 겨울날이었어. 바깥에는
    첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어. +
    + +
    + + 직접 입력 + + +
    +
    + + 녹음하기 + + +
    +
    + + 작성 완료 + + +
    +
    + + 임시 저장하고 다음에 이어서 하기 + +
    + + +
    + + 이야기 다듬기 시작 + +
    + + 이야기를 마무리 하고
    글 다듬기를 시작하시겠습니까? +
    + + + 원하는 글 다듬기 방식을 선택해주세요. + + + + + + AI 담당자와 함께 문체 다듬기 + + + + + + 내 문장 그대로 맞춤법만 다듬기 + + + + +
    +
    + +
    + + 더 이야기 할게요 + +
    +
    + + 마무리 할게요 + +
    +
    +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36108.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36108.snap new file mode 100644 index 0000000..23bcca3 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36108.snap @@ -0,0 +1,116 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387936108() { + return ( + + +
    + +
    +
    + + + + 초기화 + + +
    +
    + + + 주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요 + +
    + + + 이야기가 막힐 때 눌러보세요 + +
    + + 그건 어느 추운 겨울날이었어. 바깥에는
    첫눈이 내려 온통 세상이 하얗고 거리의 소음마저 눈에 묻혀 조용한 오후였지. 나는 버스 정류장에서 잔뜩 움츠린 채 서 있었어. +
    + +
    + + 직접 입력 + + +
    +
    + + 녹음하기 + + +
    +
    + + 작성 완료 + + +
    +
    + + 임시 저장하고 다음에 이어서 하기 + +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36144.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36144.snap new file mode 100644 index 0000000..7e0cf2d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36144.snap @@ -0,0 +1,345 @@ +--- +source: crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +expression: output.tsx +--- +import { Box, Center, Flex, Image, Text, VStack } from "@devup-ui/react"; + +export function Wquw151Frame387936144() { + return ( + + + + 이야기가 글로
    정리되었어요 +
    + +
    + + + 공개 설정 : + + + 나만 보기 + + + +
    +
    + +
    + + + + [여기] + + 를 눌러 이야기에
    어울리는 사진을 추가해보세요.
    사진은 선택사항이며,
    나중에 천천히 추가하셔도 괜찮습니다. +
    +
    + + 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. + +
    + + + TIP + + + 각 단락을 선택해서 고유명사를 수정하거나,
    의도와 다르게 작성된 이야기를 원하는 내용으로 직접 바꿀 수 있습니다.{" "} +
    + + + +
    +
    + + + + + 제목 + + + + + 수정 + + + +
    + + 작은 시장, 큰 사랑 + +
    +
    + + + + 1단락 + + + + + 수정 + + + +
    + + 학교를 마치고 집으로 돌아오던 늦은 오후였다. 가방을 메고 좁은 골목길을 따라 시장 쪽으로 걸어가는데, 어디선가 군밤 굽는 냄새가 솔솔 풍겨왔다. 구수하고 달큰한 향이 코끝을 간질이자, 학교 끝나고 집에 가는 길이 조금은 설레였다.

    겨울이 다가오고 있었고, 해는 이미 많이 기울어 있었다. 시장 입구에 들어서자, 늘 그렇듯 분주한 풍경이 눈에 들어왔다. 가게 앞에 나란히 놓인 귤 상자, 손님을 부르는 상인들의 목소리, 생선 비린내와 튀김 기름 냄새가 뒤섞인 공기. 그때 나는 사람들 사이로 장을 보고 계신 어머니의 모습을 발견했다. +
    +
    +
    + + + + 2단락 + + + + + 수정 + + + +
    + + “엄마!”

    나는 반가운 마음에 큰 소리로 어머니를 불렀다. 어머니는 미역이 담긴 비닐봉지를 고르고 계셨는데, 내 목소리에 깜짝 놀라시더니 고개를 돌려 나를 보셨다. 순간 어머니의 얼굴에 번져가는 웃음이 얼마나 따뜻하고 아름다웠는지 모른다. 놀라움이 가득한 표정에서 환한 미소로 변해가는 그 표정을, 나는 아직도 잊을 수 없다.

    “우리{" "} + + [1. 이름] + + {" "}왔어?”

    어머니는 장바구니를 들어 올리며 내 앞까지 걸어오셨다. 얼굴에는 하루의 피로가 묻어 있었지만, 나를 보는 눈빛은 그 어떤 보석보다 반짝였다. 나는 어머니가 드신 장바구니를 대신 들어드리려고 손을 뻗었지만, 어머니는 살짝 웃으며 고개를 저으셨다.

    “괜찮아. 엄마가 들 수 있어.{" "} + + [1. 이름] + + {" "}학교 끝났어? 배고프지?” +
    +
    +
    + + + + 3단락 + + + + + 수정 + + + +
    + + 나는 고개를 끄덕였다. 사실 점심을 먹고도 오후 수업 내내 배가 고팠다. 그날 따라 학교 급식으로 나온 미역국은 너무 싱거웠고, 반찬도 입에 잘 맞지 않았다. 그래서인지 방과 후의 시장은 더욱 풍요롭게 느껴졌다. 시장 어귀에 있는 떡볶이 가게에서는 매콤달콤한 양념 냄새가 풍겨왔고, 튀김 옆에서는 순대와 오뎅 국물이 모락모락 김을 피우고 있었다.

    어머니는 내 손을 잡고 떡볶이 집 앞에 멈추셨다.

    “오늘은 떡볶이 먹고 갈까?”

    나는 두 눈을 반짝이며 고개를 끄덕였다. 어머니는 웃으며 천 원짜리 두 장을 떡볶이 아줌마에게 내셨고, 우리는 떡볶이와 오뎅 두 개를 받았다. 김이 모락모락 나는 떡볶이를 한 입 베어무는 순간, 달고 맵고 뜨거운 맛이 입안 가득 번졌다. 혀끝이 얼얼했지만, 너무 맛있어서 눈물이 날 뻔했다.

    어머니는 내 옆에서 오뎅 국물을 후후 불어 드셨다. 그 모습이 참 편안하고 따뜻해 보였다. 시장의 소음 속에서, 우리는 그렇게 둘만의 시간을 보냈다. 어머니는 가끔씩 내 머리를 쓰다듬어 주셨다. 손끝에서 전해지는 온기가 내 마음을 간질이며, 이상하게도 울고 싶어졌다. +
    +
    +
    + + + + 4단락 + + + + + 수정 + + + +
    + + 그때 나는 몰랐다. 어머니가 그날 장바구니에 담았던 미역과 두부, 콩나물과 달걀을 가지고 집에 가셔서, 얼마나 정성스럽게 저녁상을 차리셨는지. 나중에야 알았다. 하루 종일 서서 일하고, 시장까지 들렀다가도 내 얼굴을 보며 웃어주던 그 미소 뒤에, 얼마나 큰 사랑과 노력이 숨어 있었는지를.

    집으로 돌아오는 길, 어머니와 나는 나란히 걸었다. 어머니의 코트 깃에는 생선 비린내와 미역 냄새가 살짝 묻어 있었지만, 나는 그 냄새가 좋았다. 왠지 모르게 든든했고, 집에 간다는 느낌이 들어서 마음이 편안해졌다.

    그날 저녁, 어머니는 미역국을 끓여주셨다. 따뜻한 국물 한 숟가락을 떠먹는 순간, 학교 급식으로 먹었던 싱거운 미역국은 잊혀지고, 어머니의 국물이야말로 진짜 미역국이라는 생각이 들었다. 부드럽고 고소하면서도, 뱃속까지 따뜻해지는 그 맛. 나는 밥그릇을 비우고 나서야, 배가 부른 게 아니라 마음이 든든해진다는 것을 알았다.

    그리고 지금도, 살아가는 일이 힘들고 지칠 때면 그날의 기억이 떠오른다. 시장에서 나를 보고 환하게 웃으시던 어머니의 얼굴, 따뜻한 떡볶이와 오뎅 국물의 맛, 그리고 겨울 저녁집으로 돌아오던 길의 포근한 공기. 그 모든 것들이 내 안에서 작은 등불처럼 빛나며, 다시 일어설 힘을 준다. +
    +
    +
    +
    + +
    + + 교정 설정 + +
    +
    + + 검토 완료 + +
    +
    +
    + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/support/mod.rs b/crates/devup-mcp-devup-ui/tests/support/mod.rs new file mode 100644 index 0000000..ce4b80d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/support/mod.rs @@ -0,0 +1,818 @@ +#![allow(dead_code)] + +use std::{ + collections::{BTreeMap, BTreeSet}, + fs, + path::{Path, PathBuf}, +}; + +use devup_mcp_devup_ui::{ + codegen::{ + CodegenOptions, generate_component, generate_component_set_target, + generate_inlined_component_instance, generate_legacy_component, generate_node, + render_codegen_provider, render_component_registration_snapshot, render_component_source, + render_responsive_component_mock, render_variant_tree_merge, render_viewport_component, + }, + theme::{ThemeScope, generate_devup_json, variable_snapshot_from_result}, +}; +use devup_mcp_figma::{CollectedPayload, DevupError}; +use serde::Deserialize; +use serde_json::{Value, json}; +use sha2::{Digest, Sha256}; + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FixtureCase { + pub schema_version: u32, + pub id: String, + pub operation: FixtureOperation, + pub source: FixtureSource, + pub request: FixtureRequest, + pub payload: CollectedPayload, +} + +#[derive(Debug, Clone, Copy, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum FixtureOperation { + Tsx, + ResponsiveTsx, + DevupJson, + Snapshot, + ComponentRegistration, + Error, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FixtureSource { + pub repository: String, + pub commit: String, + pub test_id: String, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FixtureRequest { + pub root_id: String, + #[serde(default)] + pub component_name: Option, + #[serde(default)] + pub scope: Option, + /// Exact non-node input used by legacy renderer/registration unit snapshots. + /// It is kept outside `payload` so internal JavaScript test shapes are never + /// misrepresented as fields returned by the Figma Plugin API. + #[serde(default)] + pub operation_input: Option, +} + +#[derive(Debug)] +pub enum FixtureError { + Io(std::io::Error), + Json(serde_json::Error), + Invalid(String), +} + +impl std::fmt::Display for FixtureError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Io(error) => write!(formatter, "fixture를 읽지 못했습니다: {error}"), + Self::Json(error) => write!(formatter, "fixture JSON이 올바르지 않습니다: {error}"), + Self::Invalid(message) => formatter.write_str(message), + } + } +} + +impl std::error::Error for FixtureError {} + +pub fn load_case(path: impl AsRef) -> Result { + let bytes = fs::read(path).map_err(FixtureError::Io)?; + let case: FixtureCase = serde_json::from_slice(&bytes).map_err(FixtureError::Json)?; + validate_case(&case)?; + Ok(case) +} + +fn validate_case(case: &FixtureCase) -> Result<(), FixtureError> { + if case.schema_version != 1 { + return Err(FixtureError::Invalid(format!( + "지원하지 않는 fixture schemaVersion입니다: {}", + case.schema_version + ))); + } + if case.id.trim().is_empty() || case.source.test_id.trim().is_empty() { + return Err(FixtureError::Invalid( + "fixture id와 source.testId는 비어 있을 수 없습니다.".to_owned(), + )); + } + if case.source.commit.len() != 40 + || !case + .source + .commit + .bytes() + .all(|byte| byte.is_ascii_hexdigit()) + { + return Err(FixtureError::Invalid( + "source.commit은 40자리 git SHA여야 합니다.".to_owned(), + )); + } + if !case + .payload + .snapshot + .nodes + .contains_key(&case.request.root_id) + { + return Err(FixtureError::Invalid(format!( + "rootId '{}'가 payload에 없습니다.", + case.request.root_id + ))); + } + Ok(()) +} + +pub fn run_case(case: &FixtureCase) -> Result { + match case.operation { + FixtureOperation::Tsx + | FixtureOperation::ResponsiveTsx + | FixtureOperation::Snapshot + | FixtureOperation::ComponentRegistration => { + let output = generate_component( + &case.payload.snapshot, + &case.request.root_id, + &CodegenOptions { + component_name: case.request.component_name.clone(), + include_diagnostics: true, + ..CodegenOptions::default() + } + .with_payload_tokens(&case.payload), + )?; + Ok(json!({ + "tsx": output.tsx, + "imports": output.imports, + "usedTokens": output.used_tokens, + "diagnostics": output.diagnostics, + })) + } + FixtureOperation::DevupJson => { + let variables = case.payload.variables.as_ref().ok_or_else(|| { + DevupError::new( + devup_mcp_figma::ErrorCode::DevupThemeConflict, + "devup-json fixture에는 variables payload가 필요합니다.", + false, + ) + })?; + let snapshot = variable_snapshot_from_result(variables)?; + let output = + generate_devup_json(&snapshot, case.request.scope.unwrap_or(ThemeScope::File))?; + Ok(json!({ + "json": output.json, + "counts": output.counts, + "completeness": output.completeness, + "diagnostics": output.diagnostics, + })) + } + FixtureOperation::Error => match generate_component( + &case.payload.snapshot, + &case.request.root_id, + &CodegenOptions::default(), + ) { + Ok(output) => Ok(json!({ "unexpectedSuccess": output.tsx })), + Err(error) => serde_json::to_value(error).map_err(|_| { + DevupError::new( + devup_mcp_figma::ErrorCode::DevupCodegenFailed, + "오류 fixture 결과를 직렬화하지 못했습니다.", + false, + ) + }), + }, + } +} + +pub fn run_upstream_snapshot(case: &FixtureCase) -> Result { + let options = CodegenOptions { + component_name: case.request.component_name.clone(), + include_diagnostics: true, + ..CodegenOptions::default() + } + .with_payload_tokens(&case.payload); + if let Some(input) = case.request.operation_input.as_ref() { + if let Some(instance) = input.get("inlineComponentInstance").and_then(Value::as_str) { + let output = generate_inlined_component_instance( + &case.payload.snapshot, + &case.request.root_id, + instance, + &options, + )?; + return Ok(format!("\"{}\"", output.tsx)); + } + if input.get("treesByVariant").is_some() + && let Some(output) = render_variant_tree_merge(input) + { + return Ok(output); + } + if input.get("mockTree").is_some() + && let Some(output) = render_responsive_component_mock(input) + { + return Ok(output); + } + if input.get("type").and_then(Value::as_str) == Some("COMPONENT_SET") + && let Some(output) = render_viewport_component(input) + { + return Ok(output); + } + if input.get("language").is_some() + || input.get("type").and_then(Value::as_str) == Some("SECTION") + { + let pure = generate_node(&case.payload.snapshot, &case.request.root_id, &options)?; + if let Some(output) = render_codegen_provider(input, &pure.tsx) { + return Ok(output); + } + } + if let Some(target) = input.get("targetComponent").and_then(Value::as_str) + && matches!(case.operation, FixtureOperation::Tsx) + { + let output = generate_component_set_target( + &case.payload.snapshot, + &case.request.root_id, + target, + &options, + )?; + return Ok(format!("\"{}\"", output.tsx)); + } + if let Some(target) = input.get("targetComponent").and_then(Value::as_str) + && matches!(case.operation, FixtureOperation::ComponentRegistration) + { + return render_component_registration_snapshot( + &case.payload.snapshot, + &case.request.root_id, + target, + ); + } + if let (Some(name), Some(code), Some(variants)) = ( + input.get("name").and_then(Value::as_str), + input.get("code").and_then(Value::as_str), + input.get("variants").and_then(Value::as_object), + ) { + let variant_order = input + .get("variantOrder") + .and_then(Value::as_array) + .map(|order| order.iter().filter_map(Value::as_str).collect::>()); + let variants = variant_order + .map(|order| { + order + .into_iter() + .filter_map(|key| { + variants + .get(key) + .and_then(Value::as_str) + .map(|value| (key.to_owned(), value.to_owned())) + }) + .collect::>() + }) + .unwrap_or_else(|| { + variants + .iter() + .filter_map(|(key, value)| { + value + .as_str() + .map(|value| (key.to_owned(), value.to_owned())) + }) + .collect::>() + }); + return Ok(format!( + "\"{}\"", + render_component_source(name, code, &variants) + )); + } + return Ok("DEVUP_OPERATION_INPUT_NOT_IMPLEMENTED".to_owned()); + } + if matches!(case.operation, FixtureOperation::ComponentRegistration) { + return Ok("DEVUP_COMPONENT_REGISTRATION_NOT_IMPLEMENTED".to_owned()); + } + let output = if matches!(case.operation, FixtureOperation::Tsx) { + generate_legacy_component(&case.payload.snapshot, &case.request.root_id, &options)? + } else { + generate_node(&case.payload.snapshot, &case.request.root_id, &options)? + }; + Ok(format!("\"{}\"", output.tsx)) +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FixtureManifest { + pub schema_version: u32, + pub source: CorpusSource, + pub baseline: CorpusBaseline, + pub counts: CorpusCounts, + pub source_test_files: Vec, + pub files: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct CorpusSource { + pub repository: String, + pub commit: String, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct CorpusBaseline { + pub test_files: usize, + pub passed: usize, + pub failed: usize, + pub snapshots: usize, + pub assertions: usize, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct CorpusCounts { + pub cases: usize, + pub snapshots: usize, + pub ledger_entries: usize, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ManifestFile { + pub path: String, + pub sha256: String, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FixtureLedger { + pub schema_version: u32, + pub entries: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct CoverageRegistry { + pub schema_version: u32, + pub evidence: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct CoverageEvidence { + pub rust_test: String, + pub source_path: String, + pub function: String, + pub coverage: EvidenceCoverage, + pub description: String, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum EvidenceCoverage { + SnapshotParity, + RepresentativeAssertion, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct LedgerEntry { + pub test_id: String, + pub source_file: String, + pub classification: LedgerClassification, + #[serde(default)] + pub fixture_ids: Vec, + pub rust_test: String, + #[serde(default)] + pub rationale: Option, +} + +#[derive(Debug, Clone, Copy, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum LedgerClassification { + RustSnapshot, + RustAssertion, + Contract, + NotPorted, + OutOfScopeWrite, + UpstreamRuntimeOnly, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CorpusSummary { + pub source_files: usize, + pub ledger_entries: usize, + pub cases: usize, + pub snapshots: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CoverageSummary { + pub inventory_entries: usize, + pub snapshot_parity_entries: usize, + pub snapshot_cases: usize, + pub representative_assertion_entries: usize, + pub non_parity_entries: usize, + pub not_ported_entries: usize, +} + +pub fn validate_coverage_registry(root: &Path) -> Result> { + let ledger = + read_json::(&root.join("ledger.json")).map_err(|error| vec![error])?; + let registry = read_json::(&root.join("coverage-registry.json")) + .map_err(|error| vec![error])?; + let mut violations = Vec::new(); + if registry.schema_version != 1 { + violations.push("coverage registry schemaVersion은 1이어야 합니다.".to_owned()); + } + + let repository = root + .parent() + .and_then(Path::parent) + .expect("fixture corpus must live below the repository root"); + let mut evidence_by_test = BTreeMap::new(); + for evidence in ®istry.evidence { + if evidence.rust_test.trim().is_empty() + || evidence.source_path.trim().is_empty() + || evidence.function.trim().is_empty() + || evidence.description.trim().is_empty() + { + violations.push(format!( + "coverage evidence 필드가 비어 있습니다: {}", + evidence.rust_test + )); + continue; + } + if evidence_by_test + .insert(evidence.rust_test.as_str(), evidence) + .is_some() + { + violations.push(format!("중복 coverage evidence: {}", evidence.rust_test)); + } + let relative = Path::new(&evidence.source_path); + if relative.is_absolute() + || relative + .components() + .any(|component| matches!(component, std::path::Component::ParentDir)) + { + violations.push(format!( + "coverage source 경로가 안전하지 않습니다: {}", + evidence.source_path + )); + continue; + } + let source_path = repository.join(relative); + match fs::read_to_string(&source_path) { + Ok(source) => { + let signature = format!("fn {}(", evidence.function); + if let Some(index) = source.find(&signature) { + let prefix = source[..index] + .lines() + .rev() + .take(5) + .collect::>() + .join("\n"); + if !prefix.contains("#[test]") && !prefix.contains("#[tokio::test]") { + violations.push(format!( + "coverage evidence가 실행 test 함수가 아닙니다: {}", + evidence.rust_test + )); + } + } else { + violations.push(format!( + "coverage evidence test symbol이 없습니다: {} -> {}", + evidence.rust_test, evidence.source_path + )); + } + } + Err(error) => violations.push(format!( + "coverage source를 읽을 수 없습니다: {}: {error}", + evidence.source_path + )), + } + } + + let case_files = discover(root.join("cases"), "json", root, &mut violations); + let snapshot_files = discover(root.join("snapshots"), "snap", root, &mut violations); + let mut case_ids = BTreeSet::new(); + for relative in &case_files { + let path = root.join(relative.replace('/', std::path::MAIN_SEPARATOR_STR)); + match load_case(&path) { + Ok(case) => { + case_ids.insert(case.id); + } + Err(error) => violations.push(format!("{relative}: {error}")), + } + } + + let mut snapshot_parity_entries = 0; + let mut representative_assertion_entries = 0; + let mut non_parity_entries = 0; + let mut not_ported_entries = 0; + let mut covered_case_ids = BTreeSet::new(); + for entry in &ledger.entries { + match entry.classification { + LedgerClassification::RustSnapshot => { + snapshot_parity_entries += 1; + covered_case_ids.extend(entry.fixture_ids.iter().cloned()); + match evidence_by_test.get(entry.rust_test.as_str()) { + Some(evidence) if evidence.coverage == EvidenceCoverage::SnapshotParity => {} + _ => violations.push(format!( + "rust_snapshot이 실행 가능한 snapshot parity test를 참조하지 않습니다: {} -> {}", + entry.test_id, entry.rust_test + )), + } + } + LedgerClassification::RustAssertion => { + representative_assertion_entries += 1; + match evidence_by_test.get(entry.rust_test.as_str()) { + Some(evidence) + if evidence.coverage == EvidenceCoverage::RepresentativeAssertion => {} + _ => violations.push(format!( + "rust_assertion이 등록된 대표 Rust test를 참조하지 않습니다: {} -> {}", + entry.test_id, entry.rust_test + )), + } + } + LedgerClassification::NotPorted => { + not_ported_entries += 1; + non_parity_entries += 1; + if entry + .rationale + .as_deref() + .is_none_or(|value| value.trim().is_empty()) + { + violations.push(format!("비-parity 분류 근거가 없습니다: {}", entry.test_id)); + } + } + LedgerClassification::OutOfScopeWrite | LedgerClassification::UpstreamRuntimeOnly => { + non_parity_entries += 1; + if entry + .rationale + .as_deref() + .is_none_or(|value| value.trim().is_empty()) + { + violations.push(format!("비-parity 분류 근거가 없습니다: {}", entry.test_id)); + } + match evidence_by_test.get(entry.rust_test.as_str()) { + Some(evidence) + if evidence.coverage == EvidenceCoverage::RepresentativeAssertion => {} + _ => violations.push(format!( + "비-parity 경계가 등록된 Rust contract를 참조하지 않습니다: {} -> {}", + entry.test_id, entry.rust_test + )), + } + } + LedgerClassification::Contract => violations.push(format!( + "모호한 contract 분류를 실행 evidence 또는 명시적 비-parity로 바꿔야 합니다: {}", + entry.test_id + )), + } + } + + for case_id in case_ids.difference(&covered_case_ids) { + violations.push(format!( + "snapshot parity test에 연결되지 않은 fixture: {case_id}" + )); + } + for case_id in covered_case_ids.difference(&case_ids) { + violations.push(format!( + "존재하지 않는 snapshot fixture coverage: {case_id}" + )); + } + if case_files.len() != 268 || snapshot_files.len() != 268 { + violations.push(format!( + "snapshot parity corpus는 JSON/snapshot 각각 268개여야 합니다: {}/{}", + case_files.len(), + snapshot_files.len() + )); + } + + if violations.is_empty() { + Ok(CoverageSummary { + inventory_entries: ledger.entries.len(), + snapshot_parity_entries, + snapshot_cases: case_ids.len(), + representative_assertion_entries, + non_parity_entries, + not_ported_entries, + }) + } else { + Err(violations) + } +} + +pub fn validate_corpus(root: &Path) -> Result> { + let mut violations = Vec::new(); + let manifest = match read_json::(&root.join("manifest.json")) { + Ok(value) => value, + Err(error) => return Err(vec![error]), + }; + let ledger = match read_json::(&root.join("ledger.json")) { + Ok(value) => value, + Err(error) => return Err(vec![error]), + }; + if manifest.schema_version != 1 || ledger.schema_version != 1 { + violations.push("manifest와 ledger schemaVersion은 1이어야 합니다.".to_owned()); + } + if manifest.source.commit.len() != 40 + || !manifest + .source + .commit + .bytes() + .all(|byte| byte.is_ascii_hexdigit()) + { + violations.push("manifest source.commit이 40자리 git SHA가 아닙니다.".to_owned()); + } + if manifest.baseline.test_files != 54 + || manifest.baseline.passed != 978 + || manifest.baseline.failed != 0 + || manifest.baseline.snapshots != 268 + || manifest.baseline.assertions != 1_974 + { + violations.push("고정 upstream baseline 수치가 일치하지 않습니다.".to_owned()); + } + if manifest.source_test_files.len() != manifest.baseline.test_files { + violations.push("source test file 수가 baseline과 일치하지 않습니다.".to_owned()); + } + duplicate_values( + manifest.source_test_files.iter().map(String::as_str), + "source test file", + &mut violations, + ); + + let case_files = discover(root.join("cases"), "json", root, &mut violations); + let snapshot_files = discover(root.join("snapshots"), "snap", root, &mut violations); + let discovered = case_files + .iter() + .chain(snapshot_files.iter()) + .cloned() + .collect::>(); + let declared = manifest + .files + .iter() + .map(|file| file.path.clone()) + .collect::>(); + for path in discovered.difference(&declared) { + violations.push(format!("manifest에 없는 orphan 파일: {path}")); + } + for path in declared.difference(&discovered) { + violations.push(format!("실제로 존재하지 않는 manifest 파일: {path}")); + } + for file in &manifest.files { + let path = root.join(file.path.replace('/', std::path::MAIN_SEPARATOR_STR)); + match fs::read(&path) { + Ok(bytes) => { + let actual = hex_sha256(&bytes); + if actual != file.sha256 { + violations.push(format!("checksum 불일치: {}", file.path)); + } + } + Err(error) => violations.push(format!("{} 읽기 실패: {error}", file.path)), + } + } + + let mut case_ids = BTreeMap::::new(); + for relative in &case_files { + let path = root.join(relative.replace('/', std::path::MAIN_SEPARATOR_STR)); + match load_case(&path) { + Ok(case) => { + if let Some(first) = case_ids.insert(case.id.clone(), relative.clone()) { + violations.push(format!( + "중복 fixture id '{}': {first}, {relative}", + case.id + )); + } + } + Err(error) => violations.push(format!("{relative}: {error}")), + } + } + + let mut ledger_ids = BTreeSet::new(); + for entry in &ledger.entries { + if !ledger_ids.insert(entry.test_id.as_str()) { + violations.push(format!("중복 ledger test id: {}", entry.test_id)); + } + if entry.source_file.trim().is_empty() || entry.rust_test.trim().is_empty() { + violations.push(format!("ledger 경로가 비어 있습니다: {}", entry.test_id)); + } + for fixture_id in &entry.fixture_ids { + if !case_ids.contains_key(fixture_id) { + violations.push(format!( + "ledger가 없는 fixture를 참조합니다: {} -> {fixture_id}", + entry.test_id + )); + } + } + match entry.classification { + LedgerClassification::RustSnapshot if entry.fixture_ids.is_empty() => { + violations.push(format!( + "rust_snapshot ledger에 fixture가 없습니다: {}", + entry.test_id + )) + } + LedgerClassification::NotPorted + | LedgerClassification::OutOfScopeWrite + | LedgerClassification::UpstreamRuntimeOnly + if entry + .rationale + .as_deref() + .is_none_or(|value| value.trim().is_empty()) => + { + violations.push(format!("분류 근거가 없습니다: {}", entry.test_id)); + } + _ => {} + } + } + + if manifest.counts.cases != case_files.len() + || manifest.counts.snapshots != snapshot_files.len() + || manifest.counts.ledger_entries != ledger.entries.len() + { + violations.push("manifest counts가 발견된 corpus와 일치하지 않습니다.".to_owned()); + } + if ledger.entries.len() != manifest.baseline.passed { + violations + .push("ledger entry 수가 upstream passing test 수와 일치하지 않습니다.".to_owned()); + } + + if violations.is_empty() { + Ok(CorpusSummary { + source_files: manifest.source_test_files.len(), + ledger_entries: ledger.entries.len(), + cases: case_files.len(), + snapshots: snapshot_files.len(), + }) + } else { + Err(violations) + } +} + +fn read_json Deserialize<'de>>(path: &Path) -> Result { + let bytes = fs::read(path).map_err(|error| format!("{}: {error}", path.display()))?; + serde_json::from_slice(&bytes).map_err(|error| format!("{}: {error}", path.display())) +} + +fn discover( + directory: PathBuf, + extension: &str, + root: &Path, + violations: &mut Vec, +) -> Vec { + let mut files = Vec::new(); + discover_inner(&directory, extension, root, &mut files, violations); + files.sort(); + files +} + +fn discover_inner( + directory: &Path, + extension: &str, + root: &Path, + files: &mut Vec, + violations: &mut Vec, +) { + let entries = match fs::read_dir(directory) { + Ok(entries) => entries, + Err(error) => { + violations.push(format!("{}: {error}", directory.display())); + return; + } + }; + for entry in entries.flatten() { + let path = entry.path(); + if path.is_dir() { + discover_inner(&path, extension, root, files, violations); + } else if path.extension().and_then(|value| value.to_str()) == Some(extension) + && let Ok(relative) = path.strip_prefix(root) + { + files.push(relative.to_string_lossy().replace('\\', "/")); + } + } +} + +fn duplicate_values<'a>( + values: impl Iterator, + label: &str, + violations: &mut Vec, +) { + let mut seen = BTreeSet::new(); + for value in values { + if !seen.insert(value) { + violations.push(format!("중복 {label}: {value}")); + } + } +} + +pub fn hex_sha256(bytes: &[u8]) -> String { + let mut canonical = Vec::with_capacity(bytes.len()); + let mut index = 0; + while index < bytes.len() { + if bytes[index] == b'\r' && bytes.get(index + 1) == Some(&b'\n') { + canonical.push(b'\n'); + index += 2; + } else { + canonical.push(bytes[index]); + index += 1; + } + } + Sha256::digest(&canonical) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} diff --git a/crates/devup-mcp-devup-ui/tests/theme.rs b/crates/devup-mcp-devup-ui/tests/theme.rs new file mode 100644 index 0000000..c687184 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/theme.rs @@ -0,0 +1,286 @@ +use devup_mcp_devup_ui::theme::{Completeness, ThemeScope, VariableSnapshot, generate_devup_json}; +use pretty_assertions::assert_eq; +use serde_json::json; + +#[test] +fn maps_variables_modes_aliases_and_styles_to_devup_json() { + let variables: VariableSnapshot = serde_json::from_value(json!({ + "collections": [{ + "id": "collection:1", "name": "Foundation", "defaultModeId": "mode:light", + "modes": [ + {"modeId": "mode:light", "name": "Light"}, + {"modeId": "mode:dark", "name": "Dark Mode"} + ] + }], + "variables": [ + { + "id": "var:primary", "name": "Color/Primary", "resolvedType": "COLOR", + "variableCollectionId": "collection:1", "codeSyntax": {"WEB": "primary"}, + "valuesByMode": { + "mode:light": {"r": 0, "g": 0.4392156863, "b": 0.9529411765, "a": 1}, + "mode:dark": {"r": 0.1960784314, "g": 0.568627451, "b": 1, "a": 1} + } + }, + { + "id": "var:accent", "name": "Color/Accent", "resolvedType": "COLOR", + "variableCollectionId": "collection:1", "codeSyntax": {}, + "valuesByMode": { + "mode:light": {"type": "VARIABLE_ALIAS", "id": "var:primary"}, + "mode:dark": {"type": "VARIABLE_ALIAS", "id": "var:primary"} + } + }, + { + "id": "var:gutter", "name": "Spacing/Gutter", "resolvedType": "FLOAT", + "variableCollectionId": "collection:1", "codeSyntax": {"WEB": "gutter"}, + "valuesByMode": {"mode:light": 16, "mode:dark": 20} + } + ], + "styles": [ + {"id": "style:text", "name": "Heading/H1", "styleType": "TEXT", "value": { + "fontFamily": "Pretendard", "fontSize": "32px", "fontWeight": 700, "lineHeight": 1.3 + }}, + {"id": "style:effect", "name": "Elevation/Card", "styleType": "EFFECT", "value": "0 4px 12px #0000001a"} + ], + "usedRemoteVariables": [], + "localComplete": true, + "usedRemoteComplete": true + })) + .expect("variable snapshot"); + + let output = generate_devup_json(&variables, ThemeScope::File).expect("devup theme"); + assert_eq!(output.completeness, Completeness::FullLocalPlusUsedRemote); + assert_eq!( + output.json, + concat!( + "{\n", + " \"theme\": {\n", + " \"colors\": {\n", + " \"darkMode\": {\n", + " \"accent\": \"#3291ff\",\n", + " \"primary\": \"#3291ff\"\n", + " },\n", + " \"light\": {\n", + " \"accent\": \"#0070f3\",\n", + " \"primary\": \"#0070f3\"\n", + " }\n", + " },\n", + " \"typography\": {\n", + " \"headingH1\": {\n", + " \"fontFamily\": \"Pretendard\",\n", + " \"fontSize\": \"32px\",\n", + " \"fontWeight\": 700,\n", + " \"lineHeight\": 1.3\n", + " }\n", + " },\n", + " \"length\": {\n", + " \"darkMode\": {\n", + " \"gutter\": \"20px\"\n", + " },\n", + " \"light\": {\n", + " \"gutter\": \"16px\"\n", + " }\n", + " },\n", + " \"shadow\": {\n", + " \"default\": {\n", + " \"elevationCard\": \"0 4px 12px #0000001a\"\n", + " }\n", + " }\n", + " }\n", + "}\n" + ) + ); + assert_eq!(output.counts.variables, 3); + assert_eq!(output.counts.styles, 2); +} + +#[test] +fn reports_alias_cycles_instead_of_inventing_values() { + let variables: VariableSnapshot = serde_json::from_value(json!({ + "collections": [{"id": "c", "name": "C", "defaultModeId": "m", "modes": [{"modeId": "m", "name": "Default"}]}], + "variables": [ + {"id": "a", "name": "A", "resolvedType": "COLOR", "variableCollectionId": "c", "valuesByMode": {"m": {"type": "VARIABLE_ALIAS", "id": "b"}}}, + {"id": "b", "name": "B", "resolvedType": "COLOR", "variableCollectionId": "c", "valuesByMode": {"m": {"type": "VARIABLE_ALIAS", "id": "a"}}} + ], + "styles": [], "usedRemoteVariables": [], "localComplete": true, "usedRemoteComplete": true + })) + .unwrap(); + + let output = generate_devup_json(&variables, ThemeScope::File).unwrap(); + assert!( + output + .diagnostics + .iter() + .any(|item| item.code == "DEVUP_THEME_ALIAS_CYCLE") + ); + assert!(!output.json.contains("\"a\"")); + assert!(!output.json.contains("\"b\"")); +} + +#[test] +fn resolves_token_conflicts_deterministically_across_input_orders() { + let first = generate_devup_json(&conflicting_variables(false), ThemeScope::File).unwrap(); + let reversed = generate_devup_json(&conflicting_variables(true), ThemeScope::File).unwrap(); + + assert_eq!(first.json, reversed.json); + assert!(first.json.contains("\"primary\": \"#ff0000\"")); + assert_eq!(first.conflicts, reversed.conflicts); + assert_eq!(first.conflicts.len(), 1); + assert_eq!(first.conflicts[0].token, "primary"); + assert_eq!(first.conflicts[0].mode, "default"); + assert_eq!(first.conflicts[0].winner_variable_id, "var:a"); + assert_eq!( + first.conflicts[0] + .candidates + .iter() + .map(|candidate| candidate.variable_id.as_str()) + .collect::>(), + vec!["var:a", "var:z"] + ); + assert_eq!( + first.conflicts[0].candidates[0].collection_name, + "Foundation" + ); + assert_eq!(first.conflicts[0].candidates[0].raw_name, "Color/Primary"); + assert_eq!(first.conflicts[0].candidates[0].mode_id, "mode:default"); + assert_eq!( + first.conflicts[0].candidates[0].value_hash, + "db5d24235bf240470a890fbfe94cc1cc2a17489e1aa65c9ede395d8be4d0f71a" + ); + assert_eq!( + first.conflicts[0].candidates[1].value_hash, + "904aff52bad2d6d9406b096ad03367bbe25737d47d36eb06f74411bd126f72b9" + ); + assert!( + first + .diagnostics + .iter() + .any(|diagnostic| diagnostic.code == "DEVUP_THEME_TOKEN_CONFLICT") + ); +} + +fn conflicting_variables(reversed: bool) -> VariableSnapshot { + let mut variables = vec![ + json!({ + "id": "var:z", + "name": "Legacy/Primary", + "resolvedType": "COLOR", + "variableCollectionId": "collection:1", + "codeSyntax": {}, + "valuesByMode": {"mode:default": {"r": 0, "g": 0, "b": 1, "a": 1}} + }), + json!({ + "id": "var:a", + "name": "Color/Primary", + "resolvedType": "COLOR", + "variableCollectionId": "collection:1", + "codeSyntax": {}, + "valuesByMode": {"mode:default": {"r": 1, "g": 0, "b": 0, "a": 1}} + }), + ]; + if reversed { + variables.reverse(); + } + serde_json::from_value(json!({ + "collections": [{ + "id": "collection:1", + "name": "Foundation", + "defaultModeId": "mode:default", + "modes": [{"modeId": "mode:default", "name": "Default"}] + }], + "variables": variables, + "styles": [], + "usedRemoteVariables": [], + "localComplete": true, + "usedRemoteComplete": true + })) + .unwrap() +} + +#[test] +fn node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources() { + let snapshot: VariableSnapshot = serde_json::from_value(json!({ + "collections": [{ + "id": "collection:1", "name": "Foundation", "defaultModeId": "mode:default", + "modes": [{"modeId": "mode:default", "name": "Default"}] + }], + "variables": [ + { + "id": "var:primary", "name": "Color/Primary", "resolvedType": "COLOR", + "variableCollectionId": "collection:1", + "valuesByMode": {"mode:default": {"r": 1, "g": 0, "b": 0, "a": 1}} + }, + { + "id": "var:accent", "name": "Color/Accent", "resolvedType": "COLOR", + "variableCollectionId": "collection:1", + "valuesByMode": {"mode:default": {"type": "VARIABLE_ALIAS", "id": "var:primary"}} + }, + { + "id": "var:unused", "name": "Color/Unused", "resolvedType": "COLOR", + "variableCollectionId": "collection:1", + "valuesByMode": {"mode:default": {"r": 0, "g": 0, "b": 1, "a": 1}} + } + ], + "styles": [ + {"id": "style:used", "name": "Body/Used", "styleType": "TEXT", "value": {"fontSize": "16px"}}, + {"id": "style:unused", "name": "Body/Unused", "styleType": "TEXT", "value": {"fontSize": "12px"}} + ], + "usedRemoteVariables": [], + "usedVariableIds": ["var:accent"], + "usedStyleIds": ["style:used"], + "localComplete": true, + "usedRemoteComplete": true + })) + .unwrap(); + + let node = generate_devup_json(&snapshot, ThemeScope::Node).unwrap(); + let file = generate_devup_json(&snapshot, ThemeScope::File).unwrap(); + + assert!(node.json.contains("\"accent\": \"#ff0000\"")); + assert!(node.json.contains("\"primary\": \"#ff0000\"")); + assert!(node.json.contains("\"bodyUsed\"")); + assert!(!node.json.contains("\"unused\"")); + assert!(!node.json.contains("\"bodyUnused\"")); + assert_eq!(node.completeness, Completeness::UsedTokens); + assert!(file.json.contains("\"unused\": \"#0000ff\"")); + assert!(file.json.contains("\"bodyUnused\"")); + assert_eq!(file.completeness, Completeness::FullLocalPlusUsedRemote); +} + +#[test] +fn unresolved_variables_do_not_remove_independent_valid_tokens() { + let snapshot: VariableSnapshot = serde_json::from_value(json!({ + "collections": [{ + "id": "c", "name": "C", "defaultModeId": "m", + "modes": [{"modeId": "m", "name": "Default"}] + }], + "variables": [ + {"id": "a", "name": "A", "resolvedType": "COLOR", "variableCollectionId": "c", "valuesByMode": {"m": {"type": "VARIABLE_ALIAS", "id": "b"}}}, + {"id": "b", "name": "B", "resolvedType": "COLOR", "variableCollectionId": "c", "valuesByMode": {"m": {"type": "VARIABLE_ALIAS", "id": "a"}}}, + {"id": "valid", "name": "Color/Valid", "resolvedType": "COLOR", "variableCollectionId": "c", "valuesByMode": {"m": {"r": 0, "g": 1, "b": 0, "a": 1}}}, + {"id": "missing", "name": "Color/Missing", "resolvedType": "COLOR", "variableCollectionId": "missing-c", "valuesByMode": {"m": {"r": 1, "g": 0, "b": 0, "a": 1}}} + ], + "styles": [], "usedRemoteVariables": [], + "localComplete": true, "usedRemoteComplete": true + })) + .unwrap(); + + let output = generate_devup_json(&snapshot, ThemeScope::File).unwrap(); + + assert!(output.json.contains("\"valid\": \"#00ff00\"")); + assert_eq!( + output + .unresolved_variables + .iter() + .map(|unresolved| ( + unresolved.variable_id.as_str(), + unresolved.mode_id.as_deref(), + unresolved.reason.as_str() + )) + .collect::>(), + vec![ + ("a", Some("m"), "alias-cycle-or-missing-target"), + ("b", Some("m"), "alias-cycle-or-missing-target"), + ("missing", None, "collection-missing") + ] + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/validation.rs b/crates/devup-mcp-devup-ui/tests/validation.rs new file mode 100644 index 0000000..a07227a --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/validation.rs @@ -0,0 +1,35 @@ +use devup_mcp_devup_ui::validation::validate_tsx; +use devup_mcp_figma::ErrorCode; + +#[test] +fn syntax_accepts_nested_typescript_jsx() { + let source = r#" + import { Text, VStack } from "@devup-ui/react"; + export function Proofread(): JSX.Element { + return 본문; + } + "#; + let report = validate_tsx(source).expect("valid TSX"); + assert_eq!(report.byte_len, source.len()); +} + +#[test] +fn syntax_rejects_invalid_tsx_without_echoing_source_text() { + for source in [ + "export function Broken() { return 비밀 본문; }", + "export function Broken() { return 비밀 본문; }", + "export function Broken() { return {비밀 본문 + }; }", + ] { + let error = validate_tsx(source).expect_err("invalid TSX"); + assert_eq!(error.code, ErrorCode::DevupCodegenFailed); + assert!(!error.to_string().contains("비밀 본문")); + assert!( + error.details["errorCount"] + .as_u64() + .is_some_and(|count| count > 0) + ); + assert!(error.details["errors"][0]["start"].as_u64().is_some()); + assert!(error.details["errors"][0]["end"].as_u64().is_some()); + assert_eq!(error.details["errors"][0]["category"], "syntax"); + } +} diff --git a/crates/devup-mcp-devup-ui/tests/wquw_151.rs b/crates/devup-mcp-devup-ui/tests/wquw_151.rs new file mode 100644 index 0000000..30602c1 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/wquw_151.rs @@ -0,0 +1,175 @@ +use devup_mcp_devup_ui::codegen::{CodegenOptions, RootLayout, generate_component}; +use devup_mcp_figma::{ + CollectedPayload, CollectionScope, CollectionStats, FigmaTarget, PayloadCompleteness, Snapshot, + UpstreamResult, +}; +use serde::Deserialize; +use serde_json::{Value, json}; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ActualFigmaFixture { + source: FixtureSource, + snapshot: Snapshot, + resources: UpstreamResult, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct FixtureSource { + file_key: String, + node_id: String, + capture: String, + node_count: usize, +} + +#[test] +fn actual_wquw_151_screen_preserves_children_tokens_and_typography() { + let fixture: ActualFigmaFixture = + serde_json::from_str(include_str!("fixtures/wquw-151-proofread.json")) + .expect("actual WQUW-151 Figma fixture"); + assert_eq!( + fixture.source.capture, + "official Figma MCP use_figma read-only projection" + ); + assert_eq!(fixture.snapshot.nodes.len(), fixture.source.node_count); + assert_eq!(fixture.snapshot.nodes.len(), 144); + + let payload = CollectedPayload { + target: FigmaTarget { + file_key: fixture.source.file_key, + node_id: Some(fixture.source.node_id.clone()), + branch_key: None, + }, + scope: CollectionScope::Node, + metadata: Value::Null, + snapshot: fixture.snapshot, + variables: Some(fixture.resources.clone()), + styles: Some(fixture.resources), + completeness: PayloadCompleteness::UsedTokens, + source_version: None, + stats: CollectionStats::default(), + assets: Vec::new(), + reference_png: None, + }; + let output = generate_component( + &payload.snapshot, + &fixture.source.node_id, + &CodegenOptions { + include_diagnostics: true, + inline_instances: true, + ..CodegenOptions::default() + } + .with_payload_tokens(&payload), + ) + .expect("WQUW-151 DevupUI output"); + + assert!(output.tsx.contains("이야기가 글로")); + assert!(output.tsx.contains("작은 시장, 큰 사랑")); + assert!( + output + .tsx + .contains("학교를 마치고 집으로 돌아오던 늦은 오후였다.") + ); + assert!(output.tsx.contains("[1. 이름]")); + for token in [ + "$backgroundLight", + "$containerBackground", + "$primary", + "$text", + ] { + assert!(output.tsx.contains(token), "missing token {token}"); + } + for typography in ["h3", "body", "bodySemibold"] { + assert!( + output.tsx.contains(&format!("typography=\"{typography}\"")), + "missing typography {typography}" + ); + } + assert!(output.tsx.matches("= 10); + assert!(output.tsx.matches("= 20); + assert!(output.tsx.contains("borderTop=\"solid 1px $border\"")); + assert_eq!( + output.tsx.matches("border=\"solid 1px $border\"").count(), + 1, + "the public-setting card keeps its border, while the footer uses only borderTop" + ); + let source_entry = |node_id: &str, property: &str| { + output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some(node_id) + && entry.property.as_deref() == Some(property) + }) + .expect("WQUW-151 provenance entry") + }; + let heading_typography = source_entry("3879:35520", "textStyleId"); + assert_eq!( + heading_typography.style_id.as_deref(), + Some("S:b2c215baee1a675e5d0bbe9e39c21bf78a39eabc,") + ); + let nested_placeholder = output + .source_map + .entries + .iter() + .find(|entry| { + entry.node_id.as_deref() == Some("3879:35555") + && entry.property.as_deref() == Some("styledTextSegments") + && entry.variable_id.as_deref() == Some("VariableID:98:3276") + }) + .expect("nested placeholder color provenance"); + assert_eq!(nested_placeholder.resolution, "variable-token"); + let footer_border = source_entry("3879:35564", "strokes"); + assert_eq!( + footer_border.variable_id.as_deref(), + Some("VariableID:1:1001") + ); + let source_map_json = serde_json::to_string(&output.source_map).unwrap(); + assert!(!source_map_json.contains("작은 시장")); + assert!(!source_map_json.contains("[1. 이름]")); + assert!(output.fidelity_report.nodes.complete()); + assert!(output.fidelity_report.text.complete()); + assert!(output.fidelity_report.variables.complete()); + assert!(output.fidelity_report.typography.complete()); + assert!(output.fidelity_report.assets.complete()); + assert!(output.fidelity_report.layout.complete()); + assert_eq!(output.fidelity_report.impacts.lossy, 0); + assert_eq!(output.fidelity_report.impacts.failed, 0); + assert_eq!( + output.projection_trace.entries.len(), + payload.snapshot.nodes.len() + ); + + let embedded = generate_component( + &payload.snapshot, + &fixture.source.node_id, + &CodegenOptions { + include_diagnostics: true, + inline_instances: true, + root_layout: RootLayout::Embedded, + ..CodegenOptions::default() + } + .with_payload_tokens(&payload), + ) + .expect("embedded WQUW-151 DevupUI output"); + let embedded_root = component_root_opening(&embedded.tsx); + assert!(!embedded_root.contains("h=\"740px\"")); + assert!(!embedded_root.contains("w=\"360px\"")); + assert!(!embedded_root.contains("pos=\"relative\"")); + assert!(embedded.tsx.contains("bottom=\"0px\"")); + assert!(embedded.tsx.contains("pos=\"absolute\"")); + + insta::assert_snapshot!("wquw_151_proofread_devup_ui", output.tsx); + insta::assert_snapshot!("wquw_151_proofread_devup_ui_embedded", embedded.tsx); + insta::assert_json_snapshot!("wquw_151_proofread_used_tokens", output.used_tokens); + insta::assert_json_snapshot!("wquw_151_proofread_diagnostics", json!(output.diagnostics)); + insta::assert_json_snapshot!("wquw_151_proofread_source_map", output.source_map); +} + +fn component_root_opening(tsx: &str) -> &str { + let start = tsx.find(" <").expect("component root"); + let end = tsx[start..].find('>').expect("root opening close") + start; + &tsx[start..=end] +} diff --git a/crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs b/crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs new file mode 100644 index 0000000..c918c04 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs @@ -0,0 +1,256 @@ +use std::collections::BTreeSet; + +use devup_mcp_devup_ui::codegen::{CodegenOptions, generate_component}; +use devup_mcp_figma::{ + CollectedPayload, CollectionScope, CollectionStats, FigmaTarget, PayloadCompleteness, Snapshot, + SnapshotChunk, UpstreamResult, collect_used_resource_refs, +}; +use serde::Deserialize; +use serde_json::Value; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct SectionFixture { + source: SectionSource, + section: SectionNode, + screen_candidates: Vec, + proofread_target_id: String, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct SectionSource { + file_key: String, + node_id: String, + capture: String, +} + +#[derive(Debug, Deserialize)] +struct SectionNode { + id: String, + name: String, + width: f64, + height: f64, +} + +#[derive(Debug, Deserialize)] +struct ScreenCandidate { + id: String, + name: String, + x: f64, + y: f64, + width: f64, + height: f64, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct FrameFixture { + source: FrameSource, + snapshot: Snapshot, + resources: UpstreamResult, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct FrameSource { + file_key: String, + node_id: String, + capture: String, + node_count: usize, +} + +#[test] +fn actual_section_lists_exactly_ten_screens_in_visual_order() { + let fixture = section_fixture(); + assert_eq!(fixture.source.file_key, "85CgSws3o5XsLv7aAwWJyS"); + assert_eq!(fixture.source.node_id, "4217:7743"); + assert_eq!(fixture.section.id, fixture.source.node_id); + assert_eq!(fixture.section.name, "[FR-026] 본연체"); + assert_eq!( + (fixture.section.width, fixture.section.height), + (4589.0, 2429.0) + ); + assert_eq!(fixture.proofread_target_id, "3879:35518"); + assert_eq!(fixture.screen_candidates.len(), 10); + assert!(fixture.source.capture.contains("read-only")); + + let ids = fixture + .screen_candidates + .iter() + .map(|candidate| candidate.id.as_str()) + .collect::>(); + assert_eq!( + ids, + [ + "3879:36108", + "3879:36059", + "3879:35503", + "3879:35518", + "3879:35569", + "3879:36144", + "3879:35729", + "3879:35887", + "3879:35973", + "3879:35652", + ] + ); + assert!( + fixture + .screen_candidates + .windows(2) + .all(|pair| { (pair[0].y, pair[0].x) <= (pair[1].y, pair[1].x) }) + ); + assert!(fixture.screen_candidates.iter().all(|candidate| { + candidate.width == 360.0 && candidate.height == 740.0 && !candidate.name.is_empty() + })); +} + +#[test] +fn every_actual_frame_is_reachable_and_preserves_text_and_resource_ids() { + for candidate in section_fixture().screen_candidates { + let fixture = frame_fixture(&candidate.id); + assert_eq!(fixture.source.file_key, "85CgSws3o5XsLv7aAwWJyS"); + assert_eq!(fixture.source.node_id, candidate.id); + assert!(fixture.source.capture.contains("read-only")); + assert_eq!(fixture.snapshot.roots, [candidate.id.as_str()]); + assert_eq!(fixture.snapshot.nodes.len(), fixture.source.node_count); + assert!(fixture.snapshot.diagnostics.is_empty()); + + for node in fixture.snapshot.nodes.values() { + for child_id in node.typed_view().child_ids() { + assert!( + fixture.snapshot.nodes.contains_key(child_id), + "{} references missing child {child_id}", + node.id + ); + } + } + + let text_nodes = fixture + .snapshot + .nodes + .values() + .filter(|node| node.node_type == "TEXT") + .collect::>(); + assert!(!text_nodes.is_empty(), "{} has no text", candidate.id); + assert!(text_nodes.iter().all(|node| { + node.typed_view() + .value("styledTextSegments") + .and_then(Value::as_array) + .is_some_and(|segments| !segments.is_empty()) + })); + + let refs = collect_used_resource_refs(&[SnapshotChunk { + file_key: fixture.snapshot.file_key.clone(), + version: fixture.snapshot.version.clone(), + root_ids: fixture.snapshot.roots.clone(), + nodes: fixture.snapshot.nodes.values().cloned().collect(), + diagnostics: fixture.snapshot.diagnostics.clone(), + }]); + let raw = &fixture.resources.raw; + let variable_ids = resource_ids(raw.get("variables")); + let style_ids = resource_ids(raw.get("styles")); + let unresolved_ids = resource_ids(raw.get("unresolved")); + assert!( + refs.variable_ids + .iter() + .all(|id| variable_ids.contains(id) || unresolved_ids.contains(id)), + "{} has unresolved variable references", + candidate.id + ); + assert!( + refs.styles + .iter() + .all(|style| style_ids.contains(&style.id) || unresolved_ids.contains(&style.id)), + "{} has unresolved style references", + candidate.id + ); + } +} + +#[test] +fn every_actual_frame_generates_reviewed_devup_ui() { + for candidate in section_fixture().screen_candidates { + let fixture = frame_fixture(&candidate.id); + let payload = CollectedPayload { + target: FigmaTarget { + file_key: fixture.source.file_key, + node_id: Some(fixture.source.node_id.clone()), + branch_key: None, + }, + scope: CollectionScope::Node, + metadata: Value::Null, + snapshot: fixture.snapshot, + variables: Some(fixture.resources.clone()), + styles: Some(fixture.resources), + completeness: PayloadCompleteness::UsedTokens, + source_version: None, + stats: CollectionStats::default(), + assets: Vec::new(), + reference_png: None, + }; + let output = generate_component( + &payload.snapshot, + &fixture.source.node_id, + &CodegenOptions { + component_name: Some(format!("Wquw151Frame{}", candidate.id.replace(':', ""))), + include_diagnostics: true, + inline_instances: true, + ..CodegenOptions::default() + } + .with_payload_tokens(&payload), + ) + .unwrap_or_else(|error| panic!("{} codegen failed: {error}", candidate.id)); + + assert!(output.tsx.contains("@devup-ui/react")); + assert!(output.tsx.contains("typography=")); + assert!( + !output.tsx.contains(" && "), + "{} leaked an unresolved component property", + candidate.id + ); + assert!(output.source_map.entries.iter().any(|entry| { + entry.node_id.as_deref() == Some(candidate.id.as_str()) + && entry.property.as_deref() == Some("type") + })); + insta::assert_snapshot!( + format!("wquw_151_frame_{}", candidate.id.replace(':', "_")), + output.tsx + ); + } +} + +fn section_fixture() -> SectionFixture { + serde_json::from_str(include_str!( + "../../devup-mcp/tests/fixtures/wquw-151-section.json" + )) + .expect("actual WQUW-151 Section fixture") +} + +fn frame_fixture(node_id: &str) -> FrameFixture { + let source = match node_id { + "3879:35503" => include_str!("fixtures/wquw-151-frames/3879-35503.json"), + "3879:35518" => include_str!("fixtures/wquw-151-frames/3879-35518.json"), + "3879:35569" => include_str!("fixtures/wquw-151-frames/3879-35569.json"), + "3879:35652" => include_str!("fixtures/wquw-151-frames/3879-35652.json"), + "3879:35729" => include_str!("fixtures/wquw-151-frames/3879-35729.json"), + "3879:35887" => include_str!("fixtures/wquw-151-frames/3879-35887.json"), + "3879:35973" => include_str!("fixtures/wquw-151-frames/3879-35973.json"), + "3879:36059" => include_str!("fixtures/wquw-151-frames/3879-36059.json"), + "3879:36108" => include_str!("fixtures/wquw-151-frames/3879-36108.json"), + "3879:36144" => include_str!("fixtures/wquw-151-frames/3879-36144.json"), + _ => panic!("unexpected WQUW-151 frame {node_id}"), + }; + serde_json::from_str(source).expect("actual WQUW-151 frame fixture") +} + +fn resource_ids(value: Option<&Value>) -> BTreeSet { + value + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(|value| value.get("id").and_then(Value::as_str)) + .map(str::to_owned) + .collect() +} diff --git a/crates/devup-mcp-figma/Cargo.toml b/crates/devup-mcp-figma/Cargo.toml new file mode 100644 index 0000000..84b95f9 --- /dev/null +++ b/crates/devup-mcp-figma/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "devup-mcp-figma" +description = "Read-only Figma Remote MCP client, OAuth, and exhaustive snapshots for devup-mcp" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +async-trait.workspace = true +axum.workspace = true +base64.workspace = true +image.workspace = true +keyring.workspace = true +rand.workspace = true +quick-xml.workspace = true +reqwest.workspace = true +rmcp.workspace = true +serde.workspace = true +serde_json.workspace = true +sha2.workspace = true +subtle.workspace = true +tokio.workspace = true +url.workspace = true +unicode-normalization.workspace = true +webbrowser.workspace = true + +[dev-dependencies] +anyhow.workspace = true +tempfile = "3" diff --git a/crates/devup-mcp-figma/src/assets.rs b/crates/devup-mcp-figma/src/assets.rs new file mode 100644 index 0000000..5171401 --- /dev/null +++ b/crates/devup-mcp-figma/src/assets.rs @@ -0,0 +1,376 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use sha2::{Digest, Sha256}; + +use crate::{DevupError, Diagnostic, ErrorCode, Snapshot, UpstreamResult}; + +pub const MAX_ASSET_BYTES: usize = 8 * 1024 * 1024; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum AssetFormat { + Png, + Jpg, + Svg, + Pdf, +} + +impl AssetFormat { + pub fn mime_type(self) -> &'static str { + match self { + Self::Png => "image/png", + Self::Jpg => "image/jpeg", + Self::Svg => "image/svg+xml", + Self::Pdf => "application/pdf", + } + } + + pub fn extension(self) -> &'static str { + match self { + Self::Png => "png", + Self::Jpg => "jpg", + Self::Svg => "svg", + Self::Pdf => "pdf", + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum AssetStatus { + Available, + Exported, + Failed, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AssetRequest { + pub asset_id: String, + pub node_id: String, + pub field: String, + pub image_hash: Option, + pub format: AssetFormat, + pub scale: u8, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AssetSelection { + pub asset_id: String, + pub format: AssetFormat, + pub scale: u8, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AssetManifestEntry { + pub asset_id: String, + pub node_id: String, + pub field: String, + pub source_kind: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub image_hash: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub format: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub scale: Option, + pub status: AssetStatus, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub byte_length: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sha256: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub mime_type: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub data_base64: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub output_path: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_code: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AssetManifest { + pub version: u32, + pub assets: Vec, + pub diagnostics: Vec, +} + +pub fn discover_asset_manifest(snapshot: &Snapshot) -> AssetManifest { + let mut assets = Vec::new(); + for node in snapshot.nodes.values() { + if let Some(fills) = node.typed_view().value("fills").and_then(Value::as_array) { + for (index, fill) in fills.iter().enumerate() { + if fill.get("type").and_then(Value::as_str) != Some("IMAGE") { + continue; + } + let image_hash = fill + .get("imageHash") + .or_else(|| fill.get("imageRef")) + .and_then(Value::as_str) + .map(str::to_owned); + assets.push(AssetManifestEntry { + asset_id: format!("{}:fills:{index}", node.id), + node_id: node.id.clone(), + field: format!("fills/{index}"), + source_kind: "image-fill".to_owned(), + image_hash, + format: None, + scale: None, + status: AssetStatus::Available, + byte_length: None, + sha256: None, + mime_type: None, + data_base64: None, + output_path: None, + error_code: None, + }); + } + } + if matches!( + node.node_type.as_str(), + "VECTOR" | "BOOLEAN_OPERATION" | "STAR" | "LINE" | "ELLIPSE" | "POLYGON" + ) { + assets.push(AssetManifestEntry { + asset_id: format!("{}:node", node.id), + node_id: node.id.clone(), + field: "node".to_owned(), + source_kind: "vector-node".to_owned(), + image_hash: None, + format: None, + scale: None, + status: AssetStatus::Available, + byte_length: None, + sha256: None, + mime_type: None, + data_base64: None, + output_path: None, + error_code: None, + }); + } + } + assets.sort_by(|left, right| left.asset_id.cmp(&right.asset_id)); + AssetManifest { + version: 1, + assets, + diagnostics: Vec::new(), + } +} + +pub fn validate_asset_requests( + snapshot: &Snapshot, + requests: &[AssetRequest], +) -> Result<(), DevupError> { + if requests.len() > 16 { + return Err(invalid("한 번에 export할 asset은 16개 이하여야 합니다.")); + } + let available = discover_asset_manifest(snapshot); + let mut seen = std::collections::BTreeSet::new(); + for request in requests { + if request.scale == 0 || request.scale > 4 || !seen.insert(request.asset_id.as_str()) { + return Err(invalid( + "asset 요청의 scale 또는 중복 ID가 올바르지 않습니다.", + )); + } + let Some(candidate) = available + .assets + .iter() + .find(|asset| asset.asset_id == request.asset_id) + else { + return Err(invalid("요청한 asset이 snapshot에 없습니다.")); + }; + if candidate.node_id != request.node_id + || candidate.field != request.field + || candidate.image_hash != request.image_hash + { + return Err(invalid("asset 요청이 snapshot source와 일치하지 않습니다.")); + } + } + Ok(()) +} + +pub fn resolve_asset_selections( + snapshot: &Snapshot, + selections: &[AssetSelection], +) -> Result, DevupError> { + if selections.len() > 16 { + return Err(invalid("한 번에 export할 asset은 16개 이하여야 합니다.")); + } + let manifest = discover_asset_manifest(snapshot); + let mut seen = std::collections::BTreeSet::new(); + let requests = selections + .iter() + .map(|selection| { + if selection.scale == 0 + || selection.scale > 4 + || !seen.insert(selection.asset_id.as_str()) + { + return Err(invalid( + "asset 선택의 scale 또는 중복 ID가 올바르지 않습니다.", + )); + } + let asset = manifest + .assets + .iter() + .find(|asset| asset.asset_id == selection.asset_id) + .ok_or_else(|| invalid("선택한 asset이 snapshot에 없습니다."))?; + Ok(AssetRequest { + asset_id: asset.asset_id.clone(), + node_id: asset.node_id.clone(), + field: asset.field.clone(), + image_hash: asset.image_hash.clone(), + format: selection.format, + scale: selection.scale, + }) + }) + .collect::, _>>()?; + validate_asset_requests(snapshot, &requests)?; + Ok(requests) +} + +pub fn asset_export_from_result( + result: &UpstreamResult, + file_key: &str, + version: Option<&str>, + request: &AssetRequest, +) -> Result { + let descriptor = find_descriptor(&result.raw) + .ok_or_else(|| invalid("Figma MCP 응답에서 asset descriptor를 찾지 못했습니다."))?; + if descriptor.file_key != file_key + || descriptor.version.as_deref() != version + || descriptor.asset_id != request.asset_id + || descriptor.node_id != request.node_id + || descriptor.field != request.field + || descriptor.image_hash != request.image_hash + || descriptor.format != request.format + || descriptor.scale != request.scale + { + return Err(invalid( + "asset descriptor가 요청 대상 또는 버전과 다릅니다.", + )); + } + let source_kind = if request.image_hash.is_some() { + "image-fill" + } else { + "vector-node" + }; + if descriptor.status == AssetStatus::Failed { + return Ok(AssetManifestEntry { + asset_id: request.asset_id.clone(), + node_id: request.node_id.clone(), + field: request.field.clone(), + source_kind: source_kind.to_owned(), + image_hash: request.image_hash.clone(), + format: Some(request.format), + scale: Some(request.scale), + status: AssetStatus::Failed, + byte_length: None, + sha256: None, + mime_type: None, + data_base64: None, + output_path: None, + error_code: descriptor.error_code, + }); + } + let data = find_binary(&result.raw, request.format.mime_type()) + .ok_or_else(|| invalid("asset export 응답에 요청한 binary가 없습니다."))?; + let bytes = STANDARD + .decode(data.as_bytes()) + .map_err(|_| invalid("asset export binary의 base64가 올바르지 않습니다."))?; + if bytes.is_empty() + || bytes.len() > MAX_ASSET_BYTES + || descriptor.byte_length != Some(bytes.len()) + || descriptor.sha256.as_deref() != Some(sha256_hex(&bytes).as_str()) + { + return Err(invalid( + "asset export binary의 길이 또는 hash가 일치하지 않습니다.", + )); + } + Ok(AssetManifestEntry { + asset_id: request.asset_id.clone(), + node_id: request.node_id.clone(), + field: request.field.clone(), + source_kind: source_kind.to_owned(), + image_hash: request.image_hash.clone(), + format: Some(request.format), + scale: Some(request.scale), + status: AssetStatus::Exported, + byte_length: Some(bytes.len()), + sha256: descriptor.sha256, + mime_type: Some(request.format.mime_type().to_owned()), + data_base64: Some(data), + output_path: None, + error_code: None, + }) +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +struct AssetExportDescriptor { + kind: String, + file_key: String, + version: Option, + asset_id: String, + node_id: String, + field: String, + image_hash: Option, + format: AssetFormat, + scale: u8, + status: AssetStatus, + byte_length: Option, + sha256: Option, + error_code: Option, +} + +fn find_descriptor(value: &Value) -> Option { + if let Ok(descriptor) = serde_json::from_value::(value.clone()) + && descriptor.kind == "devupAssetExport" + { + return Some(descriptor); + } + match value { + Value::Object(object) => object.values().find_map(find_descriptor), + Value::Array(values) => values.iter().find_map(find_descriptor), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|value| find_descriptor(&value)), + _ => None, + } +} + +fn find_binary(value: &Value, mime_type: &str) -> Option { + match value { + Value::Object(object) => { + let observed_mime = object.get("mimeType").and_then(Value::as_str); + if observed_mime == Some(mime_type) + && let Some(data) = object + .get("data") + .or_else(|| object.get("blob")) + .and_then(Value::as_str) + { + return Some(data.to_owned()); + } + object + .values() + .find_map(|value| find_binary(value, mime_type)) + } + Value::Array(values) => values + .iter() + .find_map(|value| find_binary(value, mime_type)), + _ => None, + } +} + +fn sha256_hex(bytes: &[u8]) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +fn invalid(message: &str) -> DevupError { + DevupError::new(ErrorCode::DevupSnapshotUnsupported, message, false) +} diff --git a/crates/devup-mcp-figma/src/collector.rs b/crates/devup-mcp-figma/src/collector.rs new file mode 100644 index 0000000..2db3ec4 --- /dev/null +++ b/crates/devup-mcp-figma/src/collector.rs @@ -0,0 +1,2106 @@ +use std::{ + collections::{BTreeMap, BTreeSet, VecDeque}, + io::Cursor, +}; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use image::{ImageDecoder, ImageError, Limits, codecs::png::PngDecoder}; +use rmcp::model::{CallToolResult, ContentBlock}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; +use sha2::{Digest, Sha256}; + +use crate::large_values::{ + LargeValueResult, descriptors_in_chunk, large_value_from_result, replace_descriptor, +}; +use crate::{ + AssetManifestEntry, AssetRequest, AssetSelection, AssetStatus, BatchLimits, BuiltinScript, + DevupError, ErrorCode, ExploreReadOptions, FigmaTarget, LargeValueAssembler, + LargeValueReadOptions, RawNode, ReadToolCall, ResourceBatch, ResourceScope, ResourceStyleRef, + SearchReadOptions, SectionIndex, SnapshotChunk, SnapshotReadOptions, UnresolvedResource, + UpstreamResult, UsedResourceRefs, asset_export_from_result, build_section_index, + collect_used_resource_refs, decode_fast_multi_snapshot, decode_fast_snapshot, + decode_fast_theme, merge_chunks, + metadata::{MetadataResult, metadata_from_result_for_target}, + plan_batches, resolve_asset_selections, snapshot_chunk_from_result, + variables::{ + VariableBatchResult, VariableCatalog, batch_from_result, catalog_from_result, + merge_used_resource_results, merge_variable_results, + }, +}; + +const LARGE_SUBTREE_THRESHOLD: usize = 200; +const MAX_PENDING_CALLS: usize = 4; +const VARIABLE_BATCH_SIZE: usize = 8; +const STYLE_BATCH_SIZE: usize = 8; +const USED_RESOURCE_BATCH_ITEMS: usize = 64; +const USED_RESOURCE_BATCH_BYTES: usize = 12_000; +// Consumer relations can be huge. Compact, bounded fragments are expanded +// back to the exhaustive shape in Rust without dropping any relation. +const STYLE_CONSUMER_BATCH_SIZE: usize = 320; +const SNAPSHOT_CURSOR_ID: &str = "__DEVUP_SNAPSHOT_CURSOR__"; +const MAX_REFERENCE_PNG_BYTES: usize = 16 * 1024 * 1024; +const MAX_REFERENCE_PNG_BASE64_BYTES: usize = MAX_REFERENCE_PNG_BYTES.div_ceil(3) * 4; +const MAX_REFERENCE_PNG_DIMENSION: u32 = 8_192; +const MAX_REFERENCE_PNG_DECODED_BYTES: usize = 64 * 1024 * 1024; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum CollectionScope { + Node, + Page, + File, +} + +#[derive(Debug, Clone)] +pub struct CollectionRequest { + pub target: FigmaTarget, + pub scope: CollectionScope, + pub resource_scope: ResourceScope, + pub include_context: bool, + pub metadata_only: bool, + pub variables_only: bool, + pub search: Option, + pub explore: Option, + pub section: Option, + pub cached_section_index: Option, + pub asset_selections: Vec, + pub reference_png: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SectionReadOptions { + #[serde(default)] + pub frame_ids: Vec, + #[serde(default)] + pub all_screens: bool, +} + +impl CollectionRequest { + pub fn new(target: FigmaTarget, scope: CollectionScope) -> Self { + Self { + target, + scope, + resource_scope: ResourceScope::None, + include_context: false, + metadata_only: false, + variables_only: false, + search: None, + explore: None, + section: None, + cached_section_index: None, + asset_selections: Vec::new(), + reference_png: false, + } + } +} + +#[derive(Debug, Clone)] +pub struct PlannedCall { + pub id: String, + pub call: ReadToolCall, + pub expected_file_key: String, + pub expected_node_id: Option, +} + +#[derive(Debug, Clone)] +pub struct CollectedParts { + pub target: FigmaTarget, + pub scope: CollectionScope, + pub metadata: Value, + pub snapshot_chunks: Vec, + pub variables: Option, + pub styles: Option, + pub source_version: Option, + pub stats: CollectionStats, + pub assets: Vec, + pub reference_png: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ReferencePng { + pub mime_type: String, + pub data_base64: String, + pub byte_length: usize, + pub sha256: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CollectionStats { + pub figma_tool_calls: usize, + pub transport: String, + pub fallback_used: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fallback_reason: Option, + pub node_count: usize, + pub variable_count: usize, + pub style_count: usize, + pub raw_bytes: usize, + pub wire_bytes: usize, + pub envelope_chunks: usize, +} + +impl Default for CollectionStats { + fn default() -> Self { + Self { + figma_tool_calls: 0, + transport: "legacy-cursor".to_owned(), + fallback_used: false, + fallback_reason: None, + node_count: 0, + variable_count: 0, + style_count: 0, + raw_bytes: 0, + wire_bytes: 0, + envelope_chunks: 0, + } + } +} + +#[derive(Debug, Clone)] +pub enum CollectorStep { + Call(Box), + AwaitingResults, + Complete(Box), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum CallKind { + FastSnapshot, + FastTheme, + Metadata, + PageCatalog, + Snapshot, + VariableCatalog, + VariableBatch, + UsedResourceBatch, + Explore, + SectionIndex, + FastMultiRoot, + LargeValue, + Asset, + Screenshot, +} + +#[derive(Debug, Clone)] +struct PendingCall { + planned: PlannedCall, + kind: CallKind, + order: usize, +} + +#[derive(Debug)] +pub struct CollectorSession { + request: CollectionRequest, + queued: VecDeque, + pending: BTreeMap, + consumed: BTreeSet, + metadata: Option, + metadata_nodes: BTreeMap, + metadata_root_ids: Vec, + root_node_id: Option, + source_version: Option, + snapshot_chunks: BTreeMap, + variable_catalog: Option, + used_resource_refs: Option, + variable_batches: BTreeMap, + variables: Option, + large_values: BTreeMap<(String, String), LargeValueAssembler>, + asset_results: Vec, + assets_scheduled: bool, + reference_png: Option, + reference_png_scheduled: bool, + stats: CollectionStats, + fast_attempted: bool, + section_index: Option, + section_selected_roots: Vec, + fast_multi_resources: Option, + fast_multi_has_large_values: bool, + section_fallback_roots: BTreeSet, + next_id: usize, + completed: bool, +} + +impl CollectorSession { + pub fn new(request: CollectionRequest) -> Self { + let assets_scheduled = request.asset_selections.is_empty(); + let reference_png_scheduled = !request.reference_png; + Self { + request, + queued: VecDeque::new(), + pending: BTreeMap::new(), + consumed: BTreeSet::new(), + metadata: None, + metadata_nodes: BTreeMap::new(), + metadata_root_ids: Vec::new(), + root_node_id: None, + source_version: None, + snapshot_chunks: BTreeMap::new(), + variable_catalog: None, + used_resource_refs: None, + variable_batches: BTreeMap::new(), + variables: None, + large_values: BTreeMap::new(), + asset_results: Vec::new(), + assets_scheduled, + reference_png: None, + reference_png_scheduled, + stats: CollectionStats::default(), + fast_attempted: false, + section_index: None, + section_selected_roots: Vec::new(), + fast_multi_resources: None, + fast_multi_has_large_values: false, + section_fallback_roots: BTreeSet::new(), + next_id: 0, + completed: false, + } + } + + pub fn advance(&mut self) -> Result { + if self.completed { + return Err(invalid_call("완료된 Figma 수집 session입니다.")); + } + if self.section_index.is_none() + && let Some(index) = self.request.cached_section_index.take() + { + self.prepare_cached_section_index(index)?; + return self.advance(); + } + if self.metadata.is_none() && self.pending.is_empty() && self.queued.is_empty() { + if self.request.section.is_some() && self.section_index.is_none() { + let node_id = + self.request.target.node_id.clone().ok_or_else(|| { + invalid_call("Figma Section index에는 node ID가 필요합니다.") + })?; + self.enqueue( + ReadToolCall::section_index(&self.request.target.file_key, &node_id), + Some(node_id), + CallKind::SectionIndex, + ); + return self.advance(); + } + if self.fast_theme_eligible() && !self.fast_attempted { + self.fast_attempted = true; + self.enqueue( + ReadToolCall::fast_theme(&self.request.target.file_key), + None, + CallKind::FastTheme, + ); + return self.advance(); + } + if let Some(options) = self.request.explore.clone() { + let node_id = self.request.target.node_id.clone().ok_or_else(|| { + invalid_call("Figma 주변 화면 탐색에는 node ID가 필요합니다.") + })?; + self.enqueue( + ReadToolCall::explore_snapshot( + &self.request.target.file_key, + &node_id, + options, + ), + Some(node_id), + CallKind::Explore, + ); + return self.advance(); + } + if self.request.search.is_some() { + self.enqueue( + ReadToolCall::page_catalog(&self.request.target.file_key), + None, + CallKind::PageCatalog, + ); + return self.advance(); + } + if self.fast_path_eligible() && !self.fast_attempted { + let node_id = + self.request.target.node_id.clone().ok_or_else(|| { + invalid_call("Figma fast snapshot에는 node ID가 필요합니다.") + })?; + self.fast_attempted = true; + self.enqueue( + ReadToolCall::fast_snapshot(&self.request.target.file_key, &node_id), + Some(node_id), + CallKind::FastSnapshot, + ); + return self.advance(); + } + let node_id = match self.request.scope { + CollectionScope::File => None, + CollectionScope::Node | CollectionScope::Page => { + self.request.target.node_id.as_deref() + } + }; + self.enqueue( + ReadToolCall::metadata(&self.request.target.file_key, node_id), + node_id.map(str::to_owned), + CallKind::Metadata, + ); + } + let pending_limit = if self.request.section.is_some() { + 2 + } else { + MAX_PENDING_CALLS + }; + if self.pending.len() < pending_limit + && let Some(call) = self.queued.pop_front() + { + self.pending.insert(call.planned.id.clone(), call.clone()); + self.stats.figma_tool_calls = self.stats.figma_tool_calls.saturating_add(1); + return Ok(CollectorStep::Call(Box::new(call.planned))); + } + if !self.pending.is_empty() { + return Ok(CollectorStep::AwaitingResults); + } + if self.request.section.is_some() + && !self.section_selected_roots.is_empty() + && self.variables.is_none() + && self.section_fallback_roots.is_empty() + && !self.fast_multi_has_large_values + && let Some(resources) = self.fast_multi_resources.take() + { + self.variables = Some(resources); + } + if self.metadata.is_some() + && !self.assets_scheduled + && !self.snapshot_chunks.is_empty() + && self.queued.is_empty() + { + let snapshot = merge_chunks(self.snapshot_chunks.values().cloned().collect())?; + let requests = resolve_asset_selections(&snapshot, &self.request.asset_selections)?; + self.assets_scheduled = true; + for request in requests { + self.enqueue( + ReadToolCall::asset_export( + &self.request.target.file_key, + self.source_version.clone(), + request.clone(), + ), + Some(request.node_id.clone()), + CallKind::Asset, + ); + } + if !self.queued.is_empty() { + return self.advance(); + } + } + if self.metadata.is_some() + && !self.reference_png_scheduled + && !self.snapshot_chunks.is_empty() + && self.queued.is_empty() + { + let node_id = self.request.target.node_id.clone().ok_or_else(|| { + invalid_call("Figma reference PNG 수집에는 node ID가 필요합니다.") + })?; + self.reference_png_scheduled = true; + self.enqueue( + ReadToolCall::screenshot(&self.request.target.file_key, &node_id), + Some(node_id), + CallKind::Screenshot, + ); + return self.advance(); + } + if self.metadata.is_some() + && self.request.resource_scope == ResourceScope::File + && self.variable_catalog.is_none() + && self.variables.is_none() + && self.queued.is_empty() + { + let node_id = self + .root_node_id + .clone() + .ok_or_else(|| invalid_call("Figma 변수 수집에 사용할 root node ID가 없습니다."))?; + self.enqueue( + ReadToolCall::snapshot( + &self.request.target.file_key, + &node_id, + BuiltinScript::VariableCatalog, + ), + Some(node_id), + CallKind::VariableCatalog, + ); + return self.advance(); + } + if self.metadata.is_some() + && self.request.resource_scope == ResourceScope::File + && self.variable_catalog.is_some() + && self.variables.is_none() + && self.queued.is_empty() + { + let catalog = self + .variable_catalog + .take() + .ok_or_else(|| invalid_call("Figma 변수 catalog가 없습니다."))?; + self.variables = Some(merge_variable_results( + catalog, + std::mem::take(&mut self.variable_batches).into_values(), + )?); + } + if self.metadata.is_some() + && self.request.resource_scope == ResourceScope::Used + && self.used_resource_refs.is_none() + && self.variables.is_none() + && self.queued.is_empty() + { + self.enqueue_used_resource_batches()?; + if !self.queued.is_empty() { + return self.advance(); + } + } + if self.metadata.is_some() + && self.request.resource_scope == ResourceScope::Used + && self.used_resource_refs.is_some() + && self.variables.is_none() + && self.queued.is_empty() + { + let refs = self + .used_resource_refs + .take() + .ok_or_else(|| invalid_call("사용된 Figma 리소스 참조가 없습니다."))?; + let merged = merge_used_resource_results( + &refs, + std::mem::take(&mut self.variable_batches).into_values(), + )?; + self.record_unresolved_diagnostics(&refs, &merged.unresolved); + let mut result = Some(merged.result); + if !self.section_fallback_roots.is_empty() + && !self.fast_multi_has_large_values + && let Some(fast_resources) = self.fast_multi_resources.take() + { + let mut combined = Some(fast_resources); + merge_fast_resources( + &mut combined, + result + .take() + .ok_or_else(|| invalid_call("fallback resource 결과가 없습니다."))?, + )?; + result = combined; + } + self.variables = result; + } + if self.metadata.is_some() && self.queued.is_empty() { + self.completed = true; + let snapshot_chunks = if self.request.metadata_only || self.request.variables_only { + vec![SnapshotChunk { + file_key: self.request.target.file_key.clone(), + version: self.source_version.clone(), + root_ids: std::mem::take(&mut self.metadata_root_ids), + nodes: std::mem::take(&mut self.metadata_nodes) + .into_values() + .collect(), + diagnostics: Vec::new(), + }] + } else { + let chunks = std::mem::take(&mut self.snapshot_chunks) + .into_values() + .collect(); + self.restore_section_visual_order(chunks)? + }; + self.finish_stats(&snapshot_chunks); + return Ok(CollectorStep::Complete(Box::new(CollectedParts { + target: self.request.target.clone(), + scope: self.request.scope, + metadata: self.metadata.take().unwrap_or(Value::Null), + snapshot_chunks, + variables: self.variables.clone(), + styles: self.variables.clone(), + source_version: self.source_version.clone(), + stats: self.stats.clone(), + assets: std::mem::take(&mut self.asset_results), + reference_png: self.reference_png.take(), + }))); + } + Ok(CollectorStep::AwaitingResults) + } + + pub fn accept(&mut self, call_id: &str, result: UpstreamResult) -> Result<(), DevupError> { + let pending = self + .pending + .remove(call_id) + .ok_or_else(|| invalid_call("알 수 없거나 이미 처리한 Figma call ID입니다."))?; + self.consumed.insert(call_id.to_owned()); + match pending.kind { + CallKind::FastSnapshot => { + self.accept_fast_snapshot(&pending.planned, pending.order, result) + } + CallKind::FastTheme => self.accept_fast_theme(result), + CallKind::Metadata => self.accept_metadata(&pending.planned, result), + CallKind::PageCatalog => self.accept_page_catalog(&pending.planned, result), + CallKind::Snapshot => self.accept_snapshot(&pending.planned, pending.order, result), + CallKind::VariableCatalog => self.accept_variable_catalog(result), + CallKind::VariableBatch => { + let batch = batch_from_result(&result)?; + self.enqueue_style_consumer_batches(&batch)?; + self.variable_batches.insert(pending.order, batch); + Ok(()) + } + CallKind::UsedResourceBatch => { + let batch = batch_from_result(&result)?; + self.variable_batches.insert(pending.order, batch); + Ok(()) + } + CallKind::Explore => self.accept_explore(&pending.planned, pending.order, result), + CallKind::SectionIndex => { + self.accept_section_index(&pending.planned, pending.order, result) + } + CallKind::FastMultiRoot => { + self.accept_fast_multi_root(&pending.planned, pending.order, result) + } + CallKind::LargeValue => self.accept_large_value(&pending.planned, result), + CallKind::Asset => self.accept_asset(&pending.planned, result), + CallKind::Screenshot => self.accept_reference_png(&pending.planned, result), + } + } + + pub fn reject(&mut self, call_id: &str, error: &DevupError) -> Result { + let Some(pending) = self.pending.get(call_id) else { + return Err(invalid_call( + "알 수 없거나 이미 처리한 Figma call ID입니다.", + )); + }; + if pending.kind == CallKind::Asset { + let pending = self + .pending + .remove(call_id) + .ok_or_else(|| invalid_call("asset call이 없습니다."))?; + self.consumed.insert(call_id.to_owned()); + let ReadToolCall::AssetExport { request, .. } = pending.planned.call else { + return Err(invalid_call("asset call 형식이 올바르지 않습니다.")); + }; + self.record_asset_failure(*request, "DEVUP_ASSET_EXPORT_FAILED"); + return Ok(true); + } + if pending.kind == CallKind::LargeValue { + let pending = self + .pending + .remove(call_id) + .ok_or_else(|| invalid_call("large value call이 없습니다."))?; + self.consumed.insert(call_id.to_owned()); + let ReadToolCall::LargeValue { options, .. } = pending.planned.call else { + return Err(invalid_call("large value call 형식이 올바르지 않습니다.")); + }; + self.record_large_value_unsupported(&options, "DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM")?; + return Ok(true); + } + if !matches!( + pending.kind, + CallKind::FastSnapshot | CallKind::FastTheme | CallKind::FastMultiRoot + ) { + return Ok(false); + } + if !fast_call_fallback_allowed(error) { + return Ok(false); + } + let pending = self + .pending + .remove(call_id) + .ok_or_else(|| invalid_call("fast call이 없습니다."))?; + self.consumed.insert(call_id.to_owned()); + if pending.kind == CallKind::FastMultiRoot { + self.fallback_multi_root_batch(&pending.planned, fallback_category(error))?; + return Ok(true); + } + self.restart_legacy(fallback_category(error)); + Ok(true) + } + + fn fast_path_eligible(&self) -> bool { + self.request.scope == CollectionScope::Node + && self.request.resource_scope == ResourceScope::Used + && self.request.target.node_id.is_some() + && !self.request.include_context + && !self.request.metadata_only + && !self.request.variables_only + && self.request.search.is_none() + && self.request.explore.is_none() + && self.request.section.is_none() + } + + fn fast_theme_eligible(&self) -> bool { + self.request.scope == CollectionScope::File + && self.request.resource_scope == ResourceScope::File + && self.request.variables_only + && !self.request.metadata_only + && !self.request.include_context + && self.request.search.is_none() + && self.request.explore.is_none() + && self.request.section.is_none() + } + + fn accept_fast_theme(&mut self, result: UpstreamResult) -> Result<(), DevupError> { + let payload = match decode_fast_theme(&result, &self.request.target.file_key) { + Ok(payload) => payload, + Err(error) => { + self.restart_legacy(fallback_category(&error)); + return Ok(()); + } + }; + self.metadata = Some(json!({ + "transport": "png-theme-envelope-v1", + "collectionCount": payload.resources.raw["collections"] + .as_array().map_or(0, Vec::len), + "variableCount": payload.resources.raw["variables"] + .as_array().map_or(0, Vec::len), + "styleCount": payload.resources.raw["styles"] + .as_array().map_or(0, Vec::len) + })); + self.source_version = payload.source_version; + self.stats.transport = "png-theme-envelope-v1".to_owned(); + self.stats.raw_bytes = payload.stats.raw_bytes; + self.stats.wire_bytes = payload.stats.wire_bytes; + self.stats.envelope_chunks = payload.stats.chunk_count; + self.variables = Some(payload.resources); + Ok(()) + } + + fn accept_fast_snapshot( + &mut self, + planned: &PlannedCall, + order: usize, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let payload = match decode_fast_snapshot(&result, &self.request.target) { + Ok(payload) => payload, + Err(error) => { + if let Ok(chunk) = snapshot_chunk_from_result(&result) + && chunk.root_ids.as_slice() + == [self.request.target.node_id.as_deref().unwrap_or_default()] + && chunk.nodes.iter().any(|node| { + node.id == self.request.target.node_id.as_deref().unwrap_or_default() + && node.node_type == "SECTION" + && node.typed_view().value("projectionTruncated").is_some() + }) + { + self.request.section = Some(SectionReadOptions { + frame_ids: Vec::new(), + all_screens: false, + }); + return self.accept_section_index(planned, order, result); + } + self.restart_legacy(fallback_category(&error)); + return Ok(()); + } + }; + let root_id = self + .request + .target + .node_id + .clone() + .ok_or_else(|| invalid_call("Figma fast snapshot에는 node ID가 필요합니다."))?; + self.metadata = Some(json!({ + "transport": "png-envelope-v1", + "rootId": root_id, + "nodeCount": payload.snapshot.nodes.len() + })); + self.root_node_id = Some(root_id); + self.source_version = payload.snapshot.version.clone(); + self.metadata_root_ids = payload.snapshot.root_ids.clone(); + self.stats.transport = "png-envelope-v1".to_owned(); + self.stats.raw_bytes = payload.stats.raw_bytes; + self.stats.wire_bytes = payload.stats.wire_bytes; + self.stats.envelope_chunks = payload.stats.chunk_count; + let has_large_values = !descriptors_in_chunk(&payload.snapshot)?.is_empty(); + self.variables = (!has_large_values).then_some(payload.resources); + self.record_snapshot_chunk(order, payload.snapshot)?; + Ok(()) + } + + fn restart_legacy(&mut self, reason: String) { + self.queued.clear(); + self.pending.clear(); + self.metadata = None; + self.metadata_nodes.clear(); + self.metadata_root_ids.clear(); + self.root_node_id = None; + self.source_version = None; + self.snapshot_chunks.clear(); + self.variable_catalog = None; + self.used_resource_refs = None; + self.variable_batches.clear(); + self.variables = None; + self.large_values.clear(); + self.section_fallback_roots.clear(); + self.asset_results.clear(); + self.assets_scheduled = self.request.asset_selections.is_empty(); + self.reference_png = None; + self.reference_png_scheduled = !self.request.reference_png; + self.stats.transport = "legacy-cursor".to_owned(); + self.stats.fallback_used = true; + self.stats.fallback_reason = Some(reason); + self.stats.node_count = 0; + self.stats.variable_count = 0; + self.stats.style_count = 0; + self.stats.raw_bytes = 0; + self.stats.wire_bytes = 0; + self.stats.envelope_chunks = 0; + } + + fn finish_stats(&mut self, chunks: &[SnapshotChunk]) { + self.stats.node_count = chunks + .iter() + .flat_map(|chunk| chunk.nodes.iter().map(|node| node.id.as_str())) + .collect::>() + .len(); + if let Some(resources) = &self.variables { + self.stats.variable_count = resource_count(&resources.raw, "variables"); + self.stats.style_count = resource_count(&resources.raw, "styles"); + } + } + + fn accept_page_catalog( + &mut self, + planned: &PlannedCall, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let catalog = snapshot_chunk_from_result(&result)?; + if catalog.file_key != planned.expected_file_key { + return Err(invalid_call( + "Figma page catalog의 file key가 요청과 다릅니다.", + )); + } + if catalog.root_ids.is_empty() { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma page catalog가 비어 있습니다.", + false, + )); + } + let options = self + .request + .search + .clone() + .ok_or_else(|| invalid_call("검색 설정 없이 page catalog를 수집했습니다."))?; + self.metadata = Some(result.raw); + self.root_node_id = catalog.root_ids.first().cloned(); + self.source_version = catalog.version.clone(); + self.metadata_root_ids = catalog.root_ids.clone(); + for page in catalog.nodes { + self.metadata_nodes.insert(page.id.clone(), page); + } + for page_id in catalog.root_ids { + self.enqueue( + ReadToolCall::search_snapshot( + &self.request.target.file_key, + &page_id, + options.clone(), + ), + Some(page_id), + CallKind::Snapshot, + ); + } + Ok(()) + } + + fn accept_explore( + &mut self, + planned: &PlannedCall, + order: usize, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let chunk = snapshot_chunk_from_result(&result)?; + if chunk.file_key != planned.expected_file_key { + return Err(invalid_call( + "Figma 탐색 projection의 file key가 요청과 다릅니다.", + )); + } + let expected_node_id = planned + .expected_node_id + .as_deref() + .ok_or_else(|| invalid_call("Figma 탐색 projection의 expected node ID가 없습니다."))?; + if !chunk.nodes.iter().any(|node| node.id == expected_node_id) { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma 탐색 projection에서 anchor node를 찾지 못했습니다.", + false, + )); + } + self.source_version = chunk.version.clone(); + self.root_node_id = Some(expected_node_id.to_owned()); + self.metadata_root_ids = chunk.root_ids.clone(); + self.metadata = Some(result.raw); + self.record_snapshot_chunk(order, chunk)?; + Ok(()) + } + + fn accept_section_index( + &mut self, + planned: &PlannedCall, + order: usize, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let chunk = snapshot_chunk_from_result(&result)?; + if chunk.file_key != planned.expected_file_key { + return Err(invalid_call( + "Figma Section index의 file key가 요청과 다릅니다.", + )); + } + let section_id = planned + .expected_node_id + .as_deref() + .ok_or_else(|| invalid_call("Figma Section index의 node ID가 없습니다."))?; + if chunk.root_ids.as_slice() != [section_id] + || !chunk.nodes.iter().any(|node| node.id == section_id) + { + return Err(invalid_call( + "Figma Section index가 요청한 Section과 일치하지 않습니다.", + )); + } + let snapshot = merge_chunks(vec![chunk.clone()])?; + let index = build_section_index(&snapshot, &self.request.target)?; + let options = self + .request + .section + .clone() + .ok_or_else(|| invalid_call("Section read options가 없습니다."))?; + self.source_version = index.source_version.clone(); + self.root_node_id = Some(section_id.to_owned()); + self.metadata_root_ids = chunk.root_ids.clone(); + self.metadata = Some(json!({ + "transport": "section-index-v1", + "sectionIndex": &index + })); + self.section_index = Some(index.clone()); + + if options.frame_ids.is_empty() && !options.all_screens { + self.request.resource_scope = ResourceScope::None; + self.variables = Some(empty_used_resources()); + self.record_snapshot_chunk(order, chunk)?; + return Ok(()); + } + + let selected = index.select(&options.frame_ids, options.all_screens)?; + let batches = plan_batches(&index, &selected, BatchLimits::default())?; + self.section_selected_roots = selected.clone(); + self.root_node_id = selected.first().cloned(); + self.metadata_root_ids = selected.clone(); + self.metadata = Some(json!({ + "transport": "section-multi-root-v1", + "sectionIndex": &index, + "selectedRootIds": &selected, + "batchCount": batches.len() + })); + for batch in batches { + if batch.oversized { + self.mark_section_legacy("oversized-section-root".to_owned()); + for root_id in batch.root_ids { + self.enqueue_section_legacy_root(root_id); + } + } else { + self.enqueue( + ReadToolCall::multi_root_snapshot( + &self.request.target.file_key, + section_id, + batch.root_ids, + ), + Some(section_id.to_owned()), + CallKind::FastMultiRoot, + ); + } + } + Ok(()) + } + + fn prepare_cached_section_index(&mut self, index: SectionIndex) -> Result<(), DevupError> { + if index.file_key != self.request.target.file_key + || self.request.target.node_id.as_deref() != Some(index.section.node_id.as_str()) + { + return Err(invalid_call( + "cached Section index가 요청한 Section과 일치하지 않습니다.", + )); + } + let options = self + .request + .section + .clone() + .ok_or_else(|| invalid_call("cached Section index에 선택 설정이 없습니다."))?; + let selected = index.select(&options.frame_ids, options.all_screens)?; + let batches = plan_batches(&index, &selected, BatchLimits::default())?; + self.source_version = index.source_version.clone(); + self.section_selected_roots = selected.clone(); + self.root_node_id = selected.first().cloned(); + self.metadata_root_ids = selected.clone(); + self.metadata = Some(json!({ + "transport": "section-multi-root-v1", + "sectionIndex": &index, + "selectedRootIds": &selected, + "batchCount": batches.len(), + "indexCacheHit": true + })); + self.section_index = Some(index); + let section_id = self + .request + .target + .node_id + .clone() + .ok_or_else(|| invalid_call("cached Section index의 Section ID가 없습니다."))?; + for batch in batches { + if batch.oversized { + self.mark_section_legacy("oversized-section-root".to_owned()); + for root_id in batch.root_ids { + self.enqueue_section_legacy_root(root_id); + } + } else { + self.enqueue( + ReadToolCall::multi_root_snapshot( + &self.request.target.file_key, + §ion_id, + batch.root_ids, + ), + Some(section_id.clone()), + CallKind::FastMultiRoot, + ); + } + } + Ok(()) + } + + fn accept_fast_multi_root( + &mut self, + planned: &PlannedCall, + order: usize, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let ReadToolCall::Snapshot { + script: BuiltinScript::MultiRootSnapshotEnvelope, + root_ids: Some(root_ids), + .. + } = &planned.call + else { + return Err(invalid_call( + "multi-root snapshot call 형식이 올바르지 않습니다.", + )); + }; + let payload = match decode_fast_multi_snapshot(&result, &self.request.target, root_ids) { + Ok(payload) => payload, + Err(error) if fast_call_fallback_allowed(&error) => { + self.fallback_multi_root_batch(planned, fallback_category(&error))?; + return Ok(()); + } + Err(error) => return Err(error), + }; + if let (Some(existing), Some(incoming)) = (&self.source_version, &payload.snapshot.version) + && existing != incoming + { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "multi-root 수집 중 Figma 파일 버전이 변경되었습니다.", + true, + )); + } + if payload.snapshot.version.is_some() { + self.source_version = payload.snapshot.version.clone(); + } + self.fast_multi_has_large_values |= !descriptors_in_chunk(&payload.snapshot)?.is_empty(); + merge_fast_resources(&mut self.fast_multi_resources, payload.resources)?; + self.stats.transport = if self.section_fallback_roots.is_empty() { + "png-multi-root-envelope-v1" + } else { + "hybrid-multi-root-cursor" + } + .to_owned(); + self.stats.raw_bytes = self.stats.raw_bytes.saturating_add(payload.stats.raw_bytes); + self.stats.wire_bytes = self + .stats + .wire_bytes + .saturating_add(payload.stats.wire_bytes); + self.stats.envelope_chunks = self + .stats + .envelope_chunks + .saturating_add(payload.stats.chunk_count); + self.record_snapshot_chunk(order, payload.snapshot)?; + Ok(()) + } + + fn fallback_multi_root_batch( + &mut self, + planned: &PlannedCall, + reason: String, + ) -> Result<(), DevupError> { + let ReadToolCall::Snapshot { + script: BuiltinScript::MultiRootSnapshotEnvelope, + root_ids: Some(root_ids), + .. + } = &planned.call + else { + return Err(invalid_call( + "multi-root fallback call 형식이 올바르지 않습니다.", + )); + }; + if root_ids.is_empty() { + return Err(invalid_call( + "multi-root fallback에 선택된 root가 없습니다.", + )); + } + self.mark_section_legacy(reason); + for root_id in root_ids { + self.enqueue_section_legacy_root(root_id.clone()); + } + Ok(()) + } + + fn mark_section_legacy(&mut self, reason: String) { + self.stats.transport = if self.fast_multi_resources.is_some() { + "hybrid-multi-root-cursor" + } else { + "legacy-multi-root-cursor" + } + .to_owned(); + self.stats.fallback_used = true; + self.stats.fallback_reason.get_or_insert(reason); + } + + fn enqueue_section_legacy_root(&mut self, root_id: String) { + if !self.section_fallback_roots.insert(root_id.clone()) { + return; + } + self.enqueue( + ReadToolCall::snapshot( + &self.request.target.file_key, + &root_id, + BuiltinScript::NodeSnapshot, + ), + Some(root_id), + CallKind::Snapshot, + ); + } + + fn restore_section_visual_order( + &self, + chunks: Vec, + ) -> Result, DevupError> { + if self.section_selected_roots.is_empty() || chunks.is_empty() { + return Ok(chunks); + } + let snapshot = merge_chunks(chunks)?; + let observed = snapshot.roots.iter().collect::>(); + if self + .section_selected_roots + .iter() + .any(|root_id| !observed.contains(root_id)) + { + return Err(invalid_call( + "Section snapshot에 선택된 root가 모두 포함되지 않았습니다.", + )); + } + Ok(vec![SnapshotChunk { + file_key: snapshot.file_key, + version: snapshot.version, + root_ids: self.section_selected_roots.clone(), + nodes: snapshot.nodes.into_values().collect(), + diagnostics: snapshot.diagnostics, + }]) + } + + fn record_snapshot_chunk( + &mut self, + order: usize, + chunk: SnapshotChunk, + ) -> Result<(), DevupError> { + let descriptors = descriptors_in_chunk(&chunk)?; + let version = chunk.version.clone(); + self.snapshot_chunks.insert(order, chunk); + for descriptor in descriptors { + let key = (descriptor.node_id.clone(), descriptor.field.clone()); + if self.large_values.contains_key(&key) { + return Err(invalid_call( + "동일한 Figma large value descriptor가 중복되었습니다.", + )); + } + let options = LargeValueReadOptions::from_descriptor( + &descriptor, + version.clone(), + descriptor.cursor.next_offset, + ); + self.large_values.insert( + key, + LargeValueAssembler::new( + self.request.target.file_key.clone(), + version.clone(), + descriptor, + )?, + ); + self.enqueue( + ReadToolCall::large_value(&self.request.target.file_key, options.clone()), + Some(options.node_id), + CallKind::LargeValue, + ); + } + Ok(()) + } + + fn accept_large_value( + &mut self, + planned: &PlannedCall, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let ReadToolCall::LargeValue { options, .. } = &planned.call else { + return Err(invalid_call("large value call 형식이 올바르지 않습니다.")); + }; + let result = large_value_from_result(&result)?; + if let LargeValueResult::Unsupported(unsupported) = result { + if unsupported.file_key != planned.expected_file_key + || unsupported.version != options.version + || unsupported.node_id != options.node_id + || unsupported.field != options.field + || unsupported.byte_length != options.byte_length + || unsupported.sha256 != options.sha256 + || unsupported.error_code != "DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM" + { + return Err(invalid_call( + "large value unsupported 응답이 요청과 일치하지 않습니다.", + )); + } + return self.record_large_value_unsupported(options, &unsupported.error_code); + } + let LargeValueResult::Fragment(fragment) = result else { + unreachable!() + }; + if fragment.offset != options.offset { + return Err(invalid_call( + "large value fragment offset이 요청과 일치하지 않습니다.", + )); + } + let key = (options.node_id.clone(), options.field.clone()); + let next_offset = fragment.next_offset; + let complete = fragment.complete; + let assembler = self + .large_values + .get_mut(&key) + .ok_or_else(|| invalid_call("large value assembler가 없습니다."))?; + assembler.push(fragment)?; + if complete { + let assembler = self + .large_values + .remove(&key) + .ok_or_else(|| invalid_call("large value assembler가 없습니다."))?; + let descriptor = assembler.descriptor().clone(); + let value = assembler.finish()?; + replace_descriptor(&mut self.snapshot_chunks, &descriptor, value)?; + } else { + if next_offset <= options.offset { + return Err(invalid_call("large value cursor가 진행되지 않았습니다.")); + } + let descriptor = assembler.descriptor().clone(); + let next = LargeValueReadOptions::from_descriptor( + &descriptor, + options.version.clone(), + next_offset, + ); + self.enqueue( + ReadToolCall::large_value(&self.request.target.file_key, next.clone()), + Some(next.node_id), + CallKind::LargeValue, + ); + } + Ok(()) + } + + fn record_large_value_unsupported( + &mut self, + options: &LargeValueReadOptions, + error_code: &str, + ) -> Result<(), DevupError> { + let key = (options.node_id.clone(), options.field.clone()); + let assembler = self + .large_values + .remove(&key) + .ok_or_else(|| invalid_call("large value assembler가 없습니다."))?; + let descriptor = assembler.descriptor().clone(); + replace_descriptor( + &mut self.snapshot_chunks, + &descriptor, + json!({ + "$truncated": "unsupported-by-upstream", + "byteLength": descriptor.byte_length + }), + )?; + if let Some(chunk) = self + .snapshot_chunks + .values_mut() + .find(|chunk| chunk.nodes.iter().any(|node| node.id == descriptor.node_id)) + && let Some(node) = chunk + .nodes + .iter_mut() + .find(|node| node.id == descriptor.node_id) + { + node.field_errors + .insert(descriptor.field.clone(), error_code.to_owned()); + chunk.diagnostics.push(crate::Diagnostic { + code: error_code.to_owned(), + message: + "Figma upstream에서 큰 필드를 다시 읽을 수 없어 명시적 marker를 유지했습니다." + .to_owned(), + node_id: Some(descriptor.node_id), + severity: Some(crate::DiagnosticSeverity::Warning), + property: Some(descriptor.field), + fallback: Some("unsupported-by-upstream".to_owned()), + recoverable: Some(false), + ..crate::Diagnostic::default() + }); + } + Ok(()) + } + + fn accept_asset( + &mut self, + planned: &PlannedCall, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let ReadToolCall::AssetExport { + version, request, .. + } = &planned.call + else { + return Err(invalid_call("asset call 형식이 올바르지 않습니다.")); + }; + let exported = asset_export_from_result( + &result, + &planned.expected_file_key, + version.as_deref(), + request, + )?; + if exported.status == AssetStatus::Failed { + let error_code = exported + .error_code + .clone() + .unwrap_or_else(|| "DEVUP_ASSET_EXPORT_FAILED".to_owned()); + self.record_asset_diagnostic(request, &error_code); + } + self.asset_results.push(exported); + Ok(()) + } + + fn accept_reference_png( + &mut self, + planned: &PlannedCall, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let ReadToolCall::Screenshot { file_key, node_id } = &planned.call else { + return Err(invalid_call("reference PNG call 형식이 올바르지 않습니다.")); + }; + if file_key != &planned.expected_file_key + || planned.expected_node_id.as_deref() != Some(node_id.as_str()) + { + return Err(invalid_call( + "reference PNG call의 Figma 대상이 요청과 다릅니다.", + )); + } + let data_base64 = take_single_png_data(result.raw)?; + if data_base64.len() > MAX_REFERENCE_PNG_BASE64_BYTES { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma reference PNG가 허용 크기를 초과했습니다.", + false, + )); + } + let bytes = STANDARD + .decode(data_base64.as_bytes()) + .map_err(|_| invalid_call("Figma reference PNG의 base64가 올바르지 않습니다."))?; + if bytes.is_empty() || bytes.len() > MAX_REFERENCE_PNG_BYTES { + return Err(invalid_call( + "Figma reference PNG의 형식 또는 크기가 올바르지 않습니다.", + )); + } + validate_reference_png(&bytes)?; + self.reference_png = Some(ReferencePng { + mime_type: "image/png".to_owned(), + data_base64, + byte_length: bytes.len(), + sha256: Sha256::digest(&bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect(), + }); + Ok(()) + } + + fn record_asset_failure(&mut self, request: AssetRequest, error_code: &str) { + self.record_asset_diagnostic(&request, error_code); + self.asset_results.push(AssetManifestEntry { + asset_id: request.asset_id, + node_id: request.node_id, + field: request.field, + source_kind: if request.image_hash.is_some() { + "image-fill".to_owned() + } else { + "vector-node".to_owned() + }, + image_hash: request.image_hash, + format: Some(request.format), + scale: Some(request.scale), + status: AssetStatus::Failed, + byte_length: None, + sha256: None, + mime_type: None, + data_base64: None, + output_path: None, + error_code: Some(error_code.to_owned()), + }); + } + + fn record_asset_diagnostic(&mut self, request: &AssetRequest, error_code: &str) { + if let Some(chunk) = self + .snapshot_chunks + .values_mut() + .find(|chunk| chunk.nodes.iter().any(|node| node.id == request.node_id)) + { + chunk.diagnostics.push(crate::Diagnostic { + code: error_code.to_owned(), + message: "요청한 Figma asset을 export하지 못해 layout 출력은 유지했습니다." + .to_owned(), + node_id: Some(request.node_id.clone()), + severity: Some(crate::DiagnosticSeverity::Warning), + property: Some(request.field.clone()), + resource_kind: Some("asset".to_owned()), + resource_id: Some(request.asset_id.clone()), + fallback: Some("layout-only".to_owned()), + recoverable: Some(true), + ..crate::Diagnostic::default() + }); + } + } + + fn accept_metadata( + &mut self, + planned: &PlannedCall, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let metadata = metadata_from_result_for_target( + &result, + &self.request.target.file_key, + planned.expected_node_id.as_deref(), + )?; + if let MetadataResult::TopLevelPages(pages) = metadata { + if planned.expected_node_id.is_some() { + return Err(invalid_call( + "page metadata 요청에 top-level page 목록이 반환되었습니다.", + )); + } + self.record_metadata(result.raw); + self.root_node_id = pages.first().map(|page| page.id.clone()); + for page in &pages { + self.record_metadata_node(page); + if !self.metadata_root_ids.contains(&page.id) { + self.metadata_root_ids.push(page.id.clone()); + } + } + if let Some(options) = self.request.search.clone() { + for page in pages { + self.enqueue( + ReadToolCall::search_snapshot( + &self.request.target.file_key, + &page.id, + options.clone(), + ), + Some(page.id), + CallKind::Snapshot, + ); + } + return Ok(()); + } + if self.request.variables_only { + return Ok(()); + } + for page in pages { + self.enqueue( + ReadToolCall::metadata(&self.request.target.file_key, Some(&page.id)), + Some(page.id), + CallKind::Metadata, + ); + } + return Ok(()); + } + let MetadataResult::Document(document) = metadata else { + unreachable!("top-level page metadata is handled above") + }; + if document.file_key != self.request.target.file_key { + return Err(invalid_call("Figma metadata의 file key가 요청과 다릅니다.")); + } + if let (Some(existing), Some(incoming)) = (&self.source_version, &document.version) + && existing != incoming + { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "metadata 수집 중 Figma 파일 버전이 변경되었습니다.", + true, + )); + } + if document.version.is_some() { + self.source_version = document.version.clone(); + } + if self.root_node_id.is_none() { + self.root_node_id = Some(document.root_id.clone()); + } + if !self.metadata_root_ids.contains(&document.root_id) { + self.metadata_root_ids.push(document.root_id.clone()); + } + for node in &document.nodes { + self.record_metadata_node(node); + } + self.record_metadata(result.raw); + let root = document.root().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma metadata에서 대상 node를 찾지 못했습니다.", + false, + ) + })?; + if let Some(options) = self.request.search.clone() { + self.enqueue( + ReadToolCall::search_snapshot(&self.request.target.file_key, &root.id, options), + Some(root.id.clone()), + CallKind::Snapshot, + ); + return Ok(()); + } + if self.request.metadata_only || self.request.variables_only { + return Ok(()); + } + let split = !root.children_ids.is_empty() + && (root.descendant_count > LARGE_SUBTREE_THRESHOLD + || matches!( + self.request.scope, + CollectionScope::Page | CollectionScope::File + )); + let targets = if split { + root.children_ids.clone() + } else { + vec![root.id.clone()] + }; + for node_id in targets { + self.enqueue( + ReadToolCall::snapshot( + &self.request.target.file_key, + &node_id, + BuiltinScript::NodeSnapshot, + ), + Some(node_id), + CallKind::Snapshot, + ); + } + Ok(()) + } + + fn record_metadata(&mut self, value: Value) { + self.metadata = Some(match self.metadata.take() { + None => value, + Some(Value::Array(mut values)) => { + values.push(value); + Value::Array(values) + } + Some(existing) => Value::Array(vec![existing, value]), + }); + } + + fn record_metadata_node(&mut self, node: &crate::metadata::MetadataNode) { + let mut fields = Map::new(); + if let Some(name) = &node.name { + fields.insert("name".to_owned(), Value::String(name.clone())); + } + fields.insert( + "childrenIds".to_owned(), + Value::Array( + node.children_ids + .iter() + .cloned() + .map(Value::String) + .collect(), + ), + ); + fields.insert( + "descendantCount".to_owned(), + Value::from(node.descendant_count), + ); + self.metadata_nodes.insert( + node.id.clone(), + RawNode { + id: node.id.clone(), + node_type: node.node_type.clone(), + fields, + extra: Map::new(), + field_errors: BTreeMap::new(), + }, + ); + } + + fn accept_snapshot( + &mut self, + planned: &PlannedCall, + order: usize, + result: UpstreamResult, + ) -> Result<(), DevupError> { + let mut chunk = snapshot_chunk_from_result(&result)?; + if chunk.file_key != planned.expected_file_key { + return Err(invalid_call("Figma snapshot의 file key가 요청과 다릅니다.")); + } + if chunk.version != self.source_version { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma 파일 버전이 변경되었습니다.", + true, + )); + } + let pagination = match &planned.call { + ReadToolCall::Snapshot { + script: BuiltinScript::NodeSnapshot, + snapshot: Some(options), + .. + } => Some(options.clone()), + _ => None, + }; + if let Some(options) = pagination + && let Some(cursor) = take_snapshot_cursor(&mut chunk)? + { + let expected_next = options + .offset + .checked_add(chunk.nodes.len()) + .ok_or_else(|| invalid_call("Figma snapshot cursor offset이 넘쳤습니다."))?; + if cursor.next_offset != expected_next || cursor.next_offset > cursor.total_nodes { + return Err(invalid_call( + "Figma snapshot cursor가 수집한 node 범위와 일치하지 않습니다.", + )); + } + if cursor.complete != (cursor.next_offset >= cursor.total_nodes) { + return Err(invalid_call( + "Figma snapshot cursor의 완료 상태가 node 수와 일치하지 않습니다.", + )); + } + if !cursor.complete { + if chunk.nodes.is_empty() { + return Err(invalid_call("Figma snapshot cursor가 진행되지 않았습니다.")); + } + let node_id = planned.expected_node_id.clone().ok_or_else(|| { + invalid_call("Figma snapshot cursor의 root node ID가 없습니다.") + })?; + self.enqueue( + ReadToolCall::snapshot_chunk( + &self.request.target.file_key, + &node_id, + SnapshotReadOptions { + offset: cursor.next_offset, + ..options + }, + ), + Some(node_id), + CallKind::Snapshot, + ); + } + } + self.record_snapshot_chunk(order, chunk)?; + Ok(()) + } + + fn accept_variable_catalog(&mut self, result: UpstreamResult) -> Result<(), DevupError> { + let catalog = catalog_from_result(&result)?; + let node_id = self + .root_node_id + .clone() + .ok_or_else(|| invalid_call("Figma 변수 batch에 사용할 root node ID가 없습니다."))?; + for variable_ids in catalog.variable_ids.chunks(VARIABLE_BATCH_SIZE) { + self.enqueue( + ReadToolCall::resource_batch( + &self.request.target.file_key, + &node_id, + ResourceBatch { + variable_ids: variable_ids.to_vec(), + styles: Vec::new(), + }, + ), + Some(node_id.clone()), + CallKind::VariableBatch, + ); + } + for styles in catalog.styles.chunks(STYLE_BATCH_SIZE) { + self.enqueue( + ReadToolCall::resource_batch( + &self.request.target.file_key, + &node_id, + ResourceBatch { + variable_ids: Vec::new(), + styles: styles.to_vec(), + }, + ), + Some(node_id.clone()), + CallKind::VariableBatch, + ); + } + self.variable_catalog = Some(catalog); + Ok(()) + } + + fn enqueue_used_resource_batches(&mut self) -> Result<(), DevupError> { + let chunks = self + .snapshot_chunks + .values() + .filter(|chunk| { + self.section_fallback_roots.is_empty() + || self.fast_multi_resources.is_none() + || self.fast_multi_has_large_values + || chunk + .root_ids + .iter() + .any(|root_id| self.section_fallback_roots.contains(root_id)) + }) + .cloned() + .collect::>(); + let refs = collect_used_resource_refs(&chunks); + let node_id = self.root_node_id.clone().ok_or_else(|| { + invalid_call("사용된 Figma 리소스 batch에 사용할 root node ID가 없습니다.") + })?; + for batch in used_resource_batches(&refs)? { + self.enqueue( + ReadToolCall::used_resources(&self.request.target.file_key, &node_id, batch), + Some(node_id.clone()), + CallKind::UsedResourceBatch, + ); + } + self.used_resource_refs = Some(refs); + Ok(()) + } + + fn record_unresolved_diagnostics( + &mut self, + refs: &UsedResourceRefs, + unresolved: &[UnresolvedResource], + ) { + let unresolved = unresolved + .iter() + .map(|resource| (resource.kind, resource.id.as_str())) + .collect::>(); + for occurrence in &refs.occurrences { + if !unresolved.contains(&(occurrence.resource_kind, occurrence.resource_id.as_str())) { + continue; + } + let diagnostic = crate::Diagnostic { + code: "DEVUP_RESOURCE_UNRESOLVED".to_owned(), + message: format!( + "Figma 리소스를 확인할 수 없어 raw 값으로 대체했습니다: field={}, resourceId={}", + occurrence.field, occurrence.resource_id + ), + node_id: Some(occurrence.node_id.clone()), + severity: Some(crate::DiagnosticSeverity::Warning), + property: Some(occurrence.field.clone()), + resource_kind: Some( + match occurrence.resource_kind { + crate::ResourceKind::Variable => "variable", + crate::ResourceKind::Style => "style", + } + .to_owned(), + ), + resource_id: Some(occurrence.resource_id.clone()), + fallback: Some("raw-value".to_owned()), + recoverable: Some(true), + ..crate::Diagnostic::default() + }; + if let Some(chunk) = self + .snapshot_chunks + .values_mut() + .find(|chunk| chunk.nodes.iter().any(|node| node.id == occurrence.node_id)) + { + chunk.diagnostics.push(diagnostic); + } + } + } + + fn enqueue_style_consumer_batches( + &mut self, + batch: &VariableBatchResult, + ) -> Result<(), DevupError> { + let node_id = self.root_node_id.clone().ok_or_else(|| { + invalid_call("Figma style consumer 수집에 사용할 root node ID가 없습니다.") + })?; + for style in &batch.styles { + let Some(object) = style.as_object() else { + return Err(invalid_call("Figma style batch 형식이 올바르지 않습니다.")); + }; + let Some(consumer_count) = object.get("$consumerCount").and_then(Value::as_u64) else { + continue; + }; + let id = object + .get("id") + .and_then(Value::as_str) + .ok_or_else(|| invalid_call("Figma style ID가 없습니다."))?; + let style_type = object + .get("styleType") + .and_then(Value::as_str) + .ok_or_else(|| invalid_call("Figma style type이 없습니다."))?; + for start in (0..consumer_count as usize).step_by(STYLE_CONSUMER_BATCH_SIZE) { + let end = (start + STYLE_CONSUMER_BATCH_SIZE).min(consumer_count as usize); + self.enqueue( + ReadToolCall::resource_batch( + &self.request.target.file_key, + &node_id, + ResourceBatch { + variable_ids: Vec::new(), + styles: vec![ResourceStyleRef { + id: id.to_owned(), + style_type: style_type.to_owned(), + consumer_start: Some(start), + consumer_end: Some(end), + }], + }, + ), + Some(node_id.clone()), + CallKind::VariableBatch, + ); + } + } + Ok(()) + } + + fn enqueue(&mut self, call: ReadToolCall, expected_node_id: Option, kind: CallKind) { + let order = self.next_id; + let id = format!("call-{order}"); + self.next_id += 1; + self.queued.push_back(PendingCall { + planned: PlannedCall { + id, + call, + expected_file_key: self.request.target.file_key.clone(), + expected_node_id, + }, + kind, + order, + }); + } +} + +fn take_single_png_data(value: Value) -> Result { + let result = serde_json::from_value::(value) + .map_err(|_| invalid_call("Figma screenshot 응답 형식이 올바르지 않습니다."))?; + if result.is_error == Some(true) || result.content.len() != 1 { + return Err(invalid_call( + "Figma screenshot 응답에는 image/png content가 정확히 하나 있어야 합니다.", + )); + } + let content = result + .content + .into_iter() + .next() + .ok_or_else(|| invalid_call("Figma screenshot 응답에 image/png content가 없습니다."))?; + let ContentBlock::Image(image) = content else { + return Err(invalid_call( + "Figma screenshot 응답에는 image/png content가 정확히 하나 있어야 합니다.", + )); + }; + if image.mime_type != "image/png" { + return Err(invalid_call( + "Figma screenshot 응답의 MIME 형식이 image/png가 아닙니다.", + )); + } + Ok(image.data) +} + +fn validate_reference_png(bytes: &[u8]) -> Result<(), DevupError> { + let mut limits = Limits::default(); + limits.max_image_width = Some(MAX_REFERENCE_PNG_DIMENSION); + limits.max_image_height = Some(MAX_REFERENCE_PNG_DIMENSION); + limits.max_alloc = Some(MAX_REFERENCE_PNG_DECODED_BYTES as u64); + let decoder = + PngDecoder::with_limits(Cursor::new(bytes), limits).map_err(reference_png_decode_error)?; + let (width, height) = decoder.dimensions(); + let decoded_bytes = usize::try_from(decoder.total_bytes()).map_err(|_| { + DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma reference PNG의 decoded 크기가 허용 범위를 초과했습니다.", + false, + ) + })?; + if width == 0 + || height == 0 + || width > MAX_REFERENCE_PNG_DIMENSION + || height > MAX_REFERENCE_PNG_DIMENSION + || decoded_bytes > MAX_REFERENCE_PNG_DECODED_BYTES + { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma reference PNG의 dimensions 또는 decoded 크기가 허용 범위를 초과했습니다.", + false, + )); + } + let mut pixels = vec![0_u8; decoded_bytes]; + decoder + .read_image(&mut pixels) + .map_err(reference_png_decode_error) +} + +fn reference_png_decode_error(error: ImageError) -> DevupError { + if matches!(error, ImageError::Limits(_)) { + DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma reference PNG의 dimensions 또는 decoded 크기가 허용 범위를 초과했습니다.", + false, + ) + } else { + invalid_call("Figma reference PNG 데이터가 손상되었습니다.") + } +} + +#[derive(Debug, Clone, Copy)] +struct SnapshotCursor { + next_offset: usize, + complete: bool, + total_nodes: usize, +} + +fn take_snapshot_cursor(chunk: &mut SnapshotChunk) -> Result, DevupError> { + let positions = chunk + .nodes + .iter() + .enumerate() + .filter_map(|(index, node)| (node.id == SNAPSHOT_CURSOR_ID).then_some(index)) + .collect::>(); + let Some(&position) = positions.first() else { + return Ok(None); + }; + if positions.len() != 1 { + return Err(invalid_call( + "Figma snapshot 응답에 cursor가 중복되었습니다.", + )); + } + let cursor = chunk.nodes.remove(position); + if cursor.node_type != "DEVUP_INTERNAL" { + return Err(invalid_call( + "Figma snapshot cursor 형식이 올바르지 않습니다.", + )); + } + let cursor = cursor.typed_view(); + let next_offset = cursor + .value("nextOffset") + .and_then(Value::as_u64) + .and_then(|value| usize::try_from(value).ok()) + .ok_or_else(|| invalid_call("Figma snapshot cursor의 nextOffset이 없습니다."))?; + let complete = cursor + .bool("complete") + .ok_or_else(|| invalid_call("Figma snapshot cursor의 complete가 없습니다."))?; + let total_nodes = cursor + .value("totalNodes") + .and_then(Value::as_u64) + .and_then(|value| usize::try_from(value).ok()) + .ok_or_else(|| invalid_call("Figma snapshot cursor의 totalNodes가 없습니다."))?; + Ok(Some(SnapshotCursor { + next_offset, + complete, + total_nodes, + })) +} + +fn invalid_call(message: &str) -> DevupError { + DevupError::new(ErrorCode::DevupFigmaHandoffInvalid, message, false) +} + +fn fallback_category(error: &DevupError) -> String { + error + .details + .get("category") + .and_then(Value::as_str) + .map(str::to_owned) + .unwrap_or_else(|| format!("{:?}", error.code)) +} + +fn fast_call_fallback_allowed(error: &DevupError) -> bool { + matches!( + error.code, + ErrorCode::DevupFigmaDirectUnavailable + | ErrorCode::DevupFigmaCatalogRejected + | ErrorCode::DevupFigmaResponseTooLarge + | ErrorCode::DevupSnapshotUnsupported + | ErrorCode::DevupFigmaHandoffInvalid + ) +} + +fn resource_count(value: &Value, field: &str) -> usize { + value + .get(field) + .and_then(Value::as_array) + .map_or(0, Vec::len) +} + +fn empty_used_resources() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "collections": [], + "variables": [], + "styles": [], + "usedRemoteVariables": [], + "usedVariableIds": [], + "usedStyleIds": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }), + } +} + +fn merge_fast_resources( + existing: &mut Option, + incoming: UpstreamResult, +) -> Result<(), DevupError> { + let Some(current) = existing else { + *existing = Some(incoming); + return Ok(()); + }; + let current = current + .raw + .as_object_mut() + .ok_or_else(|| invalid_call("기존 multi-root resource 형식이 올바르지 않습니다."))?; + let incoming = incoming + .raw + .as_object() + .ok_or_else(|| invalid_call("multi-root resource 형식이 올바르지 않습니다."))?; + for field in ["collections", "variables", "styles", "usedRemoteVariables"] { + let mut values = BTreeMap::::new(); + for value in current + .get(field) + .and_then(Value::as_array) + .into_iter() + .flatten() + .chain( + incoming + .get(field) + .and_then(Value::as_array) + .into_iter() + .flatten(), + ) + { + let id = value + .get("id") + .and_then(Value::as_str) + .ok_or_else(|| invalid_call("multi-root resource ID가 없습니다."))?; + if let Some(previous) = values.get(id) + && previous != value + { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "multi-root resource 내용이 batch 사이에서 달라졌습니다.", + true, + )); + } + values.insert(id.to_owned(), value.clone()); + } + current.insert( + field.to_owned(), + Value::Array(values.into_values().collect()), + ); + } + for field in ["usedVariableIds", "usedStyleIds"] { + let values = current + .get(field) + .and_then(Value::as_array) + .into_iter() + .flatten() + .chain( + incoming + .get(field) + .and_then(Value::as_array) + .into_iter() + .flatten(), + ) + .map(|value| { + value + .as_str() + .map(str::to_owned) + .ok_or_else(|| invalid_call("multi-root resource ID 형식이 올바르지 않습니다.")) + }) + .collect::, _>>()?; + current.insert( + field.to_owned(), + Value::Array(values.into_iter().map(Value::String).collect()), + ); + } + let unresolved = current + .get("unresolved") + .and_then(Value::as_array) + .into_iter() + .flatten() + .chain( + incoming + .get("unresolved") + .and_then(Value::as_array) + .into_iter() + .flatten(), + ) + .map(|value| serde_json::to_string(value).map(|key| (key, value.clone()))) + .collect::, _>>() + .map_err(|_| invalid_call("multi-root unresolved resource를 직렬화할 수 없습니다."))?; + current.insert( + "unresolved".to_owned(), + Value::Array(unresolved.into_values().collect()), + ); + for field in ["localComplete", "usedRemoteComplete"] { + let merged = current.get(field).and_then(Value::as_bool).unwrap_or(false) + && incoming + .get(field) + .and_then(Value::as_bool) + .unwrap_or(false); + current.insert(field.to_owned(), Value::Bool(merged)); + } + Ok(()) +} + +#[derive(Debug, Clone)] +enum UsedResourceItem { + Variable(String), + Style(ResourceStyleRef), +} + +fn used_resource_batches(refs: &UsedResourceRefs) -> Result, DevupError> { + let items = refs + .variable_ids + .iter() + .cloned() + .map(UsedResourceItem::Variable) + .chain(refs.styles.iter().cloned().map(UsedResourceItem::Style)); + let mut batches = Vec::new(); + let mut current = ResourceBatch { + variable_ids: Vec::new(), + styles: Vec::new(), + }; + + for item in items { + let mut candidate = current.clone(); + add_used_resource(&mut candidate, item.clone()); + if used_resource_batch_fits(&candidate) { + current = candidate; + continue; + } + if current.variable_ids.is_empty() && current.styles.is_empty() { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "단일 Figma 리소스 ID가 안전한 batch 크기를 초과했습니다.", + false, + )); + } + batches.push(current); + current = ResourceBatch { + variable_ids: Vec::new(), + styles: Vec::new(), + }; + add_used_resource(&mut current, item); + if !used_resource_batch_fits(¤t) { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "단일 Figma 리소스 ID가 안전한 batch 크기를 초과했습니다.", + false, + )); + } + } + if !current.variable_ids.is_empty() || !current.styles.is_empty() { + batches.push(current); + } + Ok(batches) +} + +fn add_used_resource(batch: &mut ResourceBatch, item: UsedResourceItem) { + match item { + UsedResourceItem::Variable(id) => batch.variable_ids.push(id), + UsedResourceItem::Style(style) => batch.styles.push(style), + } +} + +fn used_resource_batch_fits(batch: &ResourceBatch) -> bool { + batch.variable_ids.len() + batch.styles.len() <= USED_RESOURCE_BATCH_ITEMS + && serde_json::to_vec(batch).is_ok_and(|bytes| bytes.len() <= USED_RESOURCE_BATCH_BYTES) +} diff --git a/crates/devup-mcp-figma/src/credentials.rs b/crates/devup-mcp-figma/src/credentials.rs new file mode 100644 index 0000000..bf03548 --- /dev/null +++ b/crates/devup-mcp-figma/src/credentials.rs @@ -0,0 +1,128 @@ +use std::sync::Arc; + +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; +use tokio::sync::RwLock; + +use super::{DevupError, ErrorCode}; + +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoredAuthorization { + pub client_id: String, + pub access_token: String, + pub refresh_token: Option, + pub expires_at: Option, + pub scope: String, + pub token_endpoint: String, + pub resource: String, +} + +impl std::fmt::Debug for StoredAuthorization { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter + .debug_struct("StoredAuthorization") + .field("client_id", &self.client_id) + .field("access_token", &"[REDACTED]") + .field( + "refresh_token", + &self.refresh_token.as_ref().map(|_| "[REDACTED]"), + ) + .field("expires_at", &self.expires_at) + .field("scope", &self.scope) + .field("token_endpoint", &self.token_endpoint) + .field("resource", &self.resource) + .finish() + } +} + +#[async_trait] +pub trait CredentialStore: Clone + Send + Sync + 'static { + async fn load(&self) -> Result, DevupError>; + async fn save(&self, value: &StoredAuthorization) -> Result<(), DevupError>; + async fn clear(&self) -> Result<(), DevupError>; +} + +#[derive(Clone, Default)] +pub struct MemoryCredentialStore { + value: Arc>>, +} + +#[async_trait] +impl CredentialStore for MemoryCredentialStore { + async fn load(&self) -> Result, DevupError> { + Ok(self.value.read().await.clone()) + } + + async fn save(&self, value: &StoredAuthorization) -> Result<(), DevupError> { + *self.value.write().await = Some(value.clone()); + Ok(()) + } + + async fn clear(&self) -> Result<(), DevupError> { + *self.value.write().await = None; + Ok(()) + } +} + +#[derive(Debug, Clone, Copy, Default)] +pub struct KeyringCredentialStore; + +impl KeyringCredentialStore { + fn entry() -> Result { + keyring::Entry::new("devup-mcp", "figma-remote-mcp").map_err(keyring_error) + } +} + +#[async_trait] +impl CredentialStore for KeyringCredentialStore { + async fn load(&self) -> Result, DevupError> { + tokio::task::spawn_blocking(|| match Self::entry()?.get_password() { + Ok(json) => serde_json::from_str(&json).map(Some).map_err(|_| { + DevupError::new( + ErrorCode::DevupAuthRequired, + "저장된 Figma 인증 정보를 읽을 수 없습니다. 다시 로그인하세요.", + false, + ) + }), + Err(keyring::Error::NoEntry) => Ok(None), + Err(error) => Err(keyring_error(error)), + }) + .await + .map_err(|_| credential_task_error())? + } + + async fn save(&self, value: &StoredAuthorization) -> Result<(), DevupError> { + let json = serde_json::to_string(value).map_err(|_| credential_task_error())?; + tokio::task::spawn_blocking(move || { + Self::entry()?.set_password(&json).map_err(keyring_error) + }) + .await + .map_err(|_| credential_task_error())? + } + + async fn clear(&self) -> Result<(), DevupError> { + tokio::task::spawn_blocking(|| match Self::entry()?.delete_credential() { + Ok(()) | Err(keyring::Error::NoEntry) => Ok(()), + Err(error) => Err(keyring_error(error)), + }) + .await + .map_err(|_| credential_task_error())? + } +} + +fn keyring_error(_error: keyring::Error) -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "운영체제 보안 저장소에 Figma 인증 정보를 저장할 수 없습니다.", + false, + ) +} + +fn credential_task_error() -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "Figma 인증 저장소 작업을 완료하지 못했습니다.", + true, + ) +} diff --git a/crates/devup-mcp-figma/src/envelope.rs b/crates/devup-mcp-figma/src/envelope.rs new file mode 100644 index 0000000..fcf37b5 --- /dev/null +++ b/crates/devup-mcp-figma/src/envelope.rs @@ -0,0 +1,747 @@ +use std::collections::BTreeSet; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use serde::Deserialize; +use serde_json::{Value, json}; + +use crate::{ + DevupError, ErrorCode, FigmaTarget, ResourceKind, SnapshotChunk, UpstreamResult, + collect_used_resource_refs, +}; + +const PNG_SIGNATURE: &[u8; 8] = b"\x89PNG\r\n\x1a\n"; +const ENVELOPE_CHUNK_TYPE: &[u8; 4] = b"duVp"; +const EXPECTED_IHDR: &[u8; 13] = &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]; +const MAX_PNG_BYTES: usize = 11 * 1024 * 1024; +const MAX_BASE64_PNG_BYTES: usize = MAX_PNG_BYTES.div_ceil(3) * 4; +const MAX_ENVELOPE_BYTES: usize = 8 * 1024 * 1024; +const MAX_ENVELOPE_CHUNKS: usize = 32; + +type EnvelopeChunk<'a> = (u32, u32, &'a [u8]); + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct FastTransportStats { + pub raw_bytes: usize, + pub wire_bytes: usize, + pub chunk_count: usize, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct FastSnapshotPayload { + pub snapshot: SnapshotChunk, + pub resources: UpstreamResult, + pub stats: FastTransportStats, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct FastThemePayload { + pub resources: UpstreamResult, + pub source_version: Option, + pub stats: FastTransportStats, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct Envelope { + schema_version: u32, + source: EnvelopeSource, + snapshot: SnapshotChunk, + resources: Value, + integrity: EnvelopeIntegrity, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct EnvelopeSource { + file_key: String, + root_id: String, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct EnvelopeIntegrity { + node_count: usize, + variable_ref_count: usize, + style_ref_count: usize, + utf8_bytes: usize, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct EnvelopeDescriptor { + kind: String, + schema_version: u32, + root_id: String, + node_count: usize, + variable_ref_count: usize, + style_ref_count: usize, + utf8_bytes: usize, + chunk_count: usize, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ThemeEnvelope { + schema_version: u32, + source: ThemeEnvelopeSource, + resources: Value, + integrity: ThemeEnvelopeIntegrity, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ThemeEnvelopeSource { + file_key: String, + version: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ThemeEnvelopeIntegrity { + collection_count: usize, + variable_count: usize, + style_count: usize, + unresolved_count: usize, + utf8_bytes: usize, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ThemeEnvelopeDescriptor { + kind: String, + schema_version: u32, + collection_count: usize, + variable_count: usize, + style_count: usize, + unresolved_count: usize, + utf8_bytes: usize, + chunk_count: usize, +} + +pub fn decode_fast_snapshot( + result: &UpstreamResult, + target: &FigmaTarget, +) -> Result { + let target_root = target + .node_id + .as_ref() + .ok_or_else(|| invalid("targetRootMissing"))?; + decode_fast_snapshot_for_roots(result, target, std::slice::from_ref(target_root)) +} + +pub fn decode_fast_multi_snapshot( + result: &UpstreamResult, + target: &FigmaTarget, + expected_root_ids: &[String], +) -> Result { + if expected_root_ids.is_empty() + || expected_root_ids.iter().collect::>().len() != expected_root_ids.len() + { + return Err(invalid("targetRootsInvalid")); + } + decode_fast_snapshot_for_roots(result, target, expected_root_ids) +} + +fn decode_fast_snapshot_for_roots( + result: &UpstreamResult, + target: &FigmaTarget, + expected_root_ids: &[String], +) -> Result { + let descriptor = find_descriptor(&result.raw)?; + if descriptor.chunk_count == 0 { + return Err(invalid("descriptorChunkCount")); + } + if descriptor.chunk_count > MAX_ENVELOPE_CHUNKS { + return Err(too_large("chunkCount")); + } + + let images = find_images(&result.raw)?; + if images.len() > descriptor.chunk_count { + return Err(invalid("imageMultiplicity")); + } + let mut encoded_bytes = 0_usize; + let mut wire_bytes = 0_usize; + let mut pngs = Vec::with_capacity(images.len()); + for (encoded, mime_type) in images { + if mime_type != "image/png" { + return Err(invalid("imageMime")); + } + encoded_bytes = encoded_bytes + .checked_add(encoded.len()) + .ok_or_else(|| too_large("png"))?; + let maximum_encoded_bytes = MAX_BASE64_PNG_BYTES + .checked_add(MAX_ENVELOPE_CHUNKS * 3) + .ok_or_else(|| too_large("png"))?; + if encoded_bytes > maximum_encoded_bytes { + return Err(too_large("png")); + } + let png = STANDARD + .decode(encoded) + .map_err(|_| invalid("imageBase64"))?; + wire_bytes = wire_bytes + .checked_add(png.len()) + .ok_or_else(|| too_large("png"))?; + if wire_bytes > MAX_PNG_BYTES { + return Err(too_large("png")); + } + pngs.push(png); + } + + let mut chunks = Vec::with_capacity(descriptor.chunk_count); + for png in &pngs { + chunks.extend(decode_png_envelope(png)?); + } + if chunks.len() != descriptor.chunk_count { + return Err(invalid("descriptorChunkCount")); + } + let envelope_bytes = join_envelope_chunks(chunks)?; + if envelope_bytes.len() > MAX_ENVELOPE_BYTES { + return Err(too_large("envelope")); + } + let envelope_text = + std::str::from_utf8(&envelope_bytes).map_err(|_| invalid("envelopeUtf8"))?; + let envelope: Envelope = + serde_json::from_str(envelope_text).map_err(|_| invalid("envelopeJson"))?; + validate_envelope( + &envelope, + &descriptor, + target, + expected_root_ids, + envelope_bytes.len(), + )?; + + Ok(FastSnapshotPayload { + snapshot: envelope.snapshot, + resources: UpstreamResult { + raw: envelope.resources, + }, + stats: FastTransportStats { + raw_bytes: envelope_bytes.len(), + wire_bytes, + chunk_count: descriptor.chunk_count, + }, + }) +} + +pub fn decode_fast_theme( + result: &UpstreamResult, + expected_file_key: &str, +) -> Result { + let descriptor = find_theme_descriptor(&result.raw)?; + if descriptor.chunk_count == 0 { + return Err(invalid("descriptorChunkCount")); + } + if descriptor.chunk_count > MAX_ENVELOPE_CHUNKS { + return Err(too_large("chunkCount")); + } + let images = find_images(&result.raw)?; + if images.len() > descriptor.chunk_count { + return Err(invalid("imageMultiplicity")); + } + let mut encoded_bytes = 0_usize; + let mut wire_bytes = 0_usize; + let mut pngs = Vec::with_capacity(images.len()); + for (encoded, mime_type) in images { + if mime_type != "image/png" { + return Err(invalid("imageMime")); + } + encoded_bytes = encoded_bytes + .checked_add(encoded.len()) + .ok_or_else(|| too_large("png"))?; + if encoded_bytes > MAX_BASE64_PNG_BYTES + MAX_ENVELOPE_CHUNKS * 3 { + return Err(too_large("png")); + } + let png = STANDARD + .decode(encoded) + .map_err(|_| invalid("imageBase64"))?; + wire_bytes = wire_bytes + .checked_add(png.len()) + .ok_or_else(|| too_large("png"))?; + if wire_bytes > MAX_PNG_BYTES { + return Err(too_large("png")); + } + pngs.push(png); + } + let mut chunks = Vec::with_capacity(descriptor.chunk_count); + for png in &pngs { + chunks.extend(decode_png_envelope(png)?); + } + if chunks.len() != descriptor.chunk_count { + return Err(invalid("descriptorChunkCount")); + } + let envelope_bytes = join_envelope_chunks(chunks)?; + if envelope_bytes.len() > MAX_ENVELOPE_BYTES { + return Err(too_large("envelope")); + } + let envelope_text = + std::str::from_utf8(&envelope_bytes).map_err(|_| invalid("envelopeUtf8"))?; + let envelope: ThemeEnvelope = + serde_json::from_str(envelope_text).map_err(|_| invalid("envelopeJson"))?; + validate_theme_envelope( + &envelope, + &descriptor, + expected_file_key, + envelope_bytes.len(), + )?; + Ok(FastThemePayload { + resources: UpstreamResult { + raw: envelope.resources, + }, + source_version: envelope.source.version, + stats: FastTransportStats { + raw_bytes: envelope_bytes.len(), + wire_bytes, + chunk_count: descriptor.chunk_count, + }, + }) +} + +fn find_images(value: &Value) -> Result, DevupError> { + fn collect<'a>(value: &'a Value, found: &mut Vec<(&'a str, &'a str)>) { + match value { + Value::Object(object) => { + if object.get("type").and_then(Value::as_str) == Some("image") + && let Some(data) = object.get("data").and_then(Value::as_str) + && let Some(mime) = object + .get("mimeType") + .or_else(|| object.get("mime_type")) + .and_then(Value::as_str) + { + found.push((data, mime)); + } + for child in object.values() { + collect(child, found); + } + } + Value::Array(values) => { + for child in values { + collect(child, found); + } + } + _ => {} + } + } + + let mut images = Vec::new(); + collect(value, &mut images); + if images.is_empty() { + return Err(invalid("imageMissing")); + } + if images.len() > MAX_ENVELOPE_CHUNKS { + return Err(too_large("imageCount")); + } + Ok(images) +} + +fn find_descriptor(value: &Value) -> Result { + fn collect(value: &Value, found: &mut Vec) { + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Ok(descriptor) = serde_json::from_str::(text) + && descriptor.kind == "devupFastSnapshotDescriptor" + { + found.push(descriptor); + } + for child in object.values() { + collect(child, found); + } + } + Value::Array(values) => { + for child in values { + collect(child, found); + } + } + _ => {} + } + } + + let mut descriptors = Vec::new(); + collect(value, &mut descriptors); + match descriptors.len() { + 1 => Ok(descriptors.remove(0)), + 0 => Err(invalid("descriptorMissing")), + _ => Err(invalid("descriptorMultiplicity")), + } +} + +fn find_theme_descriptor(value: &Value) -> Result { + fn collect(value: &Value, found: &mut Vec) { + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Ok(descriptor) = serde_json::from_str::(text) + && descriptor.kind == "devupFastThemeDescriptor" + { + found.push(descriptor); + } + for child in object.values() { + collect(child, found); + } + } + Value::Array(values) => { + for child in values { + collect(child, found); + } + } + _ => {} + } + } + + let mut descriptors = Vec::new(); + collect(value, &mut descriptors); + match descriptors.len() { + 1 => Ok(descriptors.remove(0)), + 0 => Err(invalid("descriptorMissing")), + _ => Err(invalid("descriptorMultiplicity")), + } +} + +fn decode_png_envelope(png: &[u8]) -> Result>, DevupError> { + if !png.starts_with(PNG_SIGNATURE) { + return Err(invalid("pngSignature")); + } + + let mut offset = PNG_SIGNATURE.len(); + let mut first = true; + let mut saw_idat = false; + let mut saw_iend = false; + let mut envelope_chunks = Vec::new(); + while offset < png.len() { + let header_end = offset.checked_add(8).ok_or_else(|| invalid("pngLength"))?; + if header_end > png.len() { + return Err(invalid("pngLength")); + } + let length = u32::from_be_bytes( + png[offset..offset + 4] + .try_into() + .map_err(|_| invalid("pngLength"))?, + ) as usize; + let chunk_type: &[u8; 4] = png[offset + 4..header_end] + .try_into() + .map_err(|_| invalid("pngChunkType"))?; + let data_start = header_end; + let data_end = data_start + .checked_add(length) + .ok_or_else(|| invalid("pngLength"))?; + let crc_end = data_end + .checked_add(4) + .ok_or_else(|| invalid("pngLength"))?; + if crc_end > png.len() { + return Err(invalid("pngLength")); + } + + if first { + if chunk_type != b"IHDR" || &png[data_start..data_end] != EXPECTED_IHDR { + return Err(invalid("pngIhdr")); + } + } else if chunk_type == b"IHDR" { + return Err(invalid("pngIhdr")); + } + first = false; + let expected_crc = u32::from_be_bytes( + png[data_end..crc_end] + .try_into() + .map_err(|_| invalid("pngCrc"))?, + ); + if crc32(&png[offset + 4..data_end]) != expected_crc { + return Err(invalid("pngCrc")); + } + if chunk_type == ENVELOPE_CHUNK_TYPE { + if length < 8 { + return Err(invalid("envelopeChunkHeader")); + } + let sequence = u32::from_be_bytes( + png[data_start..data_start + 4] + .try_into() + .map_err(|_| invalid("envelopeChunkHeader"))?, + ); + let total = u32::from_be_bytes( + png[data_start + 4..data_start + 8] + .try_into() + .map_err(|_| invalid("envelopeChunkHeader"))?, + ); + envelope_chunks.push((sequence, total, &png[data_start + 8..data_end])); + } + if chunk_type == b"IDAT" { + saw_idat = true; + } + if chunk_type == b"IEND" { + if length != 0 || crc_end != png.len() { + return Err(invalid("pngIend")); + } + saw_iend = true; + break; + } + offset = crc_end; + } + + if !saw_iend { + return Err(invalid("pngIend")); + } + if !saw_idat { + return Err(invalid("pngIdat")); + } + if envelope_chunks.is_empty() { + return Err(invalid("envelopeChunkMissing")); + } + Ok(envelope_chunks) +} + +fn join_envelope_chunks(chunks: Vec>) -> Result, DevupError> { + let total = u32::try_from(chunks.len()).map_err(|_| too_large("chunkCount"))?; + let mut byte_count = 0_usize; + for (expected_sequence, (sequence, declared_total, bytes)) in chunks.iter().enumerate() { + if declared_total != &total || sequence != &(expected_sequence as u32) { + return Err(invalid("envelopeChunkSequence")); + } + byte_count = byte_count + .checked_add(bytes.len()) + .ok_or_else(|| too_large("envelope"))?; + if byte_count > MAX_ENVELOPE_BYTES { + return Err(too_large("envelope")); + } + } + let mut output = Vec::with_capacity(byte_count); + for (_, _, bytes) in chunks { + output.extend_from_slice(bytes); + } + Ok(output) +} + +fn validate_envelope( + envelope: &Envelope, + descriptor: &EnvelopeDescriptor, + target: &FigmaTarget, + expected_root_ids: &[String], + utf8_bytes: usize, +) -> Result<(), DevupError> { + if envelope.schema_version != 1 || descriptor.schema_version != 1 { + return Err(invalid("schemaVersion")); + } + let target_root = target + .node_id + .as_deref() + .ok_or_else(|| invalid("targetRootMissing"))?; + if envelope.source.file_key != target.file_key + || envelope.snapshot.file_key != target.file_key + || envelope.source.root_id != target_root + || descriptor.root_id != target_root + || envelope.snapshot.root_ids != expected_root_ids + { + return Err(invalid("targetMismatch")); + } + if envelope.integrity.utf8_bytes != utf8_bytes || descriptor.utf8_bytes != utf8_bytes { + return Err(invalid("utf8Bytes")); + } + + let mut node_ids = BTreeSet::new(); + for node in &envelope.snapshot.nodes { + if !node_ids.insert(node.id.as_str()) { + return Err(invalid("duplicateNode")); + } + } + if envelope.integrity.node_count != node_ids.len() + || descriptor.node_count != node_ids.len() + || !expected_root_ids + .iter() + .all(|root_id| node_ids.contains(root_id.as_str())) + { + return Err(invalid("nodeCount")); + } + for node in &envelope.snapshot.nodes { + for child_id in node.typed_view().child_ids() { + if !node_ids.contains(child_id) { + return Err(invalid("danglingChild")); + } + } + } + + let refs = collect_used_resource_refs(std::slice::from_ref(&envelope.snapshot)); + if envelope.integrity.variable_ref_count != refs.variable_ids.len() + || descriptor.variable_ref_count != refs.variable_ids.len() + || envelope.integrity.style_ref_count != refs.styles.len() + || descriptor.style_ref_count != refs.styles.len() + { + return Err(invalid("resourceRefCount")); + } + validate_resources(&envelope.resources, &refs.variable_ids, &refs.styles)?; + Ok(()) +} + +fn validate_theme_envelope( + envelope: &ThemeEnvelope, + descriptor: &ThemeEnvelopeDescriptor, + expected_file_key: &str, + utf8_bytes: usize, +) -> Result<(), DevupError> { + if envelope.schema_version != 1 || descriptor.schema_version != 1 { + return Err(invalid("schemaVersion")); + } + if envelope.source.file_key != expected_file_key { + return Err(invalid("targetMismatch")); + } + if envelope.integrity.utf8_bytes != utf8_bytes || descriptor.utf8_bytes != utf8_bytes { + return Err(invalid("utf8Bytes")); + } + let resources = envelope + .resources + .as_object() + .ok_or_else(|| invalid("resourcesShape"))?; + let collections = resource_ids(resources.get("collections"), "collections")?; + let variables = resource_ids(resources.get("variables"), "variables")?; + let styles = resource_ids(resources.get("styles"), "styles")?; + let unresolved = resources + .get("unresolved") + .and_then(Value::as_array) + .ok_or_else(|| invalid("unresolvedShape"))?; + validate_theme_count( + envelope.integrity.collection_count, + descriptor.collection_count, + collections.len(), + "collectionCount", + )?; + validate_theme_count( + envelope.integrity.variable_count, + descriptor.variable_count, + variables.len(), + "variableCount", + )?; + validate_theme_count( + envelope.integrity.style_count, + descriptor.style_count, + styles.len(), + "styleCount", + )?; + validate_theme_count( + envelope.integrity.unresolved_count, + descriptor.unresolved_count, + unresolved.len(), + "unresolvedCount", + )?; + if resources.get("localComplete").and_then(Value::as_bool) != Some(true) { + return Err(invalid("localComplete")); + } + for value in unresolved { + if value.get("id").and_then(Value::as_str).is_none() + || serde_json::from_value::( + value + .get("kind") + .cloned() + .ok_or_else(|| invalid("unresolvedShape"))?, + ) + .is_err() + { + return Err(invalid("unresolvedShape")); + } + } + Ok(()) +} + +fn validate_theme_count( + envelope_count: usize, + descriptor_count: usize, + observed_count: usize, + category: &'static str, +) -> Result<(), DevupError> { + if envelope_count != observed_count || descriptor_count != observed_count { + Err(invalid(category)) + } else { + Ok(()) + } +} + +fn validate_resources( + resources: &Value, + variable_ids: &[String], + style_refs: &[crate::ResourceStyleRef], +) -> Result<(), DevupError> { + let object = resources + .as_object() + .ok_or_else(|| invalid("resourcesShape"))?; + let resolved_variables = resource_ids(object.get("variables"), "variables")?; + let resolved_styles = resource_ids(object.get("styles"), "styles")?; + let mut unresolved_variables = BTreeSet::new(); + let mut unresolved_styles = BTreeSet::new(); + for value in object + .get("unresolved") + .and_then(Value::as_array) + .ok_or_else(|| invalid("unresolvedShape"))? + { + let id = value + .get("id") + .and_then(Value::as_str) + .ok_or_else(|| invalid("unresolvedShape"))?; + match serde_json::from_value::( + value + .get("kind") + .cloned() + .ok_or_else(|| invalid("unresolvedShape"))?, + ) + .map_err(|_| invalid("unresolvedShape"))? + { + ResourceKind::Variable => { + unresolved_variables.insert(id); + } + ResourceKind::Style => { + unresolved_styles.insert(id); + } + } + } + if variable_ids.iter().any(|id| { + !resolved_variables.contains(id.as_str()) && !unresolved_variables.contains(id.as_str()) + }) || style_refs.iter().any(|style| { + !resolved_styles.contains(style.id.as_str()) + && !unresolved_styles.contains(style.id.as_str()) + }) { + return Err(invalid("resourceMissing")); + } + Ok(()) +} + +fn resource_ids<'a>( + value: Option<&'a Value>, + category: &'static str, +) -> Result, DevupError> { + let values = value + .and_then(Value::as_array) + .ok_or_else(|| invalid(category))?; + values + .iter() + .map(|value| { + value + .get("id") + .and_then(Value::as_str) + .ok_or_else(|| invalid(category)) + }) + .collect() +} + +fn crc32(bytes: &[u8]) -> u32 { + let mut crc = u32::MAX; + for byte in bytes { + crc ^= u32::from(*byte); + for _ in 0..8 { + crc = (crc >> 1) ^ (0xedb8_8320 & 0_u32.wrapping_sub(crc & 1)); + } + } + !crc +} + +fn invalid(category: &'static str) -> DevupError { + DevupError::with_details( + ErrorCode::DevupSnapshotUnsupported, + "Figma fast snapshot envelope 검증에 실패했습니다.", + false, + json!({"category": category}), + ) +} + +fn too_large(category: &'static str) -> DevupError { + DevupError::with_details( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma fast snapshot envelope가 안전한 크기 제한을 초과했습니다.", + false, + json!({"category": category}), + ) +} diff --git a/crates/devup-mcp-figma/src/errors.rs b/crates/devup-mcp-figma/src/errors.rs new file mode 100644 index 0000000..a681a60 --- /dev/null +++ b/crates/devup-mcp-figma/src/errors.rs @@ -0,0 +1,81 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum ErrorCode { + DevupAuthRequired, + DevupAuthCallbackTimeout, + DevupAuthStateMismatch, + DevupFigmaPermissionDenied, + DevupFigmaRateLimited, + DevupFigmaDirectUnavailable, + DevupFigmaCatalogRejected, + DevupFigmaHostRequired, + DevupFigmaHandoffExpired, + DevupFigmaHandoffInvalid, + DevupFigmaNodeNotFound, + DevupFigmaUnsupportedFile, + DevupFigmaResponseTooLarge, + DevupFigmaVersionChanged, + DevupSnapshotUnsupported, + DevupCodegenFailed, + DevupThemeConflict, + DevupCompatCorpusDrift, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct DevupError { + pub code: ErrorCode, + pub message: String, + pub retryable: bool, + pub details: serde_json::Value, +} + +impl DevupError { + pub fn new(code: ErrorCode, message: impl Into, retryable: bool) -> Self { + Self { + code, + message: message.into(), + retryable, + details: serde_json::Value::Null, + } + } + + pub fn unsupported_file(message: impl Into) -> Self { + Self::new(ErrorCode::DevupFigmaUnsupportedFile, message, false) + } + + pub fn with_details( + code: ErrorCode, + message: impl Into, + retryable: bool, + details: serde_json::Value, + ) -> Self { + Self { + code, + message: message.into(), + retryable, + details, + } + } +} + +impl std::fmt::Debug for DevupError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter + .debug_struct("DevupError") + .field("code", &self.code) + .field("message", &self.message) + .field("retryable", &self.retryable) + .field("details", &self.details) + .finish() + } +} + +impl std::fmt::Display for DevupError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str(&self.message) + } +} + +impl std::error::Error for DevupError {} diff --git a/crates/devup-mcp-figma/src/explore.rs b/crates/devup-mcp-figma/src/explore.rs new file mode 100644 index 0000000..053f801 --- /dev/null +++ b/crates/devup-mcp-figma/src/explore.rs @@ -0,0 +1,599 @@ +use std::cmp::Ordering; + +use serde::{Deserialize, Serialize}; + +use crate::{DevupError, ErrorCode, FigmaTarget, RawNode, Snapshot}; + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreBounds { + pub x: f64, + pub y: f64, + pub width: f64, + pub height: f64, +} + +impl ExploreBounds { + fn right(self) -> f64 { + self.x + self.width + } + + fn bottom(self) -> f64 { + self.y + self.height + } + + fn union(self, other: Self) -> Self { + let x = self.x.min(other.x); + let y = self.y.min(other.y); + let right = self.right().max(other.right()); + let bottom = self.bottom().max(other.bottom()); + Self { + x, + y, + width: right - x, + height: bottom - y, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExploreKind { + Screen, + Heading, + Annotation, + Container, + Unknown, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum TargetKind { + File, + Page, + Section, + Screen, + Component, + Other, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreNode { + pub node_id: String, + pub name: String, + pub node_type: String, + pub bounds: ExploreBounds, + pub child_count: usize, + pub text_preview: String, + pub parent_id: Option, + pub kind: ExploreKind, + pub visible: bool, + pub breadcrumb: Vec, + pub page_child_index: Option, +} + +impl TryFrom<&RawNode> for ExploreNode { + type Error = DevupError; + + fn try_from(node: &RawNode) -> Result { + let view = node.typed_view(); + let bounds = view + .value("absoluteBoundingBox") + .and_then(|value| value.as_object()) + .and_then(|bounds| { + Some(ExploreBounds { + x: bounds.get("x")?.as_f64()?, + y: bounds.get("y")?.as_f64()?, + width: bounds.get("width")?.as_f64()?, + height: bounds.get("height")?.as_f64()?, + }) + }) + .or_else(|| { + Some(ExploreBounds { + x: view.number("x")?, + y: view.number("y")?, + width: view.number("width")?, + height: view.number("height")?, + }) + }) + .filter(|bounds| { + bounds.x.is_finite() + && bounds.y.is_finite() + && bounds.width.is_finite() + && bounds.height.is_finite() + && bounds.width >= 0.0 + && bounds.height >= 0.0 + }) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma 탐색 projection에 유효한 node bounds가 없습니다.", + false, + ) + })?; + let child_count = view + .value("childCount") + .and_then(|value| value.as_u64()) + .map(|value| value as usize) + .unwrap_or_else(|| view.child_ids().count()); + let mut result = Self { + node_id: node.id.clone(), + name: view.name().unwrap_or_default().to_owned(), + node_type: node.node_type.clone(), + bounds, + child_count, + text_preview: view.string("textPreview").unwrap_or_default().to_owned(), + parent_id: view.string("parentId").map(str::to_owned), + kind: ExploreKind::Unknown, + visible: view.bool("visible").unwrap_or(true), + breadcrumb: view + .value("breadcrumb") + .and_then(serde_json::Value::as_array) + .into_iter() + .flatten() + .filter_map(serde_json::Value::as_str) + .map(str::to_owned) + .collect(), + page_child_index: view + .value("pageChildIndex") + .and_then(serde_json::Value::as_u64) + .and_then(|value| usize::try_from(value).ok()), + }; + result.kind = classify_explore_node(&result); + Ok(result) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreOptions { + pub limit: usize, +} + +impl Default for ExploreOptions { + fn default() -> Self { + Self { limit: 50 } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreCandidate { + pub node: ExploreNode, + pub canonical_url: String, + pub score: u32, + pub selection_reasons: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreGroup { + pub title: String, + pub heading_node_id: Option, + pub bounds: ExploreBounds, + #[serde(default, skip_serializing_if = "String::is_empty")] + pub notes: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreResult { + pub target_kind: TargetKind, + pub anchor: ExploreNode, + pub group: Option, + pub candidates: Vec, + pub truncated: bool, +} + +pub fn classify_target(snapshot: &Snapshot, target: &FigmaTarget) -> TargetKind { + let Some(node_id) = target.node_id.as_deref() else { + return TargetKind::File; + }; + let Some(node) = snapshot.nodes.get(node_id) else { + return TargetKind::Other; + }; + match node.node_type.as_str() { + "PAGE" => TargetKind::Page, + "SECTION" => TargetKind::Section, + "COMPONENT" | "COMPONENT_SET" | "INSTANCE" => TargetKind::Component, + "FRAME" => ExploreNode::try_from(node).map_or(TargetKind::Other, |node| { + if node.kind == ExploreKind::Screen { + TargetKind::Screen + } else { + TargetKind::Other + } + }), + _ => TargetKind::Other, + } +} + +pub fn classify_explore_node(node: &ExploreNode) -> ExploreKind { + let bounds = node.bounds; + let aspect = if bounds.height > 0.0 { + bounds.width / bounds.height + } else { + f64::INFINITY + }; + let container_type = matches!( + node.node_type.as_str(), + "SECTION" | "FRAME" | "COMPONENT_SET" + ); + if container_type + && bounds.height <= 180.0 + && bounds.width >= 600.0 + && aspect >= 4.0 + && node.child_count <= 8 + { + return ExploreKind::Heading; + } + if matches!( + node.node_type.as_str(), + "TEXT" | "VECTOR" | "LINE" | "SHAPE_WITH_TEXT" + ) { + return ExploreKind::Annotation; + } + if container_type && node.child_count >= 2 && (bounds.width > 1800.0 || bounds.height > 2000.0) + { + return ExploreKind::Container; + } + if matches!( + node.node_type.as_str(), + "FRAME" | "COMPONENT" | "INSTANCE" | "COMPONENT_SET" + ) && (240.0..=1800.0).contains(&bounds.width) + && (300.0..=2000.0).contains(&bounds.height) + && (0.25..=2.5).contains(&(bounds.width / bounds.height.max(1.0))) + { + return ExploreKind::Screen; + } + if bounds.width <= 320.0 && bounds.height <= 180.0 { + return ExploreKind::Annotation; + } + ExploreKind::Unknown +} + +pub fn explore_snapshot( + snapshot: &Snapshot, + target: &FigmaTarget, + options: &ExploreOptions, +) -> Result { + if options.limit == 0 || options.limit > 100 { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "탐색 limit은 1 이상 100 이하여야 합니다.", + false, + )); + } + let anchor_id = target.node_id.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma 주변 화면 탐색에는 node-id가 필요합니다.", + false, + ) + })?; + let raw_anchor = snapshot.nodes.get(anchor_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma 탐색 projection에서 anchor node를 찾지 못했습니다.", + false, + ) + })?; + let mut anchor = ExploreNode::try_from(raw_anchor)?; + enrich_node(snapshot, &mut anchor); + let target_kind = classify_target(snapshot, target); + let projection_truncated = snapshot + .nodes + .values() + .any(|node| node.typed_view().bool("projectionTruncated") == Some(true)); + + if anchor.kind == ExploreKind::Screen { + return Ok(ExploreResult { + target_kind, + group: Some(ExploreGroup { + title: anchor.name.clone(), + heading_node_id: None, + bounds: anchor.bounds, + notes: String::new(), + }), + candidates: vec![ExploreCandidate { + canonical_url: canonical_url(target, &anchor.node_id), + node: anchor.clone(), + score: 1_000, + selection_reasons: vec!["exact-screen-anchor".to_owned()], + }], + anchor, + truncated: projection_truncated, + }); + } + + if target_kind == TargetKind::Section { + let mut nodes = snapshot + .nodes + .values() + .filter(|node| node.id != anchor.node_id) + .filter(|node| node.node_type == "FRAME") + .filter_map(|node| { + let mut node = ExploreNode::try_from(node).ok()?; + enrich_node(snapshot, &mut node); + (node.visible + && node.kind == ExploreKind::Screen + && is_descendant_of(snapshot, &node.node_id, &anchor.node_id)) + .then_some(node) + }) + .collect::>(); + let screen_ids = nodes + .iter() + .map(|node| node.node_id.clone()) + .collect::>(); + nodes.retain(|node| { + !ancestor_ids(snapshot, &node.node_id, &anchor.node_id) + .iter() + .any(|ancestor| screen_ids.contains(ancestor)) + }); + nodes.sort_by(visual_order); + let candidate_count = nodes.len(); + nodes.truncate(options.limit); + let candidates = nodes + .into_iter() + .map(|node| ExploreCandidate { + canonical_url: canonical_url(target, &node.node_id), + node, + score: 900, + selection_reasons: vec!["screen-like".to_owned(), "inside-section".to_owned()], + }) + .collect::>(); + let group_bounds = candidates.iter().fold(anchor.bounds, |bounds, candidate| { + bounds.union(candidate.node.bounds) + }); + return Ok(ExploreResult { + target_kind, + group: Some(ExploreGroup { + title: anchor.name.clone(), + heading_node_id: None, + bounds: group_bounds, + notes: collect_section_notes(snapshot, &anchor.node_id)?, + }), + anchor, + candidates, + truncated: projection_truncated || candidate_count > options.limit, + }); + } + + let mut nodes = snapshot + .nodes + .values() + .filter(|node| node.id != anchor.node_id) + .filter_map(|node| { + let mut node = ExploreNode::try_from(node).ok()?; + enrich_node(snapshot, &mut node); + node.visible.then_some(node) + }) + .collect::>(); + let anchor_is_requirement = looks_like_requirement_heading(&anchor.name); + let next_heading_y = nodes + .iter() + .filter(|node| node.kind == ExploreKind::Heading) + .filter(|node| !anchor_is_requirement || looks_like_requirement_heading(&node.name)) + .filter(|node| node.bounds.y >= anchor.bounds.bottom()) + .filter(|node| node.bounds.width >= anchor.bounds.width * 0.5) + .filter(|node| horizontal_overlap(node.bounds, anchor.bounds) > 0.0) + .map(|node| node.bounds.y) + .min_by(f64::total_cmp); + let cutoff = next_heading_y.unwrap_or(f64::INFINITY); + + nodes.retain(|node| { + if node.kind != ExploreKind::Screen { + return false; + } + if anchor.kind == ExploreKind::Container { + return node.parent_id.as_deref() == Some(anchor.node_id.as_str()) + || contains(anchor.bounds, node.bounds); + } + node.bounds.y >= anchor.bounds.bottom() + && node.bounds.y < cutoff + && horizontal_overlap(node.bounds, anchor.bounds) > 0.0 + }); + nodes.sort_by(visual_order); + let candidate_count = nodes.len(); + nodes.truncate(options.limit); + let candidates = nodes + .into_iter() + .map(|node| { + let overlap = horizontal_overlap(node.bounds, anchor.bounds); + let overlap_ratio = overlap / node.bounds.width.max(1.0); + let mut reasons = vec!["screen-like".to_owned()]; + if anchor.kind == ExploreKind::Container { + reasons.push("inside-container".to_owned()); + } else { + reasons.push("below-anchor".to_owned()); + reasons.push("horizontal-overlap".to_owned()); + reasons.push("before-next-heading".to_owned()); + } + ExploreCandidate { + canonical_url: canonical_url(target, &node.node_id), + score: 400 + (overlap_ratio.clamp(0.0, 1.0) * 100.0).round() as u32, + node, + selection_reasons: reasons, + } + }) + .collect::>(); + let group_bounds = candidates.iter().fold(anchor.bounds, |bounds, candidate| { + bounds.union(candidate.node.bounds) + }); + + Ok(ExploreResult { + target_kind, + group: Some(ExploreGroup { + title: anchor.name.clone(), + heading_node_id: (anchor.kind == ExploreKind::Heading).then(|| anchor.node_id.clone()), + bounds: group_bounds, + notes: String::new(), + }), + anchor, + candidates, + truncated: projection_truncated || candidate_count > options.limit, + }) +} + +pub fn collect_section_notes(snapshot: &Snapshot, section_id: &str) -> Result { + let section = snapshot.nodes.get(section_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Section note를 수집할 node를 찾지 못했습니다.", + false, + ) + })?; + if section.node_type != "SECTION" { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Section note 수집 대상은 SECTION이어야 합니다.", + false, + )); + } + let mut notes = section + .typed_view() + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .filter(|node| node.node_type == "TEXT") + .filter_map(|node| node.typed_view().string("characters")) + .map(str::trim) + .filter(|text| !text.is_empty()) + .map(str::to_owned) + .collect::>(); + let mut pending = section + .typed_view() + .child_ids() + .map(str::to_owned) + .collect::>(); + pending.reverse(); + let mut visited = std::collections::BTreeSet::new(); + while let Some(node_id) = pending.pop() { + if !visited.insert(node_id.clone()) { + continue; + } + let Some(node) = snapshot.nodes.get(&node_id) else { + continue; + }; + let view = node.typed_view(); + if let Some(annotations) = view + .value("annotations") + .and_then(serde_json::Value::as_array) + { + for annotation in annotations { + let label = annotation + .get("label") + .and_then(serde_json::Value::as_str) + .map(str::trim) + .filter(|label| !label.is_empty()) + .or_else(|| { + annotation + .get("labelMarkdown") + .and_then(serde_json::Value::as_str) + .map(str::trim) + .filter(|label| !label.is_empty()) + }); + if let Some(label) = label { + notes.push(format!("[{}] {label}", view.name().unwrap_or("Unnamed"))); + } + } + } + let mut children = view.child_ids().map(str::to_owned).collect::>(); + children.reverse(); + pending.extend(children); + } + Ok(notes.join("\n")) +} + +fn enrich_node(snapshot: &Snapshot, node: &mut ExploreNode) { + if node.breadcrumb.is_empty() { + let mut breadcrumb = ancestor_ids(snapshot, &node.node_id, ""); + breadcrumb.reverse(); + node.breadcrumb = breadcrumb + .into_iter() + .filter_map(|id| snapshot.nodes.get(&id)) + .filter_map(|node| node.typed_view().name()) + .map(str::to_owned) + .chain(std::iter::once(node.name.clone())) + .collect(); + } +} + +fn is_descendant_of(snapshot: &Snapshot, node_id: &str, ancestor_id: &str) -> bool { + ancestor_ids(snapshot, node_id, ancestor_id) + .iter() + .any(|id| id == ancestor_id) +} + +fn ancestor_ids(snapshot: &Snapshot, node_id: &str, stop_id: &str) -> Vec { + let mut result = Vec::new(); + let mut current = snapshot + .nodes + .get(node_id) + .and_then(|node| node.typed_view().string("parentId")); + let mut visited = std::collections::BTreeSet::new(); + while let Some(parent_id) = current { + if !visited.insert(parent_id.to_owned()) { + break; + } + result.push(parent_id.to_owned()); + if parent_id == stop_id { + break; + } + current = snapshot + .nodes + .get(parent_id) + .and_then(|node| node.typed_view().string("parentId")); + } + result +} + +fn horizontal_overlap(left: ExploreBounds, right: ExploreBounds) -> f64 { + left.right().min(right.right()) - left.x.max(right.x) +} + +fn contains(outer: ExploreBounds, inner: ExploreBounds) -> bool { + inner.x >= outer.x + && inner.y >= outer.y + && inner.right() <= outer.right() + && inner.bottom() <= outer.bottom() +} + +fn visual_order(left: &ExploreNode, right: &ExploreNode) -> Ordering { + left.bounds + .y + .total_cmp(&right.bounds.y) + .then_with(|| left.bounds.x.total_cmp(&right.bounds.x)) + .then_with(|| left.node_id.cmp(&right.node_id)) +} + +fn looks_like_requirement_heading(name: &str) -> bool { + let Some((identifier, _)) = name + .trim() + .strip_prefix('[') + .and_then(|name| name.split_once(']')) + else { + return false; + }; + let Some((prefix, number)) = identifier.split_once('-') else { + return false; + }; + !prefix.is_empty() + && prefix.bytes().all(|byte| byte.is_ascii_uppercase()) + && !number.is_empty() + && number.bytes().all(|byte| byte.is_ascii_digit()) +} + +fn canonical_url(target: &FigmaTarget, node_id: &str) -> String { + let node_id = node_id.replace(':', "-"); + if let Some(branch_key) = &target.branch_key { + format!( + "https://www.figma.com/branch/{}/{branch_key}/devup?node-id={node_id}", + target.file_key + ) + } else { + format!( + "https://www.figma.com/design/{}/devup?node-id={node_id}", + target.file_key + ) + } +} diff --git a/crates/devup-mcp-figma/src/large_values.rs b/crates/devup-mcp-figma/src/large_values.rs new file mode 100644 index 0000000..d35713d --- /dev/null +++ b/crates/devup-mcp-figma/src/large_values.rs @@ -0,0 +1,314 @@ +use std::collections::BTreeMap; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use sha2::{Digest, Sha256}; + +use crate::{DevupError, ErrorCode, SnapshotChunk, UpstreamResult}; + +pub const MAX_LARGE_VALUE_BYTES: usize = 16 * 1024 * 1024; +pub const MAX_LARGE_VALUE_CHUNK_BYTES: usize = 64 * 1024; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LargeValueCursor { + pub next_offset: usize, + pub max_chunk_bytes: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LargeValueDescriptor { + pub node_id: String, + pub field: String, + pub byte_length: usize, + pub sha256: String, + pub cursor: LargeValueCursor, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LargeValueReadOptions { + pub node_id: String, + pub field: String, + pub offset: usize, + pub max_chunk_bytes: usize, + pub byte_length: usize, + pub sha256: String, + pub version: Option, +} + +impl LargeValueReadOptions { + pub fn from_descriptor( + descriptor: &LargeValueDescriptor, + version: Option, + offset: usize, + ) -> Self { + Self { + node_id: descriptor.node_id.clone(), + field: descriptor.field.clone(), + offset, + max_chunk_bytes: descriptor + .cursor + .max_chunk_bytes + .clamp(1, MAX_LARGE_VALUE_CHUNK_BYTES), + byte_length: descriptor.byte_length, + sha256: descriptor.sha256.clone(), + version, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LargeValueFragment { + pub file_key: String, + pub version: Option, + pub node_id: String, + pub field: String, + pub offset: usize, + pub next_offset: usize, + pub byte_length: usize, + pub sha256: String, + pub data_base64: String, + pub complete: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LargeValueUnsupported { + pub file_key: String, + pub version: Option, + pub node_id: String, + pub field: String, + pub byte_length: usize, + pub sha256: String, + pub error_code: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) enum LargeValueResult { + Fragment(LargeValueFragment), + Unsupported(LargeValueUnsupported), +} + +#[derive(Debug)] +pub struct LargeValueAssembler { + expected_file_key: String, + expected_version: Option, + descriptor: LargeValueDescriptor, + fragments: BTreeMap>, + saw_complete: bool, +} + +impl LargeValueAssembler { + pub fn new( + file_key: impl Into, + version: Option, + descriptor: LargeValueDescriptor, + ) -> Result { + validate_descriptor(&descriptor)?; + Ok(Self { + expected_file_key: file_key.into(), + expected_version: version, + descriptor, + fragments: BTreeMap::new(), + saw_complete: false, + }) + } + + pub fn descriptor(&self) -> &LargeValueDescriptor { + &self.descriptor + } + + pub fn push(&mut self, fragment: LargeValueFragment) -> Result<(), DevupError> { + if fragment.file_key != self.expected_file_key + || fragment.version != self.expected_version + || fragment.node_id != self.descriptor.node_id + || fragment.field != self.descriptor.field + || fragment.byte_length != self.descriptor.byte_length + || fragment.sha256 != self.descriptor.sha256 + { + return Err(invalid( + "large value fragment의 대상 또는 버전이 요청과 다릅니다.", + )); + } + let bytes = STANDARD + .decode(fragment.data_base64.as_bytes()) + .map_err(|_| invalid("large value fragment의 base64가 올바르지 않습니다."))?; + if bytes.is_empty() + || bytes.len() > self.descriptor.cursor.max_chunk_bytes + || bytes.len() > MAX_LARGE_VALUE_CHUNK_BYTES + || fragment.offset >= self.descriptor.byte_length + || fragment.next_offset != fragment.offset.saturating_add(bytes.len()) + || fragment.next_offset > self.descriptor.byte_length + || fragment.complete != (fragment.next_offset == self.descriptor.byte_length) + { + return Err(invalid( + "large value fragment의 byte 범위가 올바르지 않습니다.", + )); + } + if let Some(existing) = self.fragments.get(&fragment.offset) { + if existing != &bytes { + return Err(invalid( + "large value fragment가 같은 offset에서 충돌합니다.", + )); + } + return Ok(()); + } + self.saw_complete |= fragment.complete; + self.fragments.insert(fragment.offset, bytes); + Ok(()) + } + + pub fn finish(self) -> Result { + if !self.saw_complete { + return Err(invalid("large value fragment의 마지막 범위가 없습니다.")); + } + let mut output = Vec::with_capacity(self.descriptor.byte_length); + for (offset, bytes) in self.fragments { + if offset != output.len() { + return Err(invalid( + "large value fragment 범위가 누락되었거나 겹칩니다.", + )); + } + output.extend_from_slice(&bytes); + } + if output.len() != self.descriptor.byte_length + || sha256_hex(&output) != self.descriptor.sha256 + { + return Err(invalid( + "large value fragment의 길이 또는 hash가 일치하지 않습니다.", + )); + } + serde_json::from_slice(&output) + .map_err(|_| invalid("large value fragment를 JSON 값으로 복원할 수 없습니다.")) + } +} + +pub(crate) fn descriptors_in_chunk( + chunk: &SnapshotChunk, +) -> Result, DevupError> { + let mut descriptors = Vec::new(); + for node in &chunk.nodes { + for (field, value) in node.fields.iter().chain(&node.extra) { + let Some(raw) = value.get("$largeValue") else { + continue; + }; + let descriptor: LargeValueDescriptor = + serde_json::from_value(raw.clone()).map_err(|_| { + invalid("snapshot의 large value descriptor 형식이 올바르지 않습니다.") + })?; + validate_descriptor(&descriptor)?; + if descriptor.node_id != node.id || descriptor.field != *field { + return Err(invalid( + "snapshot의 large value descriptor 대상이 필드와 다릅니다.", + )); + } + descriptors.push(descriptor); + } + } + descriptors.sort_by(|left, right| { + left.node_id + .cmp(&right.node_id) + .then_with(|| left.field.cmp(&right.field)) + }); + descriptors.dedup(); + Ok(descriptors) +} + +pub(crate) fn large_value_from_result( + result: &UpstreamResult, +) -> Result { + find_large_value_result(&result.raw) + .ok_or_else(|| invalid("Figma MCP 응답에서 large value fragment를 찾지 못했습니다.")) +} + +pub(crate) fn replace_descriptor( + chunks: &mut BTreeMap, + descriptor: &LargeValueDescriptor, + value: Value, +) -> Result<(), DevupError> { + for chunk in chunks.values_mut() { + if let Some(node) = chunk + .nodes + .iter_mut() + .find(|node| node.id == descriptor.node_id) + { + let slot = node + .fields + .get_mut(&descriptor.field) + .or_else(|| node.extra.get_mut(&descriptor.field)) + .ok_or_else(|| invalid("large value descriptor가 가리키는 필드가 없습니다."))?; + let observed: LargeValueDescriptor = serde_json::from_value( + slot.get("$largeValue") + .cloned() + .ok_or_else(|| invalid("large value descriptor marker가 없습니다."))?, + ) + .map_err(|_| invalid("large value descriptor marker가 올바르지 않습니다."))?; + if observed != *descriptor { + return Err(invalid("large value descriptor가 수집 중 변경되었습니다.")); + } + *slot = value; + node.field_errors.remove(&descriptor.field); + return Ok(()); + } + } + Err(invalid("large value descriptor의 node를 찾지 못했습니다.")) +} + +fn validate_descriptor(descriptor: &LargeValueDescriptor) -> Result<(), DevupError> { + if descriptor.node_id.is_empty() + || descriptor.field.is_empty() + || descriptor.byte_length == 0 + || descriptor.byte_length > MAX_LARGE_VALUE_BYTES + || descriptor.sha256.len() != 64 + || !descriptor + .sha256 + .bytes() + .all(|byte| byte.is_ascii_hexdigit()) + || descriptor.cursor.next_offset != 0 + || descriptor.cursor.max_chunk_bytes == 0 + || descriptor.cursor.max_chunk_bytes > MAX_LARGE_VALUE_CHUNK_BYTES + { + return Err(invalid( + "large value descriptor의 범위 또는 hash가 올바르지 않습니다.", + )); + } + Ok(()) +} + +fn find_large_value_result(value: &Value) -> Option { + if let Ok(fragment) = serde_json::from_value::(value.clone()) + && !fragment.file_key.is_empty() + && !fragment.node_id.is_empty() + && !fragment.field.is_empty() + { + return Some(LargeValueResult::Fragment(fragment)); + } + if value.get("kind").and_then(Value::as_str) == Some("devupLargeValueUnsupported") + && let Ok(unsupported) = serde_json::from_value::(value.clone()) + { + return Some(LargeValueResult::Unsupported(unsupported)); + } + match value { + Value::Object(object) => object.values().find_map(find_large_value_result), + Value::Array(values) => values.iter().find_map(find_large_value_result), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|value| find_large_value_result(&value)), + _ => None, + } +} + +fn sha256_hex(bytes: &[u8]) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +fn invalid(message: &str) -> DevupError { + DevupError::new(ErrorCode::DevupSnapshotUnsupported, message, false) +} diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs new file mode 100644 index 0000000..3c0ab8f --- /dev/null +++ b/crates/devup-mcp-figma/src/lib.rs @@ -0,0 +1,76 @@ +mod assets; +mod collector; +mod credentials; +mod envelope; +mod errors; +mod explore; +mod large_values; +mod oauth; +mod payload; +mod resources; +mod search; +mod section; +mod snapshot; +mod source; +mod upstream; +mod url; +mod variables; + +pub use collector::{ + CollectedParts, CollectionRequest, CollectionScope, CollectionStats, CollectorSession, + CollectorStep, PlannedCall, ReferencePng, SectionReadOptions, +}; + +pub use credentials::{ + CredentialStore, KeyringCredentialStore, MemoryCredentialStore, StoredAuthorization, +}; +pub use envelope::{ + FastSnapshotPayload, FastThemePayload, FastTransportStats, decode_fast_multi_snapshot, + decode_fast_snapshot, decode_fast_theme, +}; +pub use errors::{DevupError, ErrorCode}; +pub use explore::{ + ExploreBounds, ExploreCandidate, ExploreGroup, ExploreKind, ExploreNode, ExploreOptions, + ExploreResult, TargetKind, classify_explore_node, classify_target, collect_section_notes, + explore_snapshot, +}; +pub use large_values::{ + LargeValueAssembler, LargeValueCursor, LargeValueDescriptor, LargeValueFragment, + LargeValueReadOptions, LargeValueUnsupported, MAX_LARGE_VALUE_BYTES, + MAX_LARGE_VALUE_CHUNK_BYTES, +}; +pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; +pub use payload::{ + CollectedPayload, PayloadCompleteness, PayloadCompletenessReport, PayloadStructure, + ResourceAudit, validate_payload_context, +}; +pub use resources::{ + ResourceKind, ResourceOccurrence, ResourceScope, UsedResourceRefs, collect_used_resource_refs, +}; +pub use search::{SearchOptions, SearchResult, search_snapshot}; +pub use section::{ + BatchLimits, SectionBatch, SectionCandidate, SectionIndex, SectionSummary, build_section_index, + plan_batches, +}; +pub use snapshot::{ + ChildCountMismatch, CompletenessState, Diagnostic, DiagnosticSeverity, FidelityImpact, + FieldLocation, MissingChild, ParentMismatch, RawNode, Snapshot, SnapshotAudit, SnapshotChunk, + TypedNode, merge_chunks, snapshot_chunk_from_result, +}; +pub use source::{ + SelectedSource, SourcePolicy, UpstreamFailureContext, UpstreamFailureKind, + classify_upstream_failure, fallback_allowed, fallback_allowed_for_error, + upstream_failure_error, +}; +pub use upstream::{ + BuiltinScript, ExploreReadOptions, FigmaUpstream, ReadToolCall, RemoteFigmaClient, + SearchReadOptions, SnapshotReadOptions, UpstreamResult, +}; +pub use url::FigmaTarget; +pub use variables::{ResourceBatch, ResourceStyleRef, UnresolvedResource}; +mod metadata; +pub use assets::{ + AssetFormat, AssetManifest, AssetManifestEntry, AssetRequest, AssetSelection, AssetStatus, + MAX_ASSET_BYTES, asset_export_from_result, discover_asset_manifest, resolve_asset_selections, + validate_asset_requests, +}; diff --git a/crates/devup-mcp-figma/src/metadata.rs b/crates/devup-mcp-figma/src/metadata.rs new file mode 100644 index 0000000..5072ffb --- /dev/null +++ b/crates/devup-mcp-figma/src/metadata.rs @@ -0,0 +1,262 @@ +use quick_xml::{Reader, XmlVersion, events::Event}; +use serde::Deserialize; +use serde_json::Value; + +use crate::{DevupError, ErrorCode, UpstreamResult}; + +#[derive(Debug, Clone, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MetadataDocument { + pub file_key: String, + #[serde(default)] + pub version: Option, + pub root_id: String, + #[serde(default)] + pub nodes: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MetadataNode { + pub id: String, + #[serde(rename = "type")] + pub node_type: String, + #[serde(default)] + pub name: Option, + #[serde(default)] + pub children_ids: Vec, + #[serde(default)] + pub descendant_count: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MetadataResult { + Document(MetadataDocument), + TopLevelPages(Vec), +} + +impl MetadataDocument { + pub fn root(&self) -> Option<&MetadataNode> { + self.nodes.iter().find(|node| node.id == self.root_id) + } +} + +pub fn metadata_from_result_for_target( + result: &UpstreamResult, + expected_file_key: &str, + expected_root_id: Option<&str>, +) -> Result { + find_metadata(&result.raw) + .map(MetadataResult::Document) + .or_else(|| { + find_xml_metadata(&result.raw, expected_file_key, expected_root_id) + .map(MetadataResult::Document) + }) + .or_else(|| find_top_level_pages(&result.raw).map(MetadataResult::TopLevelPages)) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답에서 metadata를 찾지 못했습니다.", + false, + ) + }) +} + +fn find_top_level_pages(value: &Value) -> Option> { + match value { + Value::Object(object) => object.values().find_map(find_top_level_pages), + Value::Array(values) => values.iter().find_map(find_top_level_pages), + Value::String(text) => parse_top_level_pages(text), + _ => None, + } +} + +fn parse_top_level_pages(text: &str) -> Option> { + let (_, list) = text.split_once("Top-level pages of the document:")?; + let pages = list + .lines() + .filter_map(|line| { + let item = line.trim().strip_prefix("- ")?; + let id_colon = item.find(':')?; + let separator = item[id_colon + 1..].find(": ")? + id_colon + 1; + let id = &item[..separator]; + let name = &item[separator + 2..]; + let (major, minor) = id.split_once(':')?; + if major.is_empty() + || minor.is_empty() + || !major.bytes().all(|byte| byte.is_ascii_digit()) + || !minor.bytes().all(|byte| byte.is_ascii_digit()) + || name.is_empty() + { + return None; + } + Some(MetadataNode { + id: id.to_owned(), + node_type: "PAGE".to_owned(), + name: Some(name.to_owned()), + children_ids: Vec::new(), + descendant_count: 0, + }) + }) + .collect::>(); + (!pages.is_empty()).then_some(pages) +} + +#[derive(Debug)] +struct XmlNode { + id: String, + node_type: String, + name: Option, + children: Vec, +} + +fn find_xml_metadata( + value: &Value, + expected_file_key: &str, + expected_root_id: Option<&str>, +) -> Option { + match value { + Value::Object(object) => object + .values() + .find_map(|value| find_xml_metadata(value, expected_file_key, expected_root_id)), + Value::Array(values) => values + .iter() + .find_map(|value| find_xml_metadata(value, expected_file_key, expected_root_id)), + Value::String(text) if text.trim_start().starts_with('<') => { + parse_xml_metadata(text, expected_file_key, expected_root_id) + } + _ => None, + } +} + +fn parse_xml_metadata( + text: &str, + expected_file_key: &str, + expected_root_id: Option<&str>, +) -> Option { + if expected_file_key.is_empty() { + return None; + } + let mut reader = Reader::from_str(text); + reader.config_mut().trim_text(true); + let mut nodes = Vec::::new(); + let mut stack = Vec::>::new(); + + loop { + match reader.read_event().ok()? { + Event::Start(element) => { + let index = push_xml_node(&element, &mut nodes, stack.last().copied().flatten()); + stack.push(index); + } + Event::Empty(element) => { + push_xml_node(&element, &mut nodes, stack.last().copied().flatten()); + } + Event::End(_) => { + stack.pop(); + } + Event::Eof => break, + _ => {} + } + } + + if nodes.is_empty() { + return None; + } + let root_index = expected_root_id + .and_then(|expected| nodes.iter().position(|node| node.id == expected)) + .unwrap_or(0); + let root_id = nodes[root_index].id.clone(); + let metadata_nodes = nodes + .iter() + .enumerate() + .map(|(index, node)| MetadataNode { + id: node.id.clone(), + node_type: node.node_type.clone(), + name: node.name.clone(), + children_ids: node + .children + .iter() + .map(|child| nodes[*child].id.clone()) + .collect(), + descendant_count: descendant_count(index, &nodes), + }) + .collect(); + Some(MetadataDocument { + file_key: expected_file_key.to_owned(), + version: None, + root_id, + nodes: metadata_nodes, + }) +} + +fn push_xml_node( + element: &quick_xml::events::BytesStart<'_>, + nodes: &mut Vec, + parent: Option, +) -> Option { + let mut id = None; + let mut name = None; + for attribute in element.attributes().flatten() { + let key = attribute.key.as_ref(); + if key == "id" || key == "name" { + let value = attribute + .normalized_value(XmlVersion::Implicit1_0) + .ok()? + .into_owned(); + if key == "id" { + id = Some(value); + } else { + name = Some(value); + } + } + } + let id = id?; + let index = nodes.len(); + nodes.push(XmlNode { + id, + node_type: element + .name() + .as_ref() + .replace('-', "_") + .to_ascii_uppercase(), + name, + children: Vec::new(), + }); + if let Some(parent) = parent { + nodes[parent].children.push(index); + } + Some(index) +} + +fn descendant_count(index: usize, nodes: &[XmlNode]) -> usize { + 1 + nodes[index] + .children + .iter() + .map(|child| descendant_count(*child, nodes)) + .sum::() +} + +fn find_metadata(value: &Value) -> Option { + if let Ok(document) = serde_json::from_value::(value.clone()) + && !document.file_key.is_empty() + && !document.root_id.is_empty() + { + return Some(document); + } + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Ok(parsed) = serde_json::from_str::(text) + && let Some(document) = find_metadata(&parsed) + { + return Some(document); + } + object.values().find_map(find_metadata) + } + Value::Array(values) => values.iter().find_map(find_metadata), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|parsed| find_metadata(&parsed)), + _ => None, + } +} diff --git a/crates/devup-mcp-figma/src/oauth.rs b/crates/devup-mcp-figma/src/oauth.rs new file mode 100644 index 0000000..171f33a --- /dev/null +++ b/crates/devup-mcp-figma/src/oauth.rs @@ -0,0 +1,468 @@ +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use rand::Rng; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use subtle::ConstantTimeEq; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::TcpListener, +}; +use url::Url; + +use super::{CredentialStore, DevupError, ErrorCode, StoredAuthorization}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum AuthStatus { + Connected, + Disconnected, +} + +pub trait BrowserOpener: Send + Sync { + fn open(&self, authorization_url: &str) -> Result<(), DevupError>; +} + +#[derive(Debug, Clone, Copy, Default)] +pub struct SystemBrowser; + +impl BrowserOpener for SystemBrowser { + fn open(&self, authorization_url: &str) -> Result<(), DevupError> { + webbrowser::open(authorization_url).map_err(|_| { + DevupError::new( + ErrorCode::DevupAuthRequired, + "브라우저를 열지 못했습니다. Figma 인증을 다시 시도하세요.", + true, + ) + })?; + Ok(()) + } +} + +#[derive(Clone)] +pub struct SecretString(String); + +impl SecretString { + pub fn expose(&self) -> &str { + &self.0 + } +} + +impl std::fmt::Debug for SecretString { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("SecretString([REDACTED])") + } +} + +#[derive(Clone)] +pub struct OAuthManager { + endpoint: Url, + store: S, + client: reqwest::Client, + callback_timeout: Duration, +} + +impl OAuthManager { + pub fn with_endpoint(endpoint: impl AsRef, store: S) -> Self { + let endpoint = Url::parse(endpoint.as_ref()).expect("OAuth endpoint must be a valid URL"); + let client = reqwest::Client::builder() + .redirect(reqwest::redirect::Policy::none()) + .timeout(Duration::from_secs(30)) + .build() + .expect("reqwest client configuration is valid"); + Self { + endpoint, + store, + client, + callback_timeout: Duration::from_secs(180), + } + } + + pub fn with_callback_timeout(mut self, timeout: Duration) -> Self { + self.callback_timeout = timeout; + self + } + + pub async fn status(&self) -> Result { + Ok(if self.store.load().await?.is_some() { + AuthStatus::Connected + } else { + AuthStatus::Disconnected + }) + } + + pub async fn logout(&self) -> Result<(), DevupError> { + self.store.clear().await + } + + pub async fn login( + &self, + opener: &dyn BrowserOpener, + ) -> Result { + let metadata = self.discover().await?; + let listener = TcpListener::bind("127.0.0.1:0") + .await + .map_err(callback_error)?; + let redirect_uri = format!( + "http://127.0.0.1:{}/callback", + listener.local_addr().map_err(callback_error)?.port() + ); + + let registration: RegistrationResponse = self + .client + .post(&metadata.registration_endpoint) + .json(&serde_json::json!({ + "client_name": "devup-mcp", + "redirect_uris": [redirect_uri], + "grant_types": ["authorization_code", "refresh_token"], + "response_types": ["code"], + "token_endpoint_auth_method": "none", + "application_type": "native", + "scope": "mcp:connect" + })) + .send() + .await + .map_err(auth_network_error)? + .error_for_status() + .map_err(auth_network_error)? + .json() + .await + .map_err(auth_network_error)?; + + let state = random_urlsafe(32); + let verifier = random_urlsafe(64); + let challenge = URL_SAFE_NO_PAD.encode(Sha256::digest(verifier.as_bytes())); + let mut authorization_url = + Url::parse(&metadata.authorization_endpoint).map_err(|_| invalid_metadata())?; + authorization_url + .query_pairs_mut() + .append_pair("response_type", "code") + .append_pair("client_id", ®istration.client_id) + .append_pair("redirect_uri", &redirect_uri) + .append_pair("scope", "mcp:connect") + .append_pair("state", &state) + .append_pair("code_challenge", &challenge) + .append_pair("code_challenge_method", "S256") + .append_pair("resource", metadata.resource.as_str()); + + opener.open(authorization_url.as_str())?; + let callback = receive_callback(listener, &state, self.callback_timeout).await?; + let token: TokenResponse = self + .client + .post(&metadata.token_endpoint) + .form(&[ + ("grant_type", "authorization_code"), + ("client_id", registration.client_id.as_str()), + ("code", callback.code.as_str()), + ("redirect_uri", redirect_uri.as_str()), + ("code_verifier", verifier.as_str()), + ("resource", metadata.resource.as_str()), + ]) + .send() + .await + .map_err(auth_network_error)? + .error_for_status() + .map_err(auth_network_error)? + .json() + .await + .map_err(auth_network_error)?; + + let authorization = StoredAuthorization { + client_id: registration.client_id, + access_token: token.access_token, + refresh_token: token.refresh_token, + expires_at: token + .expires_in + .map(|seconds| now().saturating_add(seconds)), + scope: token.scope.unwrap_or_else(|| "mcp:connect".to_owned()), + token_endpoint: metadata.token_endpoint, + resource: metadata.resource.to_string(), + }; + self.store.save(&authorization).await?; + Ok(authorization) + } + + pub async fn access_token(&self) -> Result { + let mut authorization = self.store.load().await?.ok_or_else(auth_required)?; + if authorization + .expires_at + .is_some_and(|expires_at| expires_at <= now().saturating_add(30)) + { + authorization = self.refresh(authorization).await?; + } + Ok(SecretString(authorization.access_token)) + } + + async fn refresh( + &self, + mut authorization: StoredAuthorization, + ) -> Result { + let refresh_token = authorization + .refresh_token + .clone() + .ok_or_else(auth_required)?; + let response: TokenResponse = self + .client + .post(&authorization.token_endpoint) + .form(&[ + ("grant_type", "refresh_token"), + ("client_id", authorization.client_id.as_str()), + ("refresh_token", refresh_token.as_str()), + ("resource", authorization.resource.as_str()), + ]) + .send() + .await + .map_err(auth_network_error)? + .error_for_status() + .map_err(|_| auth_required())? + .json() + .await + .map_err(auth_network_error)?; + authorization.access_token = response.access_token; + authorization.refresh_token = response.refresh_token.or(authorization.refresh_token); + authorization.expires_at = response + .expires_in + .map(|seconds| now().saturating_add(seconds)); + if let Some(scope) = response.scope { + authorization.scope = scope; + } + self.store.save(&authorization).await?; + Ok(authorization) + } + + async fn discover(&self) -> Result { + let protected_url = protected_resource_url(&self.endpoint); + let protected: ProtectedResource = self + .client + .get(protected_url) + .send() + .await + .map_err(auth_network_error)? + .error_for_status() + .map_err(auth_network_error)? + .json() + .await + .map_err(auth_network_error)?; + if protected.resource != self.endpoint.as_str() { + return Err(invalid_metadata()); + } + if protected.authorization_servers.is_empty() { + return Err(invalid_metadata()); + } + + let metadata_url = authorization_metadata_url(&self.endpoint); + let metadata: AuthorizationMetadata = self + .client + .get(metadata_url) + .send() + .await + .map_err(auth_network_error)? + .error_for_status() + .map_err(auth_network_error)? + .json() + .await + .map_err(auth_network_error)?; + if !metadata + .code_challenge_methods_supported + .iter() + .any(|method| method == "S256") + { + return Err(invalid_metadata()); + } + for endpoint in [ + &metadata.authorization_endpoint, + &metadata.token_endpoint, + &metadata.registration_endpoint, + ] { + validate_discovered_endpoint(endpoint, self.endpoint.scheme() == "http")?; + } + Ok(OAuthMetadata { + resource: self.endpoint.clone(), + authorization_endpoint: metadata.authorization_endpoint, + token_endpoint: metadata.token_endpoint, + registration_endpoint: metadata.registration_endpoint, + }) + } +} + +#[derive(Debug, Deserialize)] +struct ProtectedResource { + resource: String, + #[serde(default)] + authorization_servers: Vec, +} + +#[derive(Debug, Deserialize)] +struct AuthorizationMetadata { + authorization_endpoint: String, + token_endpoint: String, + registration_endpoint: String, + #[serde(default)] + code_challenge_methods_supported: Vec, +} + +struct OAuthMetadata { + resource: Url, + authorization_endpoint: String, + token_endpoint: String, + registration_endpoint: String, +} + +#[derive(Debug, Deserialize)] +struct RegistrationResponse { + client_id: String, +} + +#[derive(Debug, Deserialize)] +struct TokenResponse { + access_token: String, + refresh_token: Option, + expires_in: Option, + scope: Option, +} + +struct Callback { + code: String, +} + +async fn receive_callback( + listener: TcpListener, + expected_state: &str, + timeout: Duration, +) -> Result { + let (mut stream, _) = tokio::time::timeout(timeout, listener.accept()) + .await + .map_err(|_| { + DevupError::new( + ErrorCode::DevupAuthCallbackTimeout, + "Figma 인증 응답 시간이 초과되었습니다.", + true, + ) + })? + .map_err(callback_error)?; + let mut request = vec![0_u8; 8192]; + let count = stream.read(&mut request).await.map_err(callback_error)?; + let request = std::str::from_utf8(&request[..count]).map_err(|_| auth_required())?; + let target = request + .lines() + .next() + .and_then(|line| line.split_whitespace().nth(1)) + .ok_or_else(auth_required)?; + let url = Url::parse(&format!("http://127.0.0.1{target}")).map_err(|_| auth_required())?; + let values = url + .query_pairs() + .into_owned() + .collect::>(); + let state = values.get("state").ok_or_else(auth_required)?; + if state + .as_bytes() + .ct_eq(expected_state.as_bytes()) + .unwrap_u8() + != 1 + { + let _ = write_callback_response(&mut stream, false).await; + return Err(DevupError::new( + ErrorCode::DevupAuthStateMismatch, + "Figma 인증 state 검증에 실패했습니다.", + false, + )); + } + let code = values.get("code").cloned().ok_or_else(auth_required)?; + write_callback_response(&mut stream, true).await?; + Ok(Callback { code }) +} + +async fn write_callback_response( + stream: &mut tokio::net::TcpStream, + success: bool, +) -> Result<(), DevupError> { + let body = if success { + "Figma 인증이 완료되었습니다. 이 창을 닫아도 됩니다." + } else { + "Figma 인증을 확인할 수 없습니다. 다시 시도하세요." + }; + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", + body.len(), + body + ); + stream + .write_all(response.as_bytes()) + .await + .map_err(callback_error) +} + +fn protected_resource_url(endpoint: &Url) -> Url { + let mut url = endpoint.clone(); + url.set_query(None); + url.set_fragment(None); + url.set_path(&format!( + "/.well-known/oauth-protected-resource{}", + endpoint.path() + )); + url +} + +fn authorization_metadata_url(endpoint: &Url) -> Url { + let mut url = endpoint.clone(); + url.set_query(None); + url.set_fragment(None); + url.set_path("/.well-known/oauth-authorization-server"); + url +} + +fn validate_discovered_endpoint(endpoint: &str, allow_http: bool) -> Result<(), DevupError> { + let endpoint = Url::parse(endpoint).map_err(|_| invalid_metadata())?; + if endpoint.scheme() != "https" + && !(allow_http && endpoint.scheme() == "http" && endpoint.host_str() == Some("127.0.0.1")) + { + return Err(invalid_metadata()); + } + Ok(()) +} + +fn random_urlsafe(bytes: usize) -> String { + let mut value = vec![0_u8; bytes]; + rand::rng().fill_bytes(&mut value); + URL_SAFE_NO_PAD.encode(value) +} + +fn now() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() +} + +fn auth_required() -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "Figma 인증이 필요합니다.", + false, + ) +} + +fn invalid_metadata() -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "Figma OAuth 서버 정보를 검증할 수 없습니다.", + false, + ) +} + +fn auth_network_error(_error: reqwest::Error) -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "Figma OAuth 서버와 통신하지 못했습니다.", + true, + ) +} + +fn callback_error(_error: std::io::Error) -> DevupError { + DevupError::new( + ErrorCode::DevupAuthRequired, + "로컬 Figma 인증 callback을 처리하지 못했습니다.", + true, + ) +} diff --git a/crates/devup-mcp-figma/src/payload.rs b/crates/devup-mcp-figma/src/payload.rs new file mode 100644 index 0000000..f7ba2a4 --- /dev/null +++ b/crates/devup-mcp-figma/src/payload.rs @@ -0,0 +1,237 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; +use sha2::{Digest, Sha256}; + +use crate::{ + AssetManifestEntry, CollectedParts, CollectionScope, CollectionStats, CompletenessState, + DevupError, FigmaTarget, ReferencePng, Snapshot, SnapshotAudit, UpstreamResult, merge_chunks, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum PayloadCompleteness { + FullLocalPlusUsedRemote, + UsedTokens, + ResolvedValuesOnly, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CollectedPayload { + pub target: FigmaTarget, + pub scope: CollectionScope, + pub metadata: Value, + pub snapshot: Snapshot, + pub variables: Option, + pub styles: Option, + pub completeness: PayloadCompleteness, + pub source_version: Option, + #[serde(default)] + pub stats: CollectionStats, + #[serde(default)] + pub assets: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reference_png: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourceAudit { + pub state: CompletenessState, + pub unresolved_count: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PayloadCompletenessReport { + pub state: CompletenessState, + pub snapshot: SnapshotAudit, + pub resources: ResourceAudit, +} + +impl CollectedPayload { + pub fn completeness_report(&self) -> PayloadCompletenessReport { + let snapshot = self.snapshot.audit(); + let unresolved_count = self + .variables + .as_ref() + .and_then(|result| find_unresolved_count(&result.raw)) + .unwrap_or_else(|| { + self.snapshot + .diagnostics + .iter() + .filter(|diagnostic| diagnostic.code == "DEVUP_RESOURCE_UNRESOLVED") + .count() + }); + let resources = ResourceAudit { + state: if unresolved_count == 0 { + CompletenessState::Complete + } else { + CompletenessState::Partial + }, + unresolved_count, + }; + let state = if snapshot.state == CompletenessState::Failed { + CompletenessState::Failed + } else if snapshot.state == CompletenessState::Partial + || resources.state == CompletenessState::Partial + { + CompletenessState::Partial + } else { + CompletenessState::Complete + }; + PayloadCompletenessReport { + state, + snapshot, + resources, + } + } +} + +fn find_unresolved_count(value: &Value) -> Option { + match value { + Value::Object(object) => { + if let Some(unresolved) = object.get("unresolved").and_then(Value::as_array) { + return Some(unresolved.len()); + } + object.values().find_map(find_unresolved_count) + } + Value::Array(values) => values.iter().find_map(find_unresolved_count), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|value| find_unresolved_count(&value)), + Value::Null | Value::Bool(_) | Value::Number(_) => None, + } +} + +impl TryFrom for CollectedPayload { + type Error = DevupError; + + fn try_from(parts: CollectedParts) -> Result { + let snapshot = merge_chunks(parts.snapshot_chunks)?; + let completeness = if parts.variables.is_some() { + PayloadCompleteness::UsedTokens + } else { + PayloadCompleteness::ResolvedValuesOnly + }; + Ok(Self { + target: parts.target, + scope: parts.scope, + metadata: parts.metadata, + snapshot, + variables: parts.variables, + styles: parts.styles, + completeness, + source_version: parts.source_version, + stats: parts.stats, + assets: parts.assets, + reference_png: parts.reference_png, + }) + } +} + +pub fn validate_payload_context( + payload: &CollectedPayload, + expected_target: &FigmaTarget, +) -> Result<(), DevupError> { + if &payload.target != expected_target + || payload.snapshot.file_key != expected_target.file_key + || expected_target + .node_id + .as_ref() + .is_some_and(|node_id| !payload.snapshot.roots.iter().any(|root| root == node_id)) + { + return Err(DevupError::new( + crate::ErrorCode::DevupFigmaHandoffInvalid, + "Figma payload가 요청한 파일 또는 node와 일치하지 않습니다.", + false, + )); + } + Ok(()) +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PayloadStructure { + pub metadata_shape: Value, + pub variable_shape: Option, + pub style_shape: Option, + pub node_fields: BTreeMap>, + pub node_count: usize, + pub field_error_count: usize, + pub schema_hash: String, +} + +impl PayloadStructure { + pub fn from_payload(payload: &CollectedPayload) -> Self { + let mut node_fields: BTreeMap> = BTreeMap::new(); + let mut field_error_count = 0; + for node in payload.snapshot.nodes.values() { + let fields = node_fields.entry(node.node_type.clone()).or_default(); + for (name, value) in node.fields.iter().chain(&node.extra) { + fields.insert(name.clone(), json_shape(value)); + } + for name in node.field_errors.keys() { + fields.insert(name.clone(), json!("error")); + field_error_count += 1; + } + } + let metadata_shape = json_shape(&payload.metadata); + let variable_shape = payload + .variables + .as_ref() + .map(|result| json_shape(&result.raw)); + let style_shape = payload + .styles + .as_ref() + .map(|result| json_shape(&result.raw)); + let schema = json!({ + "metadata": &metadata_shape, + "variables": &variable_shape, + "styles": &style_shape, + "nodeFields": &node_fields, + }); + let schema_hash = sha256_hex(serde_json::to_vec(&schema).unwrap_or_default()); + Self { + metadata_shape, + variable_shape, + style_shape, + node_fields, + node_count: payload.snapshot.nodes.len(), + field_error_count, + schema_hash, + } + } +} + +fn json_shape(value: &Value) -> Value { + match value { + Value::Null => json!("null"), + Value::Bool(_) => json!("boolean"), + Value::Number(_) => json!("number"), + Value::String(_) => json!("string"), + Value::Array(values) => { + let unique = values + .iter() + .map(json_shape) + .map(|shape| serde_json::to_string(&shape).unwrap_or_default()) + .collect::>(); + json!({ "array": unique }) + } + Value::Object(object) => Value::Object( + object + .iter() + .map(|(name, value)| (name.clone(), json_shape(value))) + .collect::>(), + ), + } +} + +fn sha256_hex(bytes: Vec) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} diff --git a/crates/devup-mcp-figma/src/plugin_api_manifest.json b/crates/devup-mcp-figma/src/plugin_api_manifest.json new file mode 100644 index 0000000..0bbbd62 --- /dev/null +++ b/crates/devup-mcp-figma/src/plugin_api_manifest.json @@ -0,0 +1,25 @@ +[ + "absoluteBoundingBox", "absoluteRenderBounds", "annotations", "arcData", "attachedConnectors", + "authorVisible", "backgrounds", "backgroundStyleId", "blendMode", "bottomLeftRadius", + "bottomRightRadius", "boundVariables", "characters", "clipsContent", "componentDescription", + "componentProperties", "componentPropertyDefinitions", "componentPropertyReferences", "componentSetId", "componentSetProperties", + "constraints", "cornerRadius", "cornerSmoothing", "counterAxisAlignContent", "counterAxisAlignItems", + "counterAxisSizingMode", "dashPattern", "description", "detachedInfo", "devStatus", "documentationLinks", "effects", + "effectStyleId", "expanded", "explicitVariableModes", "exportSettings", "exposedInstances", "fills", "fillStyleId", + "fontName", "fontSize", "gridColumnAnchorIndex", "gridColumnCount", "gridColumnGap", "gridColumnSpan", + "gridRowAnchorIndex", "gridRowCount", "gridRowGap", "gridRowSpan", "gridStyleId", "guides", "height", + "hyperlink", "inferredAutoLayout", "isAsset", "isExposedInstance", "isMask", "isMaskOutline", "itemReverseZIndex", + "itemSpacing", "layoutAlign", "layoutGrids", "layoutGrow", "layoutMode", "layoutPositioning", + "layoutSizingHorizontal", "layoutSizingVertical", "layoutWrap", "letterSpacing", "lineHeight", + "locked", "mainAxisAlignItems", "mainAxisSizingMode", "maskType", "maxHeight", "maxWidth", "measurements", + "minHeight", "minWidth", "name", "numberOfFixedChildren", "opacity", "overlayBackground", + "overlayBackgroundInteraction", "overlayPositionType", "overflowDirection", "paddingBottom", "paddingLeft", "paddingRight", + "paddingTop", "paragraphIndent", "paragraphSpacing", "paragraphSpacingMode", "pluginData", "primaryAxisAlignItems", "reactions", + "relativeTransform", "remote", "removed", "resizeHandlePlacement", "resolvedVariableModes", "rotation", + "scrollBehavior", "sharedPluginData", "strokes", "strokeAlign", "strokeBottomWeight", "strokeCap", + "strokeJoin", "strokeLeftWeight", "strokeMiterLimit", "strokeRightWeight", "strokeStyleId", + "strokeTopWeight", "strokeWeight", "stuckNodes", "targetAspectRatio", "textAlignHorizontal", + "textAlignVertical", "textAutoResize", "textCase", "textDecoration", "textStyleId", "topLeftRadius", + "topRightRadius", "triggeredInteractions", "truncation", "variantProperties", "vectorNetwork", "visible", + "width", "x", "y" +] diff --git a/crates/devup-mcp-figma/src/resources.rs b/crates/devup-mcp-figma/src/resources.rs new file mode 100644 index 0000000..dd91be2 --- /dev/null +++ b/crates/devup-mcp-figma/src/resources.rs @@ -0,0 +1,174 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +use crate::{ResourceStyleRef, SnapshotChunk}; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ResourceScope { + #[default] + None, + Used, + File, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ResourceKind { + Variable, + Style, +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourceOccurrence { + pub node_id: String, + pub field: String, + pub resource_id: String, + pub resource_kind: ResourceKind, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub style_type: Option, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct UsedResourceRefs { + pub variable_ids: Vec, + pub styles: Vec, + pub occurrences: Vec, +} + +pub fn collect_used_resource_refs(chunks: &[SnapshotChunk]) -> UsedResourceRefs { + let mut variable_ids = BTreeSet::new(); + let mut styles = BTreeMap::::new(); + let mut occurrences = BTreeSet::new(); + + for chunk in chunks { + for node in &chunk.nodes { + for (field, value) in node.fields.iter().chain(&node.extra) { + scan_value( + &node.id, + field, + value, + &mut variable_ids, + &mut styles, + &mut occurrences, + ); + } + } + } + + UsedResourceRefs { + variable_ids: variable_ids.into_iter().collect(), + styles: styles + .into_iter() + .map(|(id, style_type)| ResourceStyleRef { + id, + style_type, + consumer_start: None, + consumer_end: None, + }) + .collect(), + occurrences: occurrences.into_iter().collect(), + } +} + +fn scan_value( + node_id: &str, + path: &str, + value: &Value, + variable_ids: &mut BTreeSet, + styles: &mut BTreeMap, + occurrences: &mut BTreeSet, +) { + match value { + Value::Object(object) => { + if object.get("type").and_then(Value::as_str) == Some("VARIABLE_ALIAS") + && let Some(id) = object.get("id").and_then(Value::as_str) + && is_resource_id(id) + { + variable_ids.insert(id.to_owned()); + occurrences.insert(ResourceOccurrence { + node_id: node_id.to_owned(), + field: path.to_owned(), + resource_id: id.to_owned(), + resource_kind: ResourceKind::Variable, + style_type: None, + }); + } + + for (field, child) in object { + let child_path = format!("{path}.{field}"); + if let Some(style_type) = style_type_for_field(field) + && let Some(id) = child.as_str() + && is_resource_id(id) + { + styles + .entry(id.to_owned()) + .or_insert_with(|| style_type.to_owned()); + occurrences.insert(ResourceOccurrence { + node_id: node_id.to_owned(), + field: child_path.clone(), + resource_id: id.to_owned(), + resource_kind: ResourceKind::Style, + style_type: Some(style_type.to_owned()), + }); + } + scan_value( + node_id, + &child_path, + child, + variable_ids, + styles, + occurrences, + ); + } + } + Value::Array(values) => { + for (index, child) in values.iter().enumerate() { + scan_value( + node_id, + &format!("{path}[{index}]"), + child, + variable_ids, + styles, + occurrences, + ); + } + } + Value::String(id) => { + if let Some(field) = path.rsplit(['.', '[']).next() + && let Some(style_type) = style_type_for_field(field) + && is_resource_id(id) + { + styles + .entry(id.to_owned()) + .or_insert_with(|| style_type.to_owned()); + occurrences.insert(ResourceOccurrence { + node_id: node_id.to_owned(), + field: path.to_owned(), + resource_id: id.to_owned(), + resource_kind: ResourceKind::Style, + style_type: Some(style_type.to_owned()), + }); + } + } + Value::Null | Value::Bool(_) | Value::Number(_) => {} + } +} + +fn style_type_for_field(field: &str) -> Option<&'static str> { + match field { + "textStyleId" => Some("TEXT"), + "fillStyleId" | "strokeStyleId" | "backgroundStyleId" => Some("PAINT"), + "effectStyleId" => Some("EFFECT"), + "gridStyleId" => Some("GRID"), + _ => None, + } +} + +fn is_resource_id(id: &str) -> bool { + !id.is_empty() && id != "figma.mixed" && id != "MIXED" +} diff --git a/crates/devup-mcp-figma/src/scripts/assets.js b/crates/devup-mcp-figma/src/scripts/assets.js new file mode 100644 index 0000000..11ef730 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/assets.js @@ -0,0 +1,72 @@ +const options = "__DEVUP_ASSET__"; +"__DEVUP_LARGE_VALUE_HELPERS__"; + +function failed(errorCode) { + return { + kind: "devupAssetExport", + fileKey: figma.fileKey || "", + version: options.version, + assetId: options.assetId, + nodeId: options.nodeId, + field: options.field, + imageHash: options.imageHash, + format: options.format, + scale: options.scale, + status: "failed", + byteLength: null, + sha256: null, + errorCode, + }; +} + +try { + const node = await figma.getNodeByIdAsync(options.nodeId); + if (!node || typeof node.exportAsync !== "function") { + return failed("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM"); + } + if (typeof options.field === "string" && options.field.startsWith("fills/")) { + const index = Number(options.field.slice("fills/".length)); + const fills = "fills" in node && Array.isArray(node.fills) ? node.fills : []; + const paint = Number.isInteger(index) ? fills[index] : null; + const imageHash = paint && paint.type === "IMAGE" ? paint.imageHash || paint.imageRef : null; + if (!paint || imageHash !== options.imageHash) { + return failed("DEVUP_ASSET_SOURCE_CHANGED"); + } + } else if (options.field !== "node") { + return failed("DEVUP_ASSET_FIELD_UNSUPPORTED"); + } + + const format = String(options.format || "").toUpperCase(); + if (!["PNG", "JPG", "SVG", "PDF"].includes(format)) { + return failed("DEVUP_ASSET_FORMAT_UNSUPPORTED"); + } + const scale = Math.min(4, Math.max(1, Math.floor(Number(options.scale) || 1))); + const settings = { format }; + if (format === "PNG" || format === "JPG") { + settings.constraint = { type: "SCALE", value: scale }; + } + const exported = await node.exportAsync(settings); + const bytes = exported instanceof Uint8Array ? exported : new Uint8Array(exported); + if (bytes.length === 0 || bytes.length > 8 * 1024 * 1024) { + return failed("DEVUP_ASSET_RESPONSE_TOO_LARGE"); + } + const sha256 = devupSha256(bytes); + figma.io.write(`devup-asset-${options.assetId.replace(/[^A-Za-z0-9_-]/g, "_")}.${String(options.format).toLowerCase()}`, bytes); + return { + kind: "devupAssetExport", + fileKey: figma.fileKey || "", + version: options.version, + assetId: options.assetId, + nodeId: options.nodeId, + field: options.field, + imageHash: options.imageHash, + format: options.format, + scale, + status: "exported", + byteLength: bytes.length, + sha256, + errorCode: null, + }; +} catch (_) { + return failed("DEVUP_ASSET_EXPORT_FAILED"); +} diff --git a/crates/devup-mcp-figma/src/scripts/explore.js b/crates/devup-mcp-figma/src/scripts/explore.js new file mode 100644 index 0000000..183e0a8 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/explore.js @@ -0,0 +1,179 @@ +const anchor = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); +if (!anchor) throw new Error("DEVUP_NODE_NOT_FOUND"); + +const options = "__DEVUP_EXPLORE__"; +const projectionLimit = Math.max(20, Math.min( + 400, + Number.isInteger(options.projectionLimit) ? options.projectionLimit : 200, +)); +const textPreviewLimit = Math.max(0, Math.min( + 500, + Number.isInteger(options.textPreviewLimit) ? options.textPreviewLimit : 160, +)); + +let anchorPeer = anchor; +while (anchorPeer.parent && anchorPeer.parent.type !== "PAGE") anchorPeer = anchorPeer.parent; +let current = anchorPeer.parent; +while (current && current.type !== "PAGE") current = current.parent; +const page = anchor.type === "PAGE" ? anchor : current; +if (!page || page.type !== "PAGE") throw new Error("DEVUP_PAGE_NOT_FOUND"); +await figma.setCurrentPageAsync(page); + +function bounds(node) { + const absolute = node.absoluteBoundingBox; + const value = absolute || { + x: typeof node.x === "number" ? node.x : 0, + y: typeof node.y === "number" ? node.y : 0, + width: typeof node.width === "number" ? node.width : 0, + height: typeof node.height === "number" ? node.height : 0, + }; + if (![value.x, value.y, value.width, value.height].every(Number.isFinite)) return null; + return { x: value.x, y: value.y, width: value.width, height: value.height }; +} + +function horizontalOverlap(left, right) { + return Math.min(left.x + left.width, right.x + right.width) - Math.max(left.x, right.x); +} + +function textPreview(node) { + if (textPreviewLimit === 0) return ""; + const values = []; + const queue = [node]; + let visited = 0; + while (queue.length && visited < 80 && values.join(" ").length < textPreviewLimit) { + const candidate = queue.shift(); + visited += 1; + if (candidate.type === "TEXT" && typeof candidate.characters === "string") { + values.push(candidate.characters.replace(/\s+/gu, " ").trim()); + } + if ("children" in candidate) queue.push(...candidate.children.slice(0, 40)); + } + return values.filter(Boolean).join(" ").slice(0, textPreviewLimit); +} + +function breadcrumb(node) { + const names = []; + let current = node; + while (current && current.type !== "DOCUMENT") { + if (typeof current.name === "string" && current.name) names.push(current.name); + current = current.parent; + } + return names.reverse(); +} + +const anchorBounds = bounds(anchorPeer) || bounds(anchor); +if (!anchorBounds) throw new Error("DEVUP_NODE_BOUNDS_UNAVAILABLE"); +const pageChildren = "children" in page ? page.children : []; +const eligible = pageChildren + .map((node, pageChildIndex) => ({ node, pageChildIndex, bounds: bounds(node) })) + .filter((entry) => entry.bounds) + .filter((entry) => { + if (entry.node.id === anchorPeer.id) return true; + const verticallyNear = entry.bounds.y >= anchorBounds.y - 240 + && entry.bounds.y <= anchorBounds.y + 12000; + return verticallyNear && horizontalOverlap(entry.bounds, anchorBounds) > 0; + }) + .sort((left, right) => + left.bounds.y - right.bounds.y + || left.bounds.x - right.bounds.x + || left.node.id.localeCompare(right.node.id), + ); +const selected = anchor.type === "SECTION" + ? eligible.filter((entry) => entry.node.id === anchorPeer.id) + : eligible.slice(0, projectionLimit); +const included = new Map(selected.map((entry) => [entry.node.id, entry])); +if (!included.has(anchorPeer.id)) { + included.set(anchorPeer.id, { node: anchorPeer, pageChildIndex: -1, bounds: bounds(anchorPeer) }); +} +if (!included.has(anchor.id)) { + included.set(anchor.id, { node: anchor, pageChildIndex: -1, bounds: bounds(anchor) }); +} +if ("children" in anchor) { + for (const child of anchor.children.slice(0, projectionLimit)) { + if (!included.has(child.id)) { + included.set(child.id, { node: child, pageChildIndex: -1, bounds: bounds(child) }); + } + } +} +let sectionTraversalTruncated = false; +if (anchor.type === "SECTION" && "children" in anchor) { + const sectionQueue = [...anchor.children]; + let visited = 0; + const traversalLimit = projectionLimit * 8; + while (sectionQueue.length && visited < traversalLimit) { + const node = sectionQueue.shift(); + visited += 1; + if (!included.has(node.id)) { + included.set(node.id, { node, pageChildIndex: -1, bounds: bounds(node) }); + } + if ("children" in node) sectionQueue.push(...node.children); + } + sectionTraversalTruncated = sectionQueue.length > 0; +} + +const compact = [...included.values()] + .filter((entry) => entry.bounds) + .slice(0, projectionLimit + 2) + .map(({ node, pageChildIndex, bounds: box }) => ({ + id: node.id, + type: node.type, + fields: { + name: typeof node.name === "string" ? node.name : "", + parentId: node.parent && node.parent.type !== "DOCUMENT" ? node.parent.id : null, + childrenIds: [], + x: box.x, + y: box.y, + width: box.width, + height: box.height, + childCount: "children" in node ? node.children.length : 0, + textPreview: textPreview(node), + pageChildIndex: pageChildIndex >= 0 ? pageChildIndex : null, + visible: node.visible !== false, + breadcrumb: breadcrumb(node), + }, + extra: {}, + fieldErrors: {}, + })); + +const projectedBounds = compact.reduce((result, node) => { + const box = node.fields; + if (!result) return { x: box.x, y: box.y, right: box.x + box.width, bottom: box.y + box.height }; + return { + x: Math.min(result.x, box.x), + y: Math.min(result.y, box.y), + right: Math.max(result.right, box.x + box.width), + bottom: Math.max(result.bottom, box.y + box.height), + }; +}, null) || { x: 0, y: 0, right: 0, bottom: 0 }; +const projectionTruncated = (anchor.type !== "SECTION" && eligible.length > selected.length) + || included.size > projectionLimit + 2 + || sectionTraversalTruncated; +const pageNode = { + id: page.id, + type: page.type, + fields: { + name: page.name, + parentId: null, + childrenIds: [], + x: projectedBounds.x, + y: projectedBounds.y, + width: projectedBounds.right - projectedBounds.x, + height: projectedBounds.bottom - projectedBounds.y, + childCount: pageChildren.length, + textPreview: "", + projectionTruncated, + visible: page.visible !== false, + breadcrumb: breadcrumb(page), + pageChildIndex: null, + }, + extra: {}, + fieldErrors: {}, +}; + +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: [page.id], + nodes: [pageNode, ...compact.filter((node) => node.id !== page.id)], + diagnostics: [], +}; diff --git a/crates/devup-mcp-figma/src/scripts/fast_snapshot.js b/crates/devup-mcp-figma/src/scripts/fast_snapshot.js new file mode 100644 index 0000000..78450bc --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/fast_snapshot.js @@ -0,0 +1,432 @@ +"__DEVUP_SECTION_INDEX_PROBE__"; + +const requestedRootIds = "__DEVUP_ROOT_IDS__"; +if (!Array.isArray(requestedRootIds) || requestedRootIds.length === 0) { + throw new Error("DEVUP_ROOTS_INVALID"); +} +const roots = await Promise.all(requestedRootIds.map((id) => figma.getNodeByIdAsync(id))); +if (roots.some((root) => !root)) throw new Error("DEVUP_NODE_NOT_FOUND"); +const envelopeRootId = "__DEVUP_NODE_ID__"; + +const manifest = "__DEVUP_PLUGIN_API_MANIFEST__"; +const manifestSet = new Set(manifest); +const textSegmentManifest = "__DEVUP_TEXT_SEGMENT_MANIFEST__"; +const skipped = new Set(["id", "type", "parent", "children"]); +const MAX_ENVELOPE_BYTES = 8 * 1024 * 1024; +const MAX_ENVELOPE_CHUNK_BYTES = 512 * 1024; +const MAX_INLINE_FIELD_BYTES = 64 * 1024; + +"__DEVUP_LARGE_VALUE_HELPERS__"; + +function propertyNames(value) { + const names = new Set(); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + for (const name of manifest) { + try { + if (name in value) names.add(name); + } catch (_) {} + } + return [...names].sort(); +} + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if ( + typeof value === "object" && + "parent" in value && + typeof value.id === "string" && + typeof value.type === "string" + ) { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) { + return { $binary: value.constructor.name, byteLength: value.byteLength }; + } + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + for (const key of Object.keys(value).sort()) { + try { + const serialized = serialize(value[key], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[key] = serialized; + } catch (error) { + result[key] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +function serializeField(nodeId, field, value, fieldErrors) { + const serialized = serialize(value); + const bytes = devupUtf8Encode(JSON.stringify(serialized)); + if (bytes.length <= MAX_INLINE_FIELD_BYTES) return serialized; + const descriptor = devupLargeValueDescriptor(nodeId, field, serialized); + if (descriptor.$truncated) { + fieldErrors[field] = + `DEVUP_FIELD_VALUE_UNSUPPORTED:${bytes.length}>${DEVUP_MAX_LARGE_VALUE_BYTES}`; + } + return descriptor; +} + +function snapshotNode(node) { + const fields = {}; + const extra = {}; + const fieldErrors = {}; + fields.parentId = node.parent ? node.parent.id : null; + fields.childrenIds = "children" in node ? node.children.map((child) => child.id) : []; + + for (const name of propertyNames(node)) { + if (skipped.has(name) || name.startsWith("_")) continue; + try { + const value = node[name]; + if (typeof value === "function") continue; + const serialized = serializeField(node.id, name, value, fieldErrors); + (manifestSet.has(name) ? fields : extra)[name] = serialized; + } catch (error) { + fieldErrors[name] = String(error && error.message ? error.message : error); + } + } + if (node.type === "TEXT" && typeof node.getStyledTextSegments === "function") { + try { + fields.styledTextSegments = serializeField( + node.id, + "styledTextSegments", + node.getStyledTextSegments(textSegmentManifest), + fieldErrors, + ); + } catch (error) { + fieldErrors.styledTextSegments = String(error && error.message ? error.message : error); + } + } + return { id: node.id, type: node.type, fields, extra, fieldErrors }; +} + +const allNodes = []; +const queue = [...roots]; +const visitedNodeIds = new Set(); +for (let index = 0; index < queue.length; index += 1) { + const node = queue[index]; + if (visitedNodeIds.has(node.id)) continue; + visitedNodeIds.add(node.id); + allNodes.push(node); + if ("children" in node) queue.push(...node.children); +} +const nodes = allNodes.map(snapshotNode); + +function styleTypeForField(field) { + if (field === "textStyleId") return "TEXT"; + if (["fillStyleId", "strokeStyleId", "backgroundStyleId"].includes(field)) return "PAINT"; + if (field === "effectStyleId") return "EFFECT"; + if (field === "gridStyleId") return "GRID"; + return null; +} + +const variableIds = new Set(); +const styleTypes = new Map(); +function scanResources(value, fieldName = "") { + if (Array.isArray(value)) { + for (const child of value) scanResources(child, fieldName); + return; + } + if (!value || typeof value !== "object") return; + if ( + value.type === "VARIABLE_ALIAS" && + typeof value.id === "string" && + value.id && + value.id !== "figma.mixed" && + value.id !== "MIXED" + ) { + variableIds.add(value.id); + } + for (const [field, child] of Object.entries(value)) { + const styleType = styleTypeForField(field); + if ( + styleType && + typeof child === "string" && + child && + child !== "figma.mixed" && + child !== "MIXED" + ) { + if (!styleTypes.has(child)) styleTypes.set(child, styleType); + } + scanResources(child, field || fieldName); + } +} +scanResources(nodes); + +function resourcePropertyNames(value) { + const names = new Set(Object.keys(value)); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + return [...names].sort(); +} + +function serializeResource(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if ( + typeof value === "object" && + "parent" in value && + typeof value.id === "string" && + typeof value.type === "string" + ) { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) { + return value.map((item) => serializeResource(item, seen, depth + 1)); + } + if (ArrayBuffer.isView(value)) { + return { $binary: value.constructor.name, byteLength: value.byteLength }; + } + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + for (const name of resourcePropertyNames(value)) { + if (name.startsWith("_") || ["parent", "children", "consumers"].includes(name)) continue; + try { + const serialized = serializeResource(value[name], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[name] = serialized; + } catch (_) { + result[name] = { $error: "unavailable" }; + } + } + seen.delete(value); + return result; +} + +const sortedVariableIds = [...variableIds].sort(); +const sortedStyles = [...styleTypes.entries()] + .map(([id, styleType]) => ({ id, styleType })) + .sort((left, right) => left.id.localeCompare(right.id)); +const variableJobs = sortedVariableIds.map(async (id) => { + try { + const variable = await figma.variables.getVariableByIdAsync(id); + return variable + ? { + kind: "variable", + value: serializeResource(variable), + collectionId: variable.variableCollectionId, + } + : { kind: "unresolved", value: { id, kind: "variable", reason: "notFoundOrUnavailable" } }; + } catch (_) { + return { kind: "unresolved", value: { id, kind: "variable", reason: "notFoundOrUnavailable" } }; + } +}); +const styleJobs = sortedStyles.map(async ({ id, styleType }) => { + try { + const style = await figma.getStyleByIdAsync(id); + if (!style) { + return { kind: "unresolved", value: { id, kind: "style", reason: "notFoundOrUnavailable" } }; + } + return { + kind: "style", + value: { + ...serializeResource(style), + styleType, + value: serializeResource( + styleType === "PAINT" + ? style.paints + : styleType === "EFFECT" + ? style.effects + : styleType === "GRID" + ? style.layoutGrids + : style, + ), + }, + }; + } catch (_) { + return { kind: "unresolved", value: { id, kind: "style", reason: "notFoundOrUnavailable" } }; + } +}); +const resourceResults = await Promise.all([...variableJobs, ...styleJobs]); +const collectionIds = [...new Set(resourceResults + .filter((result) => result.kind === "variable" && result.collectionId) + .map((result) => result.collectionId))].sort(); +const collectionJobs = collectionIds.map(async (id) => { + try { + const collection = await figma.variables.getVariableCollectionByIdAsync(id); + return collection ? serializeResource(collection) : null; + } catch (_) { + return null; + } +}); +const collections = (await Promise.all(collectionJobs)).filter((collection) => collection !== null); +const variables = resourceResults + .filter((result) => result.kind === "variable") + .map((result) => result.value); +const styles = resourceResults + .filter((result) => result.kind === "style") + .map((result) => result.value); +const unresolved = resourceResults + .filter((result) => result.kind === "unresolved") + .map((result) => result.value); + +function utf8Encode(value) { + const bytes = []; + for (let index = 0; index < value.length; index += 1) { + let codePoint = value.charCodeAt(index); + if (codePoint >= 0xd800 && codePoint <= 0xdbff) { + const next = index + 1 < value.length ? value.charCodeAt(index + 1) : 0; + if (next >= 0xdc00 && next <= 0xdfff) { + codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (next - 0xdc00); + index += 1; + } else { + codePoint = 0xfffd; + } + } else if (codePoint >= 0xdc00 && codePoint <= 0xdfff) { + codePoint = 0xfffd; + } + + if (codePoint < 0x80) { + bytes.push(codePoint); + } else if (codePoint < 0x800) { + bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f)); + } else if (codePoint < 0x10000) { + bytes.push( + 0xe0 | (codePoint >> 12), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } else { + bytes.push( + 0xf0 | (codePoint >> 18), + 0x80 | ((codePoint >> 12) & 0x3f), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } + } + return new Uint8Array(bytes); +} + +const envelope = { + schemaVersion: 1, + source: { fileKey: figma.fileKey || "", rootId: envelopeRootId }, + snapshot: { + fileKey: figma.fileKey || "", + version: null, + rootIds: roots.map((root) => root.id), + nodes, + diagnostics: [], + }, + resources: { + collections, + variables, + styles, + usedRemoteVariables: variables.filter((variable) => variable.remote === true), + usedVariableIds: sortedVariableIds, + usedStyleIds: sortedStyles.map((style) => style.id), + localComplete: false, + usedRemoteComplete: unresolved.length === 0, + unresolved, + }, + integrity: { + nodeCount: nodes.length, + variableRefCount: sortedVariableIds.length, + styleRefCount: sortedStyles.length, + utf8Bytes: 0, + }, +}; + +let envelopeBytes = new Uint8Array(); +for (let attempt = 0; attempt < 8; attempt += 1) { + envelopeBytes = utf8Encode(JSON.stringify(envelope)); + if (envelope.integrity.utf8Bytes === envelopeBytes.length) break; + envelope.integrity.utf8Bytes = envelopeBytes.length; +} +envelopeBytes = utf8Encode(JSON.stringify(envelope)); +if (envelope.integrity.utf8Bytes !== envelopeBytes.length) { + throw new Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE"); +} +if (envelopeBytes.length > MAX_ENVELOPE_BYTES) { + throw new Error("DEVUP_ENVELOPE_TOO_LARGE"); +} + +function crc32(bytes) { + let crc = 0xffffffff; + for (const byte of bytes) { + crc ^= byte; + for (let bit = 0; bit < 8; bit += 1) { + crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1)); + } + } + return (crc ^ 0xffffffff) >>> 0; +} + +function u32(value) { + return new Uint8Array([ + (value >>> 24) & 0xff, + (value >>> 16) & 0xff, + (value >>> 8) & 0xff, + value & 0xff, + ]); +} + +function ascii(value) { + return new Uint8Array([...value].map((character) => character.charCodeAt(0))); +} + +function concat(parts) { + const length = parts.reduce((sum, part) => sum + part.length, 0); + const output = new Uint8Array(length); + let offset = 0; + for (const part of parts) { + output.set(part, offset); + offset += part.length; + } + return output; +} + +function pngChunk(type, data) { + const typeBytes = ascii(type); + return concat([u32(data.length), typeBytes, data, u32(crc32(concat([typeBytes, data])))]); +} + +const chunkCount = Math.ceil(envelopeBytes.length / MAX_ENVELOPE_CHUNK_BYTES); +for (let sequence = 0; sequence < chunkCount; sequence += 1) { + const start = sequence * MAX_ENVELOPE_CHUNK_BYTES; + const end = Math.min(envelopeBytes.length, start + MAX_ENVELOPE_CHUNK_BYTES); + const envelopeChunk = pngChunk( + "duVp", + concat([u32(sequence), u32(chunkCount), envelopeBytes.slice(start, end)]), + ); + const png = concat([ + new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]), + pngChunk("IHDR", new Uint8Array([0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0])), + envelopeChunk, + pngChunk( + "IDAT", + new Uint8Array([120, 1, 1, 5, 0, 250, 255, 0, 0, 0, 0, 0, 5, 0, 1]), + ), + pngChunk("IEND", new Uint8Array()), + ]); + figma.io.write(`devup-fast-snapshot-${sequence + 1}-of-${chunkCount}.png`, png); +} +return { + kind: "devupFastSnapshotDescriptor", + schemaVersion: 1, + rootId: envelopeRootId, + nodeCount: nodes.length, + variableRefCount: sortedVariableIds.length, + styleRefCount: sortedStyles.length, + utf8Bytes: envelopeBytes.length, + chunkCount, +}; diff --git a/crates/devup-mcp-figma/src/scripts/fast_theme.js b/crates/devup-mcp-figma/src/scripts/fast_theme.js new file mode 100644 index 0000000..68c0d03 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/fast_theme.js @@ -0,0 +1,323 @@ +const MAX_ENVELOPE_BYTES = 8 * 1024 * 1024; +const MAX_ENVELOPE_CHUNK_BYTES = 512 * 1024; + +function propertyNames(value) { + const names = new Set(Object.keys(value)); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + return [...names].sort(); +} + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if ( + typeof value === "object" && + "parent" in value && + typeof value.id === "string" && + typeof value.type === "string" + ) { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) { + return { $binary: value.constructor.name, byteLength: value.byteLength }; + } + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const output = {}; + for (const name of propertyNames(value)) { + if (name.startsWith("_") || ["parent", "children", "consumers"].includes(name)) continue; + try { + const serialized = serialize(value[name], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) output[name] = serialized; + } catch (_) { + output[name] = { $error: "unavailable" }; + } + } + seen.delete(value); + return output; +} + +function styleTypeForField(field) { + if (field === "textStyleId") return "TEXT"; + if (["fillStyleId", "strokeStyleId", "backgroundStyleId"].includes(field)) return "PAINT"; + if (field === "effectStyleId") return "EFFECT"; + if (field === "gridStyleId") return "GRID"; + return null; +} + +const usedVariableIds = new Set(); +const usedStyleTypes = new Map(); +function scanResources(value, fieldName = "", seen = new WeakSet(), depth = 0) { + if (depth > 16 || value === null || typeof value !== "object") return; + if (seen.has(value)) return; + seen.add(value); + if (Array.isArray(value)) { + for (const child of value) scanResources(child, fieldName, seen, depth + 1); + return; + } + if ( + value.type === "VARIABLE_ALIAS" && + typeof value.id === "string" && + value.id && + value.id !== "figma.mixed" && + value.id !== "MIXED" + ) { + usedVariableIds.add(value.id); + } + for (const [field, child] of Object.entries(value)) { + const styleType = styleTypeForField(field); + if ( + styleType && + typeof child === "string" && + child && + child !== "figma.mixed" && + child !== "MIXED" + ) { + if (!usedStyleTypes.has(child)) usedStyleTypes.set(child, styleType); + } + scanResources(child, field || fieldName, seen, depth + 1); + } +} + +const documentNodes = [figma.root, ...figma.root.findAll(() => true)]; +for (const node of documentNodes) { + for (const field of [ + "boundVariables", + "fills", + "strokes", + "effects", + "layoutGrids", + "textStyleId", + "fillStyleId", + "strokeStyleId", + "backgroundStyleId", + "effectStyleId", + "gridStyleId", + ]) { + try { + scanResources({ [field]: node[field] }); + } catch (_) {} + } +} + +const [localCollections, localVariables, paints, texts, effects, grids] = await Promise.all([ + figma.variables.getLocalVariableCollectionsAsync(), + figma.variables.getLocalVariablesAsync(), + figma.getLocalPaintStylesAsync(), + figma.getLocalTextStylesAsync(), + figma.getLocalEffectStylesAsync(), + figma.getLocalGridStylesAsync(), +]); +const localVariableIds = new Set(localVariables.map((variable) => variable.id)); +const localStyleIds = new Set([...paints, ...texts, ...effects, ...grids].map((style) => style.id)); + +const unresolved = []; +const remoteVariableJobs = [...usedVariableIds] + .filter((id) => !localVariableIds.has(id)) + .sort() + .map(async (id) => { + try { + const variable = await figma.variables.getVariableByIdAsync(id); + return variable || null; + } catch (_) { + unresolved.push({ id, kind: "variable", reason: "notFoundOrUnavailable" }); + return null; + } + }); +const remoteStyleJobs = [...usedStyleTypes.entries()] + .filter(([id]) => !localStyleIds.has(id)) + .sort(([left], [right]) => left.localeCompare(right)) + .map(async ([id, styleType]) => { + try { + const style = await figma.getStyleByIdAsync(id); + return style ? { style, styleType } : null; + } catch (_) { + unresolved.push({ id, kind: "style", reason: "notFoundOrUnavailable" }); + return null; + } + }); +const remoteVariables = (await Promise.all(remoteVariableJobs)).filter(Boolean); +const remoteStyles = (await Promise.all(remoteStyleJobs)).filter(Boolean); +for (const id of [...usedVariableIds].filter((id) => !localVariableIds.has(id))) { + if (!remoteVariables.some((variable) => variable.id === id) && !unresolved.some((item) => item.id === id)) { + unresolved.push({ id, kind: "variable", reason: "notFoundOrUnavailable" }); + } +} +for (const [id] of [...usedStyleTypes.entries()].filter(([id]) => !localStyleIds.has(id))) { + if (!remoteStyles.some((item) => item.style.id === id) && !unresolved.some((item) => item.id === id)) { + unresolved.push({ id, kind: "style", reason: "notFoundOrUnavailable" }); + } +} + +const remoteCollectionIds = [...new Set(remoteVariables.map((variable) => variable.variableCollectionId))] + .filter((id) => !localCollections.some((collection) => collection.id === id)) + .sort(); +const remoteCollections = ( + await Promise.all( + remoteCollectionIds.map(async (id) => { + try { + return await figma.variables.getVariableCollectionByIdAsync(id); + } catch (_) { + return null; + } + }), + ) +).filter(Boolean); + +function serializeStyle(style, styleType) { + return { + ...serialize(style), + styleType, + value: serialize( + styleType === "PAINT" + ? style.paints + : styleType === "EFFECT" + ? style.effects + : styleType === "GRID" + ? style.layoutGrids + : style, + ), + }; +} + +const styles = [ + ...paints.map((style) => serializeStyle(style, "PAINT")), + ...texts.map((style) => serializeStyle(style, "TEXT")), + ...effects.map((style) => serializeStyle(style, "EFFECT")), + ...grids.map((style) => serializeStyle(style, "GRID")), + ...remoteStyles.map(({ style, styleType }) => serializeStyle(style, styleType)), +].sort((left, right) => left.id.localeCompare(right.id)); +const variables = [...localVariables, ...remoteVariables] + .map((variable) => serialize(variable)) + .sort((left, right) => left.id.localeCompare(right.id)); +const collections = [...localCollections, ...remoteCollections] + .map((collection) => serialize(collection)) + .sort((left, right) => left.id.localeCompare(right.id)); +unresolved.sort((left, right) => left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id)); + +function utf8Encode(value) { + const bytes = []; + for (let index = 0; index < value.length; index += 1) { + let codePoint = value.charCodeAt(index); + if (codePoint >= 0xd800 && codePoint <= 0xdbff) { + const next = index + 1 < value.length ? value.charCodeAt(index + 1) : 0; + if (next >= 0xdc00 && next <= 0xdfff) { + codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (next - 0xdc00); + index += 1; + } else { + codePoint = 0xfffd; + } + } else if (codePoint >= 0xdc00 && codePoint <= 0xdfff) { + codePoint = 0xfffd; + } + if (codePoint < 0x80) bytes.push(codePoint); + else if (codePoint < 0x800) bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f)); + else if (codePoint < 0x10000) { + bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f)); + } else { + bytes.push( + 0xf0 | (codePoint >> 18), + 0x80 | ((codePoint >> 12) & 0x3f), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } + } + return new Uint8Array(bytes); +} + +const envelope = { + schemaVersion: 1, + source: { fileKey: figma.fileKey || "", version: null }, + resources: { + collections, + variables, + styles, + usedRemoteVariables: variables.filter((variable) => variable.remote === true), + usedVariableIds: [...usedVariableIds].sort(), + usedStyleIds: [...usedStyleTypes.keys()].sort(), + localComplete: true, + usedRemoteComplete: unresolved.length === 0, + unresolved, + }, + integrity: { + collectionCount: collections.length, + variableCount: variables.length, + styleCount: styles.length, + unresolvedCount: unresolved.length, + utf8Bytes: 0, + }, +}; + +let envelopeBytes = new Uint8Array(); +for (let attempt = 0; attempt < 8; attempt += 1) { + envelopeBytes = utf8Encode(JSON.stringify(envelope)); + if (envelope.integrity.utf8Bytes === envelopeBytes.length) break; + envelope.integrity.utf8Bytes = envelopeBytes.length; +} +envelopeBytes = utf8Encode(JSON.stringify(envelope)); +if (envelope.integrity.utf8Bytes !== envelopeBytes.length) { + throw new Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE"); +} +if (envelopeBytes.length > MAX_ENVELOPE_BYTES) throw new Error("DEVUP_ENVELOPE_TOO_LARGE"); + +function crc32(bytes) { + let crc = 0xffffffff; + for (const byte of bytes) { + crc ^= byte; + for (let bit = 0; bit < 8; bit += 1) crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1)); + } + return (crc ^ 0xffffffff) >>> 0; +} +function u32(value) { + return new Uint8Array([(value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff]); +} +function ascii(value) { + return new Uint8Array([...value].map((character) => character.charCodeAt(0))); +} +function concat(parts) { + const output = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0)); + let offset = 0; + for (const part of parts) { + output.set(part, offset); + offset += part.length; + } + return output; +} +function pngChunk(type, data) { + const typeBytes = ascii(type); + return concat([u32(data.length), typeBytes, data, u32(crc32(concat([typeBytes, data])))]); +} + +const chunkCount = Math.ceil(envelopeBytes.length / MAX_ENVELOPE_CHUNK_BYTES); +for (let sequence = 0; sequence < chunkCount; sequence += 1) { + const start = sequence * MAX_ENVELOPE_CHUNK_BYTES; + const end = Math.min(envelopeBytes.length, start + MAX_ENVELOPE_CHUNK_BYTES); + const png = concat([ + new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]), + pngChunk("IHDR", new Uint8Array([0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0])), + pngChunk("duVp", concat([u32(sequence), u32(chunkCount), envelopeBytes.slice(start, end)])), + pngChunk("IDAT", new Uint8Array([120, 1, 1, 5, 0, 250, 255, 0, 0, 0, 0, 0, 5, 0, 1])), + pngChunk("IEND", new Uint8Array()), + ]); + figma.io.write(`devup-fast-theme-${sequence + 1}-of-${chunkCount}.png`, png); +} +return { + kind: "devupFastThemeDescriptor", + schemaVersion: 1, + collectionCount: collections.length, + variableCount: variables.length, + styleCount: styles.length, + unresolvedCount: unresolved.length, + utf8Bytes: envelopeBytes.length, + chunkCount, +}; diff --git a/crates/devup-mcp-figma/src/scripts/large_value.js b/crates/devup-mcp-figma/src/scripts/large_value.js new file mode 100644 index 0000000..6315b52 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/large_value.js @@ -0,0 +1,196 @@ +const options = "__DEVUP_LARGE_VALUE__"; +const node = await figma.getNodeByIdAsync(options.nodeId); +if (!node) throw new Error("DEVUP_NODE_NOT_FOUND"); + +const textSegmentManifest = "__DEVUP_TEXT_SEGMENT_MANIFEST__"; + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if ( + typeof value === "object" && + "parent" in value && + typeof value.id === "string" && + typeof value.type === "string" + ) { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) { + return { $binary: value.constructor.name, byteLength: value.byteLength }; + } + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + for (const key of Object.keys(value).sort()) { + try { + const serialized = serialize(value[key], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[key] = serialized; + } catch (error) { + result[key] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +function utf8Encode(value) { + const bytes = []; + for (let index = 0; index < value.length; index += 1) { + let codePoint = value.charCodeAt(index); + if (codePoint >= 0xd800 && codePoint <= 0xdbff) { + const next = index + 1 < value.length ? value.charCodeAt(index + 1) : 0; + if (next >= 0xdc00 && next <= 0xdfff) { + codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (next - 0xdc00); + index += 1; + } else codePoint = 0xfffd; + } else if (codePoint >= 0xdc00 && codePoint <= 0xdfff) codePoint = 0xfffd; + if (codePoint < 0x80) bytes.push(codePoint); + else if (codePoint < 0x800) { + bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f)); + } else if (codePoint < 0x10000) { + bytes.push( + 0xe0 | (codePoint >> 12), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } else { + bytes.push( + 0xf0 | (codePoint >> 18), + 0x80 | ((codePoint >> 12) & 0x3f), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } + } + return new Uint8Array(bytes); +} + +function sha256(bytes) { + const constants = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, + ]; + const length = bytes.length; + const paddedLength = Math.ceil((length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + padded.set(bytes); + padded[length] = 0x80; + const bitLength = length * 8; + for (let index = 0; index < 8; index += 1) { + padded[paddedLength - 1 - index] = Math.floor(bitLength / 2 ** (index * 8)) & 0xff; + } + const hash = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, + ]; + const rotate = (value, bits) => (value >>> bits) | (value << (32 - bits)); + for (let offset = 0; offset < padded.length; offset += 64) { + const words = new Uint32Array(64); + for (let index = 0; index < 16; index += 1) { + const start = offset + index * 4; + words[index] = + (padded[start] << 24) | + (padded[start + 1] << 16) | + (padded[start + 2] << 8) | + padded[start + 3]; + } + for (let index = 16; index < 64; index += 1) { + const s0 = rotate(words[index - 15], 7) ^ rotate(words[index - 15], 18) ^ (words[index - 15] >>> 3); + const s1 = rotate(words[index - 2], 17) ^ rotate(words[index - 2], 19) ^ (words[index - 2] >>> 10); + words[index] = (words[index - 16] + s0 + words[index - 7] + s1) >>> 0; + } + let [a, b, c, d, e, f, g, h] = hash; + for (let index = 0; index < 64; index += 1) { + const s1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25); + const choice = (e & f) ^ (~e & g); + const temp1 = (h + s1 + choice + constants[index] + words[index]) >>> 0; + const s0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22); + const majority = (a & b) ^ (a & c) ^ (b & c); + const temp2 = (s0 + majority) >>> 0; + h = g; g = f; f = e; e = (d + temp1) >>> 0; + d = c; c = b; b = a; a = (temp1 + temp2) >>> 0; + } + for (const [index, value] of [a, b, c, d, e, f, g, h].entries()) { + hash[index] = (hash[index] + value) >>> 0; + } + } + return hash.map((value) => value.toString(16).padStart(8, "0")).join(""); +} + +function base64(bytes) { + const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + let output = ""; + for (let index = 0; index < bytes.length; index += 3) { + const first = bytes[index]; + const second = index + 1 < bytes.length ? bytes[index + 1] : 0; + const third = index + 2 < bytes.length ? bytes[index + 2] : 0; + output += alphabet[first >> 2]; + output += alphabet[((first & 3) << 4) | (second >> 4)]; + output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : "="; + output += index + 2 < bytes.length ? alphabet[third & 63] : "="; + } + return output; +} + +let rawValue; +try { + if ( + options.field === "styledTextSegments" && + node.type === "TEXT" && + typeof node.getStyledTextSegments === "function" + ) { + rawValue = node.getStyledTextSegments(textSegmentManifest); + } else if (options.field in node) { + rawValue = node[options.field]; + } else { + throw new Error("unsupported"); + } +} catch (_) { + return { + kind: "devupLargeValueUnsupported", + fileKey: figma.fileKey || "", + version: options.version, + nodeId: options.nodeId, + field: options.field, + byteLength: options.byteLength, + sha256: options.sha256, + errorCode: "DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM", + }; +} + +const bytes = utf8Encode(JSON.stringify(serialize(rawValue))); +const observedHash = sha256(bytes); +if (bytes.length !== options.byteLength || observedHash !== options.sha256) { + throw new Error("DEVUP_LARGE_VALUE_CHANGED"); +} +const offset = Math.max(0, Math.floor(Number(options.offset) || 0)); +const maxChunkBytes = Math.min(65536, Math.max(1, Math.floor(Number(options.maxChunkBytes) || 8192))); +if (offset >= bytes.length) throw new Error("DEVUP_LARGE_VALUE_RANGE_INVALID"); +const nextOffset = Math.min(bytes.length, offset + maxChunkBytes); +return { + kind: "devupLargeValueFragment", + fileKey: figma.fileKey || "", + version: options.version, + nodeId: options.nodeId, + field: options.field, + offset, + nextOffset, + byteLength: bytes.length, + sha256: observedHash, + dataBase64: base64(bytes.slice(offset, nextOffset)), + complete: nextOffset === bytes.length, +}; diff --git a/crates/devup-mcp-figma/src/scripts/large_value_helpers.js b/crates/devup-mcp-figma/src/scripts/large_value_helpers.js new file mode 100644 index 0000000..b2b6c8a --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/large_value_helpers.js @@ -0,0 +1,110 @@ +const DEVUP_MAX_LARGE_VALUE_BYTES = 16 * 1024 * 1024; +const DEVUP_LARGE_VALUE_CHUNK_BYTES = 8192; + +function devupUtf8Encode(value) { + const bytes = []; + for (let index = 0; index < value.length; index += 1) { + let codePoint = value.charCodeAt(index); + if (codePoint >= 0xd800 && codePoint <= 0xdbff) { + const next = index + 1 < value.length ? value.charCodeAt(index + 1) : 0; + if (next >= 0xdc00 && next <= 0xdfff) { + codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (next - 0xdc00); + index += 1; + } else codePoint = 0xfffd; + } else if (codePoint >= 0xdc00 && codePoint <= 0xdfff) codePoint = 0xfffd; + if (codePoint < 0x80) bytes.push(codePoint); + else if (codePoint < 0x800) { + bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f)); + } else if (codePoint < 0x10000) { + bytes.push( + 0xe0 | (codePoint >> 12), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } else { + bytes.push( + 0xf0 | (codePoint >> 18), + 0x80 | ((codePoint >> 12) & 0x3f), + 0x80 | ((codePoint >> 6) & 0x3f), + 0x80 | (codePoint & 0x3f), + ); + } + } + return new Uint8Array(bytes); +} + +function devupSha256(bytes) { + const constants = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, + ]; + const paddedLength = Math.ceil((bytes.length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + padded.set(bytes); + padded[bytes.length] = 0x80; + const bitLength = bytes.length * 8; + for (let index = 0; index < 8; index += 1) { + padded[paddedLength - 1 - index] = Math.floor(bitLength / 2 ** (index * 8)) & 0xff; + } + const hash = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, + ]; + const rotate = (value, bits) => (value >>> bits) | (value << (32 - bits)); + for (let offset = 0; offset < padded.length; offset += 64) { + const words = new Uint32Array(64); + for (let index = 0; index < 16; index += 1) { + const start = offset + index * 4; + words[index] = + (padded[start] << 24) | + (padded[start + 1] << 16) | + (padded[start + 2] << 8) | + padded[start + 3]; + } + for (let index = 16; index < 64; index += 1) { + const s0 = rotate(words[index - 15], 7) ^ rotate(words[index - 15], 18) ^ (words[index - 15] >>> 3); + const s1 = rotate(words[index - 2], 17) ^ rotate(words[index - 2], 19) ^ (words[index - 2] >>> 10); + words[index] = (words[index - 16] + s0 + words[index - 7] + s1) >>> 0; + } + let [a, b, c, d, e, f, g, h] = hash; + for (let index = 0; index < 64; index += 1) { + const s1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25); + const choice = (e & f) ^ (~e & g); + const first = (h + s1 + choice + constants[index] + words[index]) >>> 0; + const s0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22); + const majority = (a & b) ^ (a & c) ^ (b & c); + const second = (s0 + majority) >>> 0; + h = g; g = f; f = e; e = (d + first) >>> 0; + d = c; c = b; b = a; a = (first + second) >>> 0; + } + for (const [index, value] of [a, b, c, d, e, f, g, h].entries()) { + hash[index] = (hash[index] + value) >>> 0; + } + } + return hash.map((value) => value.toString(16).padStart(8, "0")).join(""); +} + +function devupLargeValueDescriptor(nodeId, field, serialized) { + const bytes = devupUtf8Encode(JSON.stringify(serialized)); + if (bytes.length > DEVUP_MAX_LARGE_VALUE_BYTES) { + return { $truncated: "max-large-value-bytes", byteLength: bytes.length }; + } + return { + $largeValue: { + nodeId, + field, + byteLength: bytes.length, + sha256: devupSha256(bytes), + cursor: { nextOffset: 0, maxChunkBytes: DEVUP_LARGE_VALUE_CHUNK_BYTES }, + }, + }; +} diff --git a/crates/devup-mcp-figma/src/scripts/page_catalog.js b/crates/devup-mcp-figma/src/scripts/page_catalog.js new file mode 100644 index 0000000..b0cdc95 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/page_catalog.js @@ -0,0 +1,18 @@ +const pages = figma.root.children; +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: pages.map((page) => page.id), + nodes: pages.map((page) => ({ + id: page.id, + type: page.type, + fields: { + name: page.name, + parentId: null, + childrenIds: [], + }, + extra: {}, + fieldErrors: {}, + })), + diagnostics: [], +}; diff --git a/crates/devup-mcp-figma/src/scripts/search.js b/crates/devup-mcp-figma/src/scripts/search.js new file mode 100644 index 0000000..22d445f --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/search.js @@ -0,0 +1,83 @@ +const page = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); +if (!page || page.type !== "PAGE") throw new Error("DEVUP_PAGE_NOT_FOUND"); +await figma.setCurrentPageAsync(page); + +const options = "__DEVUP_SEARCH__"; +const defaultTypes = ["PAGE", "SECTION", "FRAME", "COMPONENT_SET", "COMPONENT"]; +const allowedTypes = new Set( + (options.nodeTypes.length ? options.nodeTypes : defaultTypes).map((value) => value.toUpperCase()), +); + +function normalize(value) { + return value.normalize("NFC").toLocaleLowerCase().replace(/\s/gu, ""); +} + +function levenshtein(left, right) { + let previous = Array.from({ length: right.length + 1 }, (_, index) => index); + for (let leftIndex = 0; leftIndex < left.length; leftIndex += 1) { + const current = [leftIndex + 1]; + for (let rightIndex = 0; rightIndex < right.length; rightIndex += 1) { + current.push( + Math.min( + current[rightIndex] + 1, + previous[rightIndex + 1] + 1, + previous[rightIndex] + (left[leftIndex] === right[rightIndex] ? 0 : 1), + ), + ); + } + previous = current; + } + return previous[right.length]; +} + +function score(name) { + if (name === options.query) return 400; + if (options.matchKind === "exact") return null; + const candidate = normalize(name); + const query = normalize(options.query); + if (candidate === query) return 300; + if (candidate.startsWith(query)) return 200; + if (candidate.includes(query)) return 100; + if (options.matchKind !== "fuzzy") return null; + const distance = levenshtein(Array.from(candidate), Array.from(query)); + const threshold = Math.min(4, Math.max(1, Math.ceil(Array.from(query).length / 4))); + return distance <= threshold ? Math.max(0, 50 - distance) : null; +} + +const candidates = [page, ...page.findAll(() => true)] + .filter((node) => allowedTypes.has(node.type) && typeof node.name === "string") + .map((node) => ({ node, score: score(node.name) })) + .filter((entry) => entry.score !== null) + .sort((left, right) => + right.score - left.score || + left.node.name.localeCompare(right.node.name) || + left.node.id.localeCompare(right.node.id), + ) + .slice(0, options.limit); + +const included = new Map([[page.id, page]]); +for (const { node } of candidates) { + let current = node; + while (current && current.type !== "DOCUMENT") { + included.set(current.id, current); + current = current.parent; + } +} + +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: [page.id], + nodes: [...included.values()].map((node) => ({ + id: node.id, + type: node.type, + fields: { + name: node.name, + parentId: node.parent && node.parent.type !== "DOCUMENT" ? node.parent.id : null, + childrenIds: "children" in node ? node.children.map((child) => child.id) : [], + }, + extra: {}, + fieldErrors: {}, + })), + diagnostics: [], +}; diff --git a/crates/devup-mcp-figma/src/scripts/section_index.js b/crates/devup-mcp-figma/src/scripts/section_index.js new file mode 100644 index 0000000..f81e09e --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/section_index.js @@ -0,0 +1,146 @@ +const section = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); +if (!section) throw new Error("DEVUP_NODE_NOT_FOUND"); +if (section.type !== "SECTION") throw new Error("DEVUP_SECTION_REQUIRED"); + +const MAX_CANDIDATES = 100; +const MAX_TRAVERSED_NODES = 20000; + +function bounds(node) { + const value = node.absoluteBoundingBox || { + x: typeof node.x === "number" ? node.x : 0, + y: typeof node.y === "number" ? node.y : 0, + width: typeof node.width === "number" ? node.width : 0, + height: typeof node.height === "number" ? node.height : 0, + }; + if (![value.x, value.y, value.width, value.height].every(Number.isFinite)) return null; + return { x: value.x, y: value.y, width: value.width, height: value.height }; +} + +function isScreen(node, box) { + if (node.type !== "FRAME" || node.visible === false || !box) return false; + const aspect = box.width / Math.max(1, box.height); + return box.width >= 240 && box.width <= 1800 + && box.height >= 300 && box.height <= 2000 + && aspect >= 0.25 && aspect <= 2.5; +} + +function breadcrumb(node) { + const names = []; + let current = node; + while (current && current.type !== "DOCUMENT") { + if (typeof current.name === "string" && current.name) names.push(current.name); + current = current.parent; + } + return names.reverse(); +} + +function utf8ByteLength(value) { + let bytes = 0; + for (let index = 0; index < value.length; index += 1) { + const code = value.charCodeAt(index); + if (code < 0x80) bytes += 1; + else if (code < 0x800) bytes += 2; + else if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length) { + bytes += 4; + index += 1; + } else bytes += 3; + } + return bytes; +} + +function subtreeEstimate(root) { + const queue = [root]; + let count = 0; + let estimatedBytes = 0; + for (let index = 0; index < queue.length && count < MAX_TRAVERSED_NODES; index += 1) { + const node = queue[index]; + count += 1; + estimatedBytes += 512 + utf8ByteLength(typeof node.name === "string" ? node.name : ""); + if (node.type === "TEXT" && typeof node.characters === "string") { + estimatedBytes += utf8ByteLength(node.characters) * 2; + } + if ("children" in node) queue.push(...node.children); + } + return { + subtreeNodeCount: count, + estimatedSerializedBytes: estimatedBytes, + truncated: queue.length > count, + }; +} + +const queue = "children" in section ? [...section.children] : []; +const candidateNodes = []; +let traversalCount = 0; +for (let index = 0; index < queue.length && traversalCount < MAX_TRAVERSED_NODES; index += 1) { + const node = queue[index]; + traversalCount += 1; + const box = bounds(node); + if (isScreen(node, box)) { + let parent = node.parent; + let nestedInScreen = false; + while (parent && parent.id !== section.id) { + if (isScreen(parent, bounds(parent))) { + nestedInScreen = true; + break; + } + parent = parent.parent; + } + if (!nestedInScreen) candidateNodes.push({ node, box }); + } + if ("children" in node) queue.push(...node.children); +} +candidateNodes.sort((left, right) => + left.box.y - right.box.y + || left.box.x - right.box.x + || left.node.id.localeCompare(right.node.id), +); +const projectionTruncated = queue.length > traversalCount || candidateNodes.length > MAX_CANDIDATES; +const selected = candidateNodes.slice(0, MAX_CANDIDATES); +const candidateIds = selected.map(({ node }) => node.id); +const sectionBox = bounds(section); +if (!sectionBox) throw new Error("DEVUP_NODE_BOUNDS_UNAVAILABLE"); + +const sectionNode = { + id: section.id, + type: section.type, + fields: { + name: section.name, + parentId: section.parent && section.parent.type !== "DOCUMENT" ? section.parent.id : null, + childrenIds: candidateIds, + absoluteBoundingBox: sectionBox, + visible: section.visible !== false, + projectionTruncated, + }, + extra: {}, + fieldErrors: {}, +}; +const candidates = selected.map(({ node, box }) => { + const estimate = subtreeEstimate(node); + return { + id: node.id, + type: node.type, + fields: { + name: typeof node.name === "string" ? node.name : "", + parentId: section.id, + childrenIds: [], + absoluteBoundingBox: box, + visible: node.visible !== false, + breadcrumb: breadcrumb(node), + directChildCount: "children" in node ? node.children.length : 0, + subtreeNodeCount: estimate.subtreeNodeCount, + estimatedSerializedBytes: estimate.estimatedSerializedBytes, + selectionReasons: ["screen-like", "inside-section"], + estimateTruncated: estimate.truncated, + }, + extra: {}, + fieldErrors: {}, + }; +}); + +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: [section.id], + nodes: [sectionNode, ...candidates], + diagnostics: [], +}; diff --git a/crates/devup-mcp-figma/src/scripts/snapshot.js b/crates/devup-mcp-figma/src/scripts/snapshot.js new file mode 100644 index 0000000..bd76931 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/snapshot.js @@ -0,0 +1,229 @@ +const root = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); +if (!root) throw new Error("DEVUP_NODE_NOT_FOUND"); + +const manifest = "__DEVUP_PLUGIN_API_MANIFEST__"; +const manifestSet = new Set(manifest); +const textSegmentManifest = "__DEVUP_TEXT_SEGMENT_MANIFEST__"; +const snapshotOptions = "__DEVUP_SNAPSHOT__"; +const offset = Math.max(0, Math.floor(Number(snapshotOptions.offset) || 0)); +const maxPayloadBytes = Math.min( + 16000, + Math.max(4096, Math.floor(Number(snapshotOptions.maxPayloadBytes) || 12000)), +); +const maxFieldBytes = Math.min( + maxPayloadBytes - 1024, + Math.max(512, Math.floor(Number(snapshotOptions.maxFieldBytes) || 4096)), +); +const skipped = new Set(["id", "type", "parent", "children"]); +const hardProtectedFields = new Set([ + "parentId", + "childrenIds", + "name", + "characters", + "styledTextSegments", + "boundVariables", +]); + +"__DEVUP_LARGE_VALUE_HELPERS__"; + +function utf8ByteLength(value) { + let bytes = 0; + for (let index = 0; index < value.length; index += 1) { + const code = value.charCodeAt(index); + if (code < 0x80) bytes += 1; + else if (code < 0x800) bytes += 2; + else if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length) { + bytes += 4; + index += 1; + } else bytes += 3; + } + return bytes; +} + +function jsonByteLength(value) { + return utf8ByteLength(JSON.stringify(value)); +} + +function propertyNames(value) { + const names = new Set(); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + for (const name of manifest) { + try { + if (name in value) names.add(name); + } catch (_) {} + } + return [...names].sort(); +} + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if ( + typeof value === "object" && + "parent" in value && + typeof value.id === "string" && + typeof value.type === "string" + ) { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) { + return { $binary: value.constructor.name, byteLength: value.byteLength }; + } + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + for (const key of Object.keys(value).sort()) { + try { + const serialized = serialize(value[key], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[key] = serialized; + } catch (error) { + result[key] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +function truncatedValue(reason, byteLength) { + return { $truncated: reason, byteLength }; +} + +function serializeField(nodeId, name, value, fieldErrors) { + const serialized = serialize(value); + const byteLength = jsonByteLength(serialized); + if (byteLength <= maxFieldBytes) return serialized; + const descriptor = devupLargeValueDescriptor(nodeId, name, serialized); + if (descriptor.$truncated) { + fieldErrors[name] = `DEVUP_FIELD_VALUE_UNSUPPORTED:${byteLength}>${DEVUP_MAX_LARGE_VALUE_BYTES}`; + } + return descriptor; +} + +function isHardProtectedField(name) { + return hardProtectedFields.has(name) || name.endsWith("StyleId"); +} + +function shrinkNodeToBudget(node, budget) { + let currentBytes = jsonByteLength(node); + if (currentBytes <= budget) return node; + + const candidates = []; + for (const [sectionName, section] of [ + ["extra", node.extra], + ["fields", node.fields], + ]) { + for (const [name, value] of Object.entries(section)) { + if (value && typeof value === "object" && ("$truncated" in value || "$largeValue" in value)) { + continue; + } + candidates.push({ + sectionName, + name, + byteLength: jsonByteLength(value), + protected: sectionName === "fields" && isHardProtectedField(name), + }); + } + } + candidates.sort( + (left, right) => + Number(left.protected) - Number(right.protected) || right.byteLength - left.byteLength, + ); + + for (const candidate of candidates) { + if (currentBytes <= budget) break; + const descriptor = devupLargeValueDescriptor( + node.id, + candidate.name, + node[candidate.sectionName][candidate.name], + ); + node[candidate.sectionName][candidate.name] = descriptor; + if (descriptor.$truncated) { + node.fieldErrors[candidate.name] = + `DEVUP_FIELD_VALUE_UNSUPPORTED:${candidate.byteLength}>${DEVUP_MAX_LARGE_VALUE_BYTES}`; + } + currentBytes = jsonByteLength(node); + } + return node; +} + +function snapshotNode(node) { + const fields = {}; + const extra = {}; + const fieldErrors = {}; + fields.parentId = node.parent ? node.parent.id : null; + fields.childrenIds = "children" in node ? node.children.map((child) => child.id) : []; + + for (const name of propertyNames(node)) { + if (skipped.has(name) || name.startsWith("_")) continue; + try { + const value = node[name]; + if (typeof value === "function") continue; + const serialized = serializeField(node.id, name, value, fieldErrors); + (manifestSet.has(name) ? fields : extra)[name] = serialized; + } catch (error) { + fieldErrors[name] = String(error && error.message ? error.message : error); + } + } + if (node.type === "TEXT" && typeof node.getStyledTextSegments === "function") { + try { + fields.styledTextSegments = serializeField( + node.id, + "styledTextSegments", + node.getStyledTextSegments(textSegmentManifest), + fieldErrors, + ); + } catch (error) { + fieldErrors.styledTextSegments = String(error && error.message ? error.message : error); + } + } + return { id: node.id, type: node.type, fields, extra, fieldErrors }; +} + +const allNodes = []; +const queue = [root]; +while (queue.length) { + const node = queue.shift(); + allNodes.push(node); + if ("children" in node) queue.push(...node.children); +} + +const nodes = []; +const nodeBudget = maxPayloadBytes - 1024; +let payloadBytes = 2; +for (let index = offset; index < allNodes.length; index += 1) { + const node = shrinkNodeToBudget(snapshotNode(allNodes[index]), nodeBudget); + const nodeBytes = jsonByteLength(node) + (nodes.length ? 1 : 0); + if (nodes.length && payloadBytes + nodeBytes > nodeBudget) break; + nodes.push(node); + payloadBytes += nodeBytes; +} + +const nextOffset = Math.min(allNodes.length, offset + nodes.length); +nodes.push({ + id: "__DEVUP_SNAPSHOT_CURSOR__", + type: "DEVUP_INTERNAL", + fields: { + nextOffset, + complete: nextOffset >= allNodes.length, + totalNodes: allNodes.length, + }, + extra: {}, + fieldErrors: {}, +}); + +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: [root.id], + nodes, + diagnostics: [], +}; diff --git a/crates/devup-mcp-figma/src/scripts/used_resources.js b/crates/devup-mcp-figma/src/scripts/used_resources.js new file mode 100644 index 0000000..c3a786d --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/used_resources.js @@ -0,0 +1,90 @@ +const resources = "__DEVUP_RESOURCE_BATCH__"; + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if (typeof value === "object" && "parent" in value && typeof value.id === "string" && typeof value.type === "string") { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) return { $binary: value.constructor.name, byteLength: value.byteLength }; + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + const names = new Set(Object.keys(value)); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + for (const name of [...names].sort()) { + if (name.startsWith("_") || ["parent", "children", "consumers"].includes(name)) continue; + try { + const serialized = serialize(value[name], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[name] = serialized; + } catch (_error) { + result[name] = { $error: "unavailable" }; + } + } + seen.delete(value); + return result; +} + +const variableResults = await Promise.all(resources.variableIds.map(async (id) => { + try { + const value = await figma.variables.getVariableByIdAsync(id); + return value + ? { value: serialize(value), collectionId: value.variableCollectionId } + : { unresolved: { id, kind: "variable", reason: "notFoundOrUnavailable" } }; + } catch (_error) { + return { unresolved: { id, kind: "variable", reason: "notFoundOrUnavailable" } }; + } +})); + +const collectionIds = [...new Set(variableResults + .flatMap((result) => result.collectionId ? [result.collectionId] : []))].sort(); +const collectionResults = await Promise.all(collectionIds.map(async (id) => { + try { + const collection = await figma.variables.getVariableCollectionByIdAsync(id); + return collection ? [serialize(collection)] : []; + } catch (_error) { + return []; + } +})); + +const styleResults = await Promise.all(resources.styles.map(async (styleRef) => { + try { + const style = await figma.getStyleByIdAsync(styleRef.id); + if (!style) { + return { unresolved: { id: styleRef.id, kind: "style", reason: "notFoundOrUnavailable" } }; + } + return { + value: { + ...serialize(style), + styleType: styleRef.styleType, + value: serialize( + styleRef.styleType === "PAINT" ? style.paints + : styleRef.styleType === "EFFECT" ? style.effects + : styleRef.styleType === "GRID" ? style.layoutGrids + : style + ) + } + }; + } catch (_error) { + return { unresolved: { id: styleRef.id, kind: "style", reason: "notFoundOrUnavailable" } }; + } +})); + +return { + collections: collectionResults.flat(), + variables: variableResults.flatMap((result) => result.value ? [result.value] : []), + styles: styleResults.flatMap((result) => result.value ? [result.value] : []), + usedVariableIds: resources.variableIds, + usedStyleIds: resources.styles.map((style) => style.id), + unresolved: [...variableResults, ...styleResults] + .flatMap((result) => result.unresolved ? [result.unresolved] : []) +}; diff --git a/crates/devup-mcp-figma/src/scripts/variable_catalog.js b/crates/devup-mcp-figma/src/scripts/variable_catalog.js new file mode 100644 index 0000000..76a25c5 --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/variable_catalog.js @@ -0,0 +1,49 @@ +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + const names = new Set(Object.keys(value)); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + for (const name of [...names].sort()) { + if (name.startsWith("_")) continue; + try { + const serialized = serialize(value[name], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[name] = serialized; + } catch (error) { + result[name] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +const [collections, paints, texts, effects, grids] = await Promise.all([ + figma.variables.getLocalVariableCollectionsAsync(), + figma.getLocalPaintStylesAsync(), + figma.getLocalTextStylesAsync(), + figma.getLocalEffectStylesAsync(), + figma.getLocalGridStylesAsync() +]); +const styleGroups = [paints, texts, effects, grids]; +const styleTypes = ["PAINT", "TEXT", "EFFECT", "GRID"]; + +return { + collections: collections.map((value) => serialize(value)), + variableIds: [...new Set(collections.flatMap((collection) => collection.variableIds))].sort(), + styles: styleGroups.flatMap((group, index) => group.map((style) => ({ + id: style.id, + styleType: styleTypes[index] + }))).sort((left, right) => left.id.localeCompare(right.id)), + localComplete: true, + usedRemoteComplete: false +}; diff --git a/crates/devup-mcp-figma/src/scripts/variables.js b/crates/devup-mcp-figma/src/scripts/variables.js new file mode 100644 index 0000000..59171ea --- /dev/null +++ b/crates/devup-mcp-figma/src/scripts/variables.js @@ -0,0 +1,75 @@ +const resources = "__DEVUP_RESOURCE_BATCH__"; + +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return { $undefined: true }; + if (typeof value === "bigint") return { $bigint: value.toString() }; + if (["function", "symbol"].includes(typeof value)) return { $unsupported: typeof value }; + if (depth > 12) return { $truncated: "max-depth" }; + if (typeof value === "object" && "parent" in value && typeof value.id === "string" && typeof value.type === "string") { + return { $nodeId: value.id, $nodeType: value.type }; + } + if (Array.isArray(value)) return value.map((item) => serialize(item, seen, depth + 1)); + if (ArrayBuffer.isView(value)) return { $binary: value.constructor.name, byteLength: value.byteLength }; + if (value instanceof ArrayBuffer) return { $binary: "ArrayBuffer", byteLength: value.byteLength }; + if (seen.has(value)) return { $circular: true }; + seen.add(value); + const result = {}; + const names = new Set(Object.keys(value)); + let current = value; + while (current && current !== Object.prototype) { + for (const name of Object.getOwnPropertyNames(current)) names.add(name); + current = Object.getPrototypeOf(current); + } + for (const name of [...names].sort()) { + if (name.startsWith("_") || ["parent", "children", "consumers"].includes(name)) continue; + try { + const serialized = serialize(value[name], seen, depth + 1); + if (!(serialized && serialized.$unsupported === "function")) result[name] = serialized; + } catch (error) { + result[name] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +const [variableValues, styleValues] = await Promise.all([ + Promise.all(resources.variableIds.map((id) => figma.variables.getVariableByIdAsync(id))), + Promise.all(resources.styles.map((style) => figma.getStyleByIdAsync(style.id))) +]); +const styleRefs = new Map(resources.styles.map((style) => [style.id, style])); +const styles = await Promise.all(styleValues.filter(Boolean).map(async (style) => { + const styleRef = styleRefs.get(style.id); + const styleType = styleRef.styleType; + if (Number.isInteger(styleRef.consumerStart) && Number.isInteger(styleRef.consumerEnd)) { + const consumers = await style.getStyleConsumersAsync(); + return { + id: style.id, + styleType, + $consumerStart: styleRef.consumerStart, + $consumerEntries: consumers.slice(styleRef.consumerStart, styleRef.consumerEnd).map((consumer) => [ + consumer.node.id, + consumer.node.type, + serialize(consumer.fields) + ]) + }; + } + const consumers = await style.getStyleConsumersAsync(); + return { + ...serialize(style), + styleType, + $consumerCount: consumers.length, + value: serialize( + styleType === "PAINT" ? style.paints + : styleType === "EFFECT" ? style.effects + : styleType === "GRID" ? style.layoutGrids + : style + ) + }; +})); + +return { + variables: variableValues.filter(Boolean).map((value) => serialize(value)), + styles +}; diff --git a/crates/devup-mcp-figma/src/search.rs b/crates/devup-mcp-figma/src/search.rs new file mode 100644 index 0000000..07d6e49 --- /dev/null +++ b/crates/devup-mcp-figma/src/search.rs @@ -0,0 +1,318 @@ +use std::collections::BTreeMap; + +use serde::{Deserialize, Serialize}; +use unicode_normalization::UnicodeNormalization; + +use crate::{DevupError, ErrorCode, FigmaTarget, Snapshot}; + +const DEFAULT_TYPES: &[&str] = &["PAGE", "SECTION", "FRAME", "COMPONENT_SET", "COMPONENT"]; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SearchOptions { + pub query: String, + #[serde(default)] + pub node_types: Vec, + #[serde(default = "default_match")] + pub match_kind: String, + #[serde(default = "default_limit")] + pub limit: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SearchResult { + pub node_id: String, + pub name: String, + pub node_type: String, + pub page_name: Option, + pub breadcrumb: Vec, + pub canonical_url: String, + pub match_kind: String, + pub score: u32, +} + +pub fn search_snapshot( + snapshot: &Snapshot, + target: &FigmaTarget, + options: &SearchOptions, +) -> Result, DevupError> { + let query = options.query.trim(); + if query.is_empty() { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "검색 query는 비어 있을 수 없습니다.", + false, + )); + } + if options.limit == 0 || options.limit > 100 { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "검색 limit은 1 이상 100 이하여야 합니다.", + false, + )); + } + if !matches!( + options.match_kind.as_str(), + "exact" | "normalized" | "fuzzy" + ) { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "match는 exact, normalized 또는 fuzzy여야 합니다.", + false, + )); + } + let types = if options.node_types.is_empty() { + DEFAULT_TYPES + .iter() + .map(|value| (*value).to_owned()) + .collect() + } else { + options + .node_types + .iter() + .map(|value| value.to_ascii_uppercase()) + .collect::>() + }; + let parents = parent_index(snapshot); + let normalized_query = normalize(query); + let mut results = snapshot + .nodes + .values() + .filter(|node| types.iter().any(|node_type| node_type == &node.node_type)) + .filter_map(|node| { + let name = node.typed_view().name()?; + let (kind, score) = + match_score(name, query, &normalized_query, options.match_kind.as_str())?; + let breadcrumb = breadcrumb(snapshot, &parents, &node.id); + let page_name = ancestor_page(snapshot, &parents, &node.id); + Some(SearchResult { + node_id: node.id.clone(), + name: name.to_owned(), + node_type: node.node_type.clone(), + page_name, + breadcrumb, + canonical_url: canonical_url(target, &node.id), + match_kind: kind.to_owned(), + score, + }) + }) + .collect::>(); + results.sort_by(|left, right| { + right + .score + .cmp(&left.score) + .then_with(|| left.name.cmp(&right.name)) + .then_with(|| left.node_id.cmp(&right.node_id)) + }); + results.truncate(options.limit); + Ok(results) +} + +fn match_score<'a>( + name: &str, + query: &str, + normalized_query: &str, + mode: &str, +) -> Option<(&'a str, u32)> { + if name == query { + return Some(("exact", 400)); + } + if mode == "exact" { + return None; + } + let normalized_name = normalize(name); + if normalized_name == normalized_query { + return Some(("normalized-exact", 300)); + } + if normalized_name.starts_with(normalized_query) { + return Some(("prefix", 200)); + } + if normalized_name.contains(normalized_query) { + return Some(("contains", 100)); + } + if mode != "fuzzy" { + return None; + } + let distance = levenshtein(&normalized_name, normalized_query); + let threshold = normalized_query.chars().count().div_ceil(4).clamp(1, 4); + (distance <= threshold).then_some(("fuzzy", 50_u32.saturating_sub(distance as u32))) +} + +fn normalize(value: &str) -> String { + value + .nfc() + .flat_map(char::to_lowercase) + .filter(|character| !character.is_whitespace()) + .collect() +} + +fn parent_index(snapshot: &Snapshot) -> BTreeMap { + let mut parents = BTreeMap::new(); + for node in snapshot.nodes.values() { + if let Some(parent) = node.typed_view().string("parentId") { + parents.insert(node.id.clone(), parent.to_owned()); + } + for child in node.typed_view().child_ids() { + parents + .entry(child.to_owned()) + .or_insert_with(|| node.id.clone()); + } + } + parents +} + +fn breadcrumb( + snapshot: &Snapshot, + parents: &BTreeMap, + node_id: &str, +) -> Vec { + let mut ids = Vec::new(); + let mut current = Some(node_id); + while let Some(id) = current { + ids.push(id.to_owned()); + current = parents.get(id).map(String::as_str); + if ids.len() > snapshot.nodes.len() { + break; + } + } + ids.reverse(); + ids.into_iter() + .filter_map(|id| { + snapshot + .nodes + .get(&id)? + .typed_view() + .name() + .map(str::to_owned) + }) + .collect() +} + +fn ancestor_page( + snapshot: &Snapshot, + parents: &BTreeMap, + node_id: &str, +) -> Option { + let mut current = Some(node_id); + while let Some(id) = current { + let node = snapshot.nodes.get(id)?; + if node.node_type == "PAGE" { + return node.typed_view().name().map(str::to_owned); + } + current = parents.get(id).map(String::as_str); + } + None +} + +fn canonical_url(target: &FigmaTarget, node_id: &str) -> String { + let node_id = node_id.replace(':', "-"); + if let Some(branch_key) = &target.branch_key { + format!( + "https://www.figma.com/branch/{}/{branch_key}/devup?node-id={node_id}", + target.file_key + ) + } else { + format!( + "https://www.figma.com/design/{}/devup?node-id={node_id}", + target.file_key + ) + } +} + +fn levenshtein(left: &str, right: &str) -> usize { + let right = right.chars().collect::>(); + let mut previous = (0..=right.len()).collect::>(); + for (left_index, left_char) in left.chars().enumerate() { + let mut current = vec![left_index + 1]; + for (right_index, right_char) in right.iter().enumerate() { + current.push( + (current[right_index] + 1) + .min(previous[right_index + 1] + 1) + .min(previous[right_index] + usize::from(left_char != *right_char)), + ); + } + previous = current; + } + previous[right.len()] +} + +fn default_match() -> String { + "normalized".to_owned() +} + +fn default_limit() -> usize { + 20 +} + +#[cfg(test)] +mod tests { + use serde_json::json; + + use super::*; + use crate::RawNode; + + #[test] + fn ranks_exact_normalized_prefix_and_contains_with_breadcrumbs() { + let nodes = [ + ("0:1", "PAGE", "Screens", vec!["1:1"]), + ("1:1", "SECTION", "A : STORY-F-PROOFREAD", vec!["2:1"]), + ("2:1", "FRAME", "Story F Proofread Detail", vec![]), + ] + .into_iter() + .map(|(id, node_type, name, children)| { + ( + id.to_owned(), + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(json!({ + "name": name, + "childrenIds": children, + })) + .unwrap(), + extra: Default::default(), + field_errors: Default::default(), + }, + ) + }) + .collect(); + let snapshot = Snapshot { + file_key: "85CgSws3o5XsLv7aAwWJyS".to_owned(), + version: None, + roots: vec!["0:1".to_owned()], + nodes, + diagnostics: Vec::new(), + }; + let target = FigmaTarget { + file_key: snapshot.file_key.clone(), + node_id: None, + branch_key: None, + }; + let results = search_snapshot( + &snapshot, + &target, + &SearchOptions { + query: "a:story-f-proofread".to_owned(), + node_types: Vec::new(), + match_kind: "normalized".to_owned(), + limit: 20, + }, + ) + .unwrap(); + assert_eq!(results[0].node_id, "1:1"); + assert_eq!(results[0].match_kind, "normalized-exact"); + assert_eq!(results[0].page_name.as_deref(), Some("Screens")); + assert_eq!(results[0].breadcrumb, ["Screens", "A : STORY-F-PROOFREAD"]); + assert!(results[0].canonical_url.ends_with("node-id=1-1")); + } + + #[test] + fn fuzzy_matching_is_opt_in() { + assert!(match_score("Proofread", "Proofred", "proofred", "normalized").is_none()); + assert_eq!( + match_score("Proofread", "Proofred", "proofred", "fuzzy"), + Some(("fuzzy", 49)) + ); + } +} diff --git a/crates/devup-mcp-figma/src/section.rs b/crates/devup-mcp-figma/src/section.rs new file mode 100644 index 0000000..e321181 --- /dev/null +++ b/crates/devup-mcp-figma/src/section.rs @@ -0,0 +1,433 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; + +use crate::{ + DevupError, ErrorCode, ExploreBounds, ExploreKind, ExploreNode, FigmaTarget, Snapshot, +}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SectionSummary { + pub node_id: String, + pub name: String, + pub bounds: ExploreBounds, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SectionCandidate { + pub node_id: String, + pub name: String, + pub node_type: String, + pub visible: bool, + pub bounds: ExploreBounds, + pub parent_id: Option, + pub breadcrumb: Vec, + pub direct_child_count: usize, + pub subtree_node_count: usize, + pub estimated_serialized_bytes: usize, + pub selection_reasons: Vec, + pub canonical_url: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SectionIndex { + pub file_key: String, + pub source_version: Option, + pub section: SectionSummary, + pub candidates: Vec, + pub truncated: bool, +} + +impl SectionIndex { + pub fn select( + &self, + frame_ids: &[String], + all_screens: bool, + ) -> Result, DevupError> { + if all_screens && !frame_ids.is_empty() { + return Err(invalid_selection( + "frameIds와 allScreens는 동시에 사용할 수 없습니다.", + )); + } + if !all_screens && frame_ids.is_empty() { + return Err(invalid_selection( + "Section root 수집에는 frameIds 또는 allScreens가 필요합니다.", + )); + } + if self.truncated && all_screens { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "잘린 Section index에서는 allScreens를 사용할 수 없습니다.", + false, + )); + } + let requested = frame_ids + .iter() + .map(String::as_str) + .collect::>(); + if requested.len() != frame_ids.len() { + return Err(invalid_selection("frameIds에 중복 node가 있습니다.")); + } + let candidates = self + .candidates + .iter() + .map(|candidate| candidate.node_id.as_str()) + .collect::>(); + if let Some(foreign) = requested.difference(&candidates).next() { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!("Section 내부 screen frame이 아니거나 존재하지 않습니다: {foreign}"), + false, + )); + } + Ok(self + .candidates + .iter() + .filter(|candidate| all_screens || requested.contains(candidate.node_id.as_str())) + .map(|candidate| candidate.node_id.clone()) + .collect()) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BatchLimits { + pub max_estimated_bytes: usize, + pub max_nodes: usize, +} + +impl Default for BatchLimits { + fn default() -> Self { + Self { + max_estimated_bytes: 6 * 1024 * 1024, + max_nodes: 4_000, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SectionBatch { + pub root_ids: Vec, + pub estimated_bytes: usize, + pub node_count: usize, + pub oversized: bool, +} + +pub fn build_section_index( + snapshot: &Snapshot, + target: &FigmaTarget, +) -> Result { + if snapshot.file_key != target.file_key { + return Err(invalid_selection( + "Section index의 file key가 요청과 다릅니다.", + )); + } + let section_id = target.node_id.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Section index에는 node-id가 필요합니다.", + false, + ) + })?; + let section = snapshot.nodes.get(section_id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Section index에서 대상 node를 찾지 못했습니다.", + false, + ) + })?; + if section.node_type != "SECTION" { + return Err(invalid_selection( + "Section index 대상은 SECTION이어야 합니다.", + )); + } + let section_node = ExploreNode::try_from(section)?; + let mut screen_nodes = Vec::new(); + for node in snapshot.nodes.values() { + if node.id == section_id || node.node_type != "FRAME" { + continue; + } + let explore = match ExploreNode::try_from(node) { + Ok(explore) => explore, + Err(_) => continue, + }; + if explore.visible + && explore.kind == ExploreKind::Screen + && is_descendant(snapshot, &node.id, section_id) + { + screen_nodes.push(explore); + } + } + let screen_ids = screen_nodes + .iter() + .map(|node| node.node_id.clone()) + .collect::>(); + screen_nodes.retain(|node| { + !ancestor_ids(snapshot, &node.node_id, section_id) + .iter() + .any(|ancestor| ancestor != section_id && screen_ids.contains(ancestor.as_str())) + }); + screen_nodes.sort_by(|left, right| { + left.bounds + .y + .total_cmp(&right.bounds.y) + .then_with(|| left.bounds.x.total_cmp(&right.bounds.x)) + .then_with(|| left.node_id.cmp(&right.node_id)) + }); + + let candidates = screen_nodes + .into_iter() + .map(|node| { + let (computed_count, computed_bytes) = subtree_estimate(snapshot, &node.node_id); + let raw = snapshot + .nodes + .get(&node.node_id) + .expect("candidate originated from snapshot"); + let view = raw.typed_view(); + let direct_child_count = view + .value("directChildCount") + .or_else(|| view.value("childCount")) + .and_then(serde_json::Value::as_u64) + .and_then(|count| usize::try_from(count).ok()) + .unwrap_or_else(|| view.child_ids().count()); + let subtree_node_count = view + .value("subtreeNodeCount") + .and_then(serde_json::Value::as_u64) + .and_then(|count| usize::try_from(count).ok()) + .unwrap_or(computed_count); + let estimated_serialized_bytes = view + .value("estimatedSerializedBytes") + .and_then(serde_json::Value::as_u64) + .and_then(|count| usize::try_from(count).ok()) + .unwrap_or(computed_bytes); + let breadcrumb = if node.breadcrumb.is_empty() { + breadcrumb(snapshot, &node.node_id) + } else { + node.breadcrumb.clone() + }; + SectionCandidate { + canonical_url: canonical_url(target, &node.node_id), + node_id: node.node_id, + name: node.name, + node_type: node.node_type, + visible: node.visible, + bounds: node.bounds, + parent_id: node.parent_id, + breadcrumb, + direct_child_count, + subtree_node_count, + estimated_serialized_bytes, + selection_reasons: vec!["screen-like".to_owned(), "inside-section".to_owned()], + } + }) + .collect(); + + Ok(SectionIndex { + file_key: snapshot.file_key.clone(), + source_version: snapshot.version.clone(), + section: SectionSummary { + node_id: section_id.to_owned(), + name: section_node.name, + bounds: section_node.bounds, + }, + candidates, + truncated: snapshot + .nodes + .values() + .any(|node| node.typed_view().bool("projectionTruncated") == Some(true)), + }) +} + +pub fn plan_batches( + index: &SectionIndex, + selected_root_ids: &[String], + limits: BatchLimits, +) -> Result, DevupError> { + if limits.max_estimated_bytes == 0 || limits.max_nodes == 0 { + return Err(invalid_selection("Section batch 상한은 0보다 커야 합니다.")); + } + let selected = index.select(selected_root_ids, false)?; + let by_id = index + .candidates + .iter() + .map(|candidate| (candidate.node_id.as_str(), candidate)) + .collect::>(); + let visual_rank = selected + .iter() + .enumerate() + .map(|(rank, root_id)| (root_id.clone(), rank)) + .collect::>(); + let mut candidates = selected + .into_iter() + .map(|root_id| { + let candidate = by_id + .get(root_id.as_str()) + .copied() + .ok_or_else(|| invalid_selection("Section batch candidate가 없습니다."))?; + let rank = visual_rank[&root_id]; + Ok((rank, root_id, candidate)) + }) + .collect::, DevupError>>()?; + // Best-fit decreasing avoids the avoidable extra calls produced by visual-order first-fit. + // The normalized pressure comparison uses integers, so equal requests always pack alike. + candidates.sort_by(|left, right| { + packing_pressure(right.2, limits) + .cmp(&packing_pressure(left.2, limits)) + .then_with(|| { + right + .2 + .estimated_serialized_bytes + .cmp(&left.2.estimated_serialized_bytes) + }) + .then_with(|| right.2.subtree_node_count.cmp(&left.2.subtree_node_count)) + .then_with(|| left.0.cmp(&right.0)) + }); + + let mut batches: Vec = Vec::new(); + for (_rank, root_id, candidate) in candidates { + let oversized = candidate.estimated_serialized_bytes > limits.max_estimated_bytes + || candidate.subtree_node_count > limits.max_nodes; + if oversized { + batches.push(SectionBatch { + root_ids: vec![root_id], + estimated_bytes: candidate.estimated_serialized_bytes, + node_count: candidate.subtree_node_count, + oversized: true, + }); + continue; + } + let best_batch = batches + .iter() + .enumerate() + .filter_map(|(index, batch)| { + if batch.oversized { + return None; + } + let bytes = batch + .estimated_bytes + .checked_add(candidate.estimated_serialized_bytes)?; + let nodes = batch.node_count.checked_add(candidate.subtree_node_count)?; + if bytes > limits.max_estimated_bytes || nodes > limits.max_nodes { + return None; + } + Some((packing_slack(bytes, nodes, limits), index)) + }) + .min(); + if let Some((_slack, index)) = best_batch { + let batch = &mut batches[index]; + batch.root_ids.push(root_id); + batch.estimated_bytes += candidate.estimated_serialized_bytes; + batch.node_count += candidate.subtree_node_count; + } else { + batches.push(SectionBatch { + root_ids: vec![root_id], + estimated_bytes: candidate.estimated_serialized_bytes, + node_count: candidate.subtree_node_count, + oversized: false, + }); + } + } + for batch in &mut batches { + batch.root_ids.sort_by_key(|root_id| visual_rank[root_id]); + } + batches.sort_by_key(|batch| { + batch + .root_ids + .iter() + .map(|root_id| visual_rank[root_id]) + .min() + .unwrap_or(usize::MAX) + }); + Ok(batches) +} + +fn packing_pressure(candidate: &SectionCandidate, limits: BatchLimits) -> u128 { + ((candidate.estimated_serialized_bytes as u128) * (limits.max_nodes as u128)) + .max((candidate.subtree_node_count as u128) * (limits.max_estimated_bytes as u128)) +} + +fn packing_slack(bytes: usize, nodes: usize, limits: BatchLimits) -> u128 { + ((limits.max_estimated_bytes - bytes) as u128) * (limits.max_nodes as u128) + + ((limits.max_nodes - nodes) as u128) * (limits.max_estimated_bytes as u128) +} + +fn subtree_estimate(snapshot: &Snapshot, root_id: &str) -> (usize, usize) { + let mut count = 0_usize; + let mut bytes = 0_usize; + let mut pending = vec![root_id.to_owned()]; + let mut visited = BTreeSet::new(); + while let Some(node_id) = pending.pop() { + if !visited.insert(node_id.clone()) { + continue; + } + let Some(node) = snapshot.nodes.get(&node_id) else { + continue; + }; + count = count.saturating_add(1); + bytes = bytes.saturating_add(serde_json::to_vec(node).map_or(0, |value| value.len())); + pending.extend(node.typed_view().child_ids().map(str::to_owned)); + } + (count, bytes) +} + +fn ancestor_ids(snapshot: &Snapshot, node_id: &str, stop_id: &str) -> Vec { + let mut result = Vec::new(); + let mut current = snapshot + .nodes + .get(node_id) + .and_then(|node| node.typed_view().string("parentId")); + let mut visited = BTreeSet::new(); + while let Some(parent_id) = current { + if !visited.insert(parent_id.to_owned()) { + break; + } + result.push(parent_id.to_owned()); + if parent_id == stop_id { + break; + } + current = snapshot + .nodes + .get(parent_id) + .and_then(|node| node.typed_view().string("parentId")); + } + result +} + +fn is_descendant(snapshot: &Snapshot, node_id: &str, section_id: &str) -> bool { + ancestor_ids(snapshot, node_id, section_id) + .iter() + .any(|ancestor| ancestor == section_id) +} + +fn breadcrumb(snapshot: &Snapshot, node_id: &str) -> Vec { + let mut ids = ancestor_ids(snapshot, node_id, ""); + ids.reverse(); + ids.push(node_id.to_owned()); + ids.into_iter() + .filter_map(|id| snapshot.nodes.get(&id)) + .filter_map(|node| node.typed_view().name()) + .map(str::to_owned) + .collect() +} + +fn canonical_url(target: &FigmaTarget, node_id: &str) -> String { + let node_id = node_id.replace(':', "-"); + if let Some(branch_key) = &target.branch_key { + format!( + "https://www.figma.com/branch/{}/{branch_key}/devup?node-id={node_id}", + target.file_key + ) + } else { + format!( + "https://www.figma.com/design/{}/devup?node-id={node_id}", + target.file_key + ) + } +} + +fn invalid_selection(message: impl Into) -> DevupError { + DevupError::new(ErrorCode::DevupFigmaHandoffInvalid, message, false) +} diff --git a/crates/devup-mcp-figma/src/snapshot.rs b/crates/devup-mcp-figma/src/snapshot.rs new file mode 100644 index 0000000..90445a3 --- /dev/null +++ b/crates/devup-mcp-figma/src/snapshot.rs @@ -0,0 +1,435 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; + +use super::{DevupError, ErrorCode, UpstreamResult}; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum FidelityImpact { + #[default] + None, + Approximated, + Lossy, + Failed, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Diagnostic { + pub code: String, + pub message: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub node_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub severity: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fidelity_impact: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub property: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub resource_kind: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub resource_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fallback: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub recoverable: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub details: Option, +} + +impl Diagnostic { + pub fn fidelity_impact(&self) -> FidelityImpact { + if let Some(impact) = self.fidelity_impact { + return impact; + } + match self.code.as_str() { + "DEVUP_CODEGEN_PROJECTION_FAILED" => FidelityImpact::Failed, + "DEVUP_CODEGEN_MASK_FALLBACK" | "DEVUP_CODEGEN_EFFECT_FALLBACK" => { + FidelityImpact::Lossy + } + "DEVUP_CODEGEN_ABSOLUTE_FALLBACK" => FidelityImpact::Approximated, + _ if self.code.starts_with("DEVUP_CODEGEN_") => match self.severity { + Some(DiagnosticSeverity::Error) => FidelityImpact::Failed, + Some(DiagnosticSeverity::Info) => FidelityImpact::None, + Some(DiagnosticSeverity::Warning) | None => FidelityImpact::Approximated, + }, + _ => FidelityImpact::None, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum DiagnosticSeverity { + Info, + Warning, + Error, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RawNode { + pub id: String, + #[serde(rename = "type")] + pub node_type: String, + #[serde(default)] + pub fields: Map, + #[serde(default)] + pub extra: Map, + #[serde(default)] + pub field_errors: BTreeMap, +} + +impl RawNode { + pub fn typed_view(&self) -> TypedNode<'_> { + TypedNode { node: self } + } +} + +#[derive(Debug, Clone, Copy)] +pub struct TypedNode<'a> { + node: &'a RawNode, +} + +impl<'a> TypedNode<'a> { + pub fn id(&self) -> &'a str { + &self.node.id + } + + pub fn node_type(&self) -> &'a str { + &self.node.node_type + } + + pub fn value(&self, field: &str) -> Option<&'a Value> { + self.node + .fields + .get(field) + .or_else(|| self.node.extra.get(field)) + } + + pub fn string(&self, field: &str) -> Option<&'a str> { + self.value(field).and_then(Value::as_str) + } + + pub fn number(&self, field: &str) -> Option { + self.value(field).and_then(Value::as_f64) + } + + pub fn bool(&self, field: &str) -> Option { + self.value(field).and_then(Value::as_bool) + } + + pub fn name(&self) -> Option<&'a str> { + self.string("name") + } + + pub fn child_ids(&self) -> impl Iterator { + self.value("childrenIds") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(Value::as_str) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SnapshotChunk { + pub file_key: String, + #[serde(default)] + pub version: Option, + #[serde(default)] + pub root_ids: Vec, + #[serde(default)] + pub nodes: Vec, + #[serde(default)] + pub diagnostics: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Snapshot { + pub file_key: String, + pub version: Option, + pub roots: Vec, + pub nodes: BTreeMap, + pub diagnostics: Vec, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum CompletenessState { + Complete, + Partial, + Failed, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MissingChild { + pub parent_id: String, + pub child_id: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ParentMismatch { + pub parent_id: String, + pub child_id: String, + pub observed_parent_id: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FieldLocation { + pub node_id: String, + pub field: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ChildCountMismatch { + pub node_id: String, + pub declared_count: usize, + pub exported_count: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SnapshotAudit { + pub state: CompletenessState, + pub root_count: usize, + pub preserved_node_count: usize, + pub reachable_node_count: usize, + pub missing_root_ids: Vec, + pub orphan_node_ids: Vec, + pub declared_child_count: usize, + pub exported_child_count: usize, + pub missing_children: Vec, + pub parent_mismatches: Vec, + pub child_count_mismatches: Vec, + pub truncated_fields: Vec, + pub field_error_count: usize, +} + +impl Snapshot { + pub fn audit(&self) -> SnapshotAudit { + let mut reachable = BTreeSet::new(); + let mut pending = self.roots.iter().rev().cloned().collect::>(); + let mut declared_child_count = 0usize; + let mut exported_child_count = 0usize; + let mut missing_children = Vec::new(); + let mut parent_mismatches = Vec::new(); + let mut child_count_mismatches = Vec::new(); + let missing_root_ids = self + .roots + .iter() + .filter(|root_id| !self.nodes.contains_key(*root_id)) + .cloned() + .collect::>(); + + while let Some(node_id) = pending.pop() { + let Some(node) = self.nodes.get(&node_id) else { + continue; + }; + if !reachable.insert(node_id) { + continue; + } + let child_ids = node.typed_view().child_ids().collect::>(); + if let Some(observed_count) = node + .typed_view() + .value("childCount") + .and_then(Value::as_u64) + .and_then(|count| usize::try_from(count).ok()) + && observed_count != child_ids.len() + { + child_count_mismatches.push(ChildCountMismatch { + node_id: node.id.clone(), + declared_count: observed_count, + exported_count: child_ids.len(), + }); + } + declared_child_count = declared_child_count.saturating_add(child_ids.len()); + let mut existing_child_ids = Vec::new(); + for child_id in child_ids { + let Some(child) = self.nodes.get(child_id) else { + missing_children.push(MissingChild { + parent_id: node.id.clone(), + child_id: child_id.to_owned(), + }); + continue; + }; + exported_child_count = exported_child_count.saturating_add(1); + if let Some(observed_parent_id) = child.typed_view().string("parentId") + && observed_parent_id != node.id + { + parent_mismatches.push(ParentMismatch { + parent_id: node.id.clone(), + child_id: child.id.clone(), + observed_parent_id: Some(observed_parent_id.to_owned()), + }); + } + existing_child_ids.push(child_id.to_owned()); + } + for child_id in existing_child_ids.into_iter().rev() { + pending.push(child_id); + } + } + + let orphan_node_ids = self + .nodes + .keys() + .filter(|node_id| !reachable.contains(*node_id)) + .cloned() + .collect::>(); + let mut truncated_fields = Vec::new(); + let mut field_error_count = 0usize; + for node in self.nodes.values() { + field_error_count = field_error_count.saturating_add(node.field_errors.len()); + for (field, value) in node.fields.iter().chain(&node.extra) { + if contains_truncation(value) { + truncated_fields.push(FieldLocation { + node_id: node.id.clone(), + field: field.clone(), + }); + } + } + } + let state = if !missing_root_ids.is_empty() { + CompletenessState::Failed + } else if missing_children.is_empty() + && parent_mismatches.is_empty() + && child_count_mismatches.is_empty() + && orphan_node_ids.is_empty() + && truncated_fields.is_empty() + && field_error_count == 0 + { + CompletenessState::Complete + } else { + CompletenessState::Partial + }; + + SnapshotAudit { + state, + root_count: self.roots.len(), + preserved_node_count: self.nodes.len(), + reachable_node_count: reachable.len(), + missing_root_ids, + orphan_node_ids, + declared_child_count, + exported_child_count, + missing_children, + parent_mismatches, + child_count_mismatches, + truncated_fields, + field_error_count, + } + } +} + +fn contains_truncation(value: &Value) -> bool { + match value { + Value::Object(object) => { + object.contains_key("$truncated") + || object.contains_key("$largeValue") + || object.values().any(contains_truncation) + } + Value::Array(values) => values.iter().any(contains_truncation), + _ => false, + } +} + +pub fn merge_chunks(chunks: Vec) -> Result { + let first = chunks.first().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "병합할 Figma snapshot이 없습니다.", + false, + ) + })?; + let file_key = first.file_key.clone(); + let version = first.version.clone(); + let mut roots = Vec::new(); + let mut root_set = BTreeSet::new(); + let mut nodes = BTreeMap::new(); + let mut diagnostics = Vec::new(); + + for chunk in chunks { + if chunk.file_key != file_key || chunk.version != version { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma 파일 버전이 변경되었습니다. 다시 시도하세요.", + true, + )); + } + for root in chunk.root_ids { + if root_set.insert(root.clone()) { + roots.push(root); + } + } + for node in chunk.nodes { + if let Some(existing) = nodes.get(&node.id) { + if existing != &node { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "동일한 Figma node에 서로 다른 snapshot 데이터가 반환되었습니다.", + true, + )); + } + } else { + nodes.insert(node.id.clone(), node); + } + } + diagnostics.extend(chunk.diagnostics); + } + + Ok(Snapshot { + file_key, + version, + roots, + nodes, + diagnostics, + }) +} + +pub fn snapshot_chunk_from_result(result: &UpstreamResult) -> Result { + find_snapshot(&result.raw).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답에서 snapshot 데이터를 찾지 못했습니다.", + false, + ) + }) +} + +fn find_snapshot(value: &Value) -> Option { + if let Ok(snapshot) = serde_json::from_value::(value.clone()) + && !snapshot.file_key.is_empty() + && !snapshot.nodes.is_empty() + { + return Some(snapshot); + } + + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Some(snapshot) = parse_snapshot_text(text) + { + return Some(snapshot); + } + object.values().find_map(find_snapshot) + } + Value::Array(values) => values.iter().find_map(find_snapshot), + Value::String(text) => parse_snapshot_text(text), + _ => None, + } +} + +fn parse_snapshot_text(text: &str) -> Option { + serde_json::from_str::(text) + .ok() + .and_then(|value| find_snapshot(&value)) +} diff --git a/crates/devup-mcp-figma/src/source.rs b/crates/devup-mcp-figma/src/source.rs new file mode 100644 index 0000000..61eb6c5 --- /dev/null +++ b/crates/devup-mcp-figma/src/source.rs @@ -0,0 +1,172 @@ +use serde::{Deserialize, Serialize}; +use serde_json::json; + +use crate::{DevupError, ErrorCode}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum SourcePolicy { + #[default] + Auto, + Direct, + Host, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum SelectedSource { + Direct, + Host, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum UpstreamFailureContext { + RegisterClient, + Connect, + ListTools, + CallTool, + Decode, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum UpstreamFailureKind { + CatalogRejected, + AuthUnavailable, + CapabilityUnavailable, + PermissionDenied, + RateLimited, + NodeNotFound, + VersionChanged, + Transport, + InvalidResponse, +} + +pub fn fallback_allowed(policy: SourcePolicy, kind: UpstreamFailureKind) -> bool { + policy == SourcePolicy::Auto + && matches!( + kind, + UpstreamFailureKind::CatalogRejected + | UpstreamFailureKind::AuthUnavailable + | UpstreamFailureKind::CapabilityUnavailable + | UpstreamFailureKind::PermissionDenied + ) +} + +pub fn fallback_allowed_for_error(policy: SourcePolicy, error: &DevupError) -> bool { + let kind = match error.code { + ErrorCode::DevupFigmaCatalogRejected => UpstreamFailureKind::CatalogRejected, + ErrorCode::DevupAuthRequired => UpstreamFailureKind::AuthUnavailable, + ErrorCode::DevupFigmaDirectUnavailable => UpstreamFailureKind::CapabilityUnavailable, + ErrorCode::DevupFigmaPermissionDenied => UpstreamFailureKind::PermissionDenied, + ErrorCode::DevupFigmaRateLimited => UpstreamFailureKind::RateLimited, + ErrorCode::DevupFigmaNodeNotFound => UpstreamFailureKind::NodeNotFound, + ErrorCode::DevupFigmaVersionChanged => UpstreamFailureKind::VersionChanged, + _ => return false, + }; + fallback_allowed(policy, kind) +} + +pub fn classify_upstream_failure( + context: UpstreamFailureContext, + status: Option, + message: &str, +) -> UpstreamFailureKind { + let message = message.to_ascii_lowercase(); + if message.contains("catalog") + || message.contains("not approved") + || (context == UpstreamFailureContext::RegisterClient && status == Some(403)) + { + return UpstreamFailureKind::CatalogRejected; + } + if status == Some(401) || message.contains("unauthorized") || message.contains("status 401") { + return UpstreamFailureKind::AuthUnavailable; + } + if context == UpstreamFailureContext::ListTools + && (message.contains("unavailable") + || message.contains("missing") + || message.contains("required tool")) + { + return UpstreamFailureKind::CapabilityUnavailable; + } + if status == Some(403) { + return UpstreamFailureKind::PermissionDenied; + } + if status == Some(429) || message.contains("status 429") || message.contains("rate limit") { + return UpstreamFailureKind::RateLimited; + } + if (status == Some(404) && message.contains("node")) || message.contains("node not found") { + return UpstreamFailureKind::NodeNotFound; + } + if message.contains("version changed") || message.contains("version conflict") { + return UpstreamFailureKind::VersionChanged; + } + if context == UpstreamFailureContext::Decode { + return UpstreamFailureKind::InvalidResponse; + } + UpstreamFailureKind::Transport +} + +pub fn upstream_failure_error( + context: UpstreamFailureContext, + status: Option, + message: &str, +) -> DevupError { + classify_upstream_failure(context, status, message).into_devup_error(status) +} + +impl UpstreamFailureKind { + pub fn into_devup_error(self, status: Option) -> DevupError { + let (code, message, retryable) = match self { + Self::CatalogRejected => ( + ErrorCode::DevupFigmaCatalogRejected, + "이 client는 Figma MCP Catalog에서 승인되지 않았습니다.", + false, + ), + Self::AuthUnavailable => ( + ErrorCode::DevupAuthRequired, + "Figma direct 연결 인증을 사용할 수 없습니다.", + false, + ), + Self::CapabilityUnavailable => ( + ErrorCode::DevupFigmaDirectUnavailable, + "Figma direct 연결에 필요한 읽기 capability가 없습니다.", + false, + ), + Self::PermissionDenied => ( + ErrorCode::DevupFigmaPermissionDenied, + "Figma 파일을 읽을 권한이 없습니다.", + false, + ), + Self::RateLimited => ( + ErrorCode::DevupFigmaRateLimited, + "Figma 요청 한도에 도달했습니다.", + true, + ), + Self::NodeNotFound => ( + ErrorCode::DevupFigmaNodeNotFound, + "Figma node를 찾지 못했습니다.", + false, + ), + Self::VersionChanged => ( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma 파일 버전이 변경되었습니다.", + true, + ), + Self::Transport => ( + ErrorCode::DevupFigmaDirectUnavailable, + "Figma direct 연결을 완료하지 못했습니다.", + true, + ), + Self::InvalidResponse => ( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답을 안전하게 해석하지 못했습니다.", + false, + ), + }; + DevupError::with_details( + code, + message, + retryable, + json!({ "source": "direct", "status": status }), + ) + } +} diff --git a/crates/devup-mcp-figma/src/text_segment_manifest.json b/crates/devup-mcp-figma/src/text_segment_manifest.json new file mode 100644 index 0000000..2978fa3 --- /dev/null +++ b/crates/devup-mcp-figma/src/text_segment_manifest.json @@ -0,0 +1,15 @@ +[ + "fontName", + "fontWeight", + "fontSize", + "textDecoration", + "textCase", + "lineHeight", + "letterSpacing", + "fills", + "textStyleId", + "fillStyleId", + "listOptions", + "indentation", + "hyperlink" +] diff --git a/crates/devup-mcp-figma/src/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs new file mode 100644 index 0000000..ee68118 --- /dev/null +++ b/crates/devup-mcp-figma/src/upstream.rs @@ -0,0 +1,854 @@ +use std::{ + collections::BTreeSet, + future::Future, + sync::Arc, + time::{Duration, Instant}, +}; + +use async_trait::async_trait; +use rmcp::{ + ServiceExt, + model::CallToolRequestParams, + transport::{ + StreamableHttpClientTransport, streamable_http_client::StreamableHttpClientTransportConfig, + }, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; +use tokio::sync::Mutex; + +use super::{ + AssetRequest, CredentialStore, DevupError, LargeValueReadOptions, OAuthManager, ResourceBatch, + UpstreamFailureContext, UpstreamFailureKind, upstream_failure_error, +}; + +const DEFAULT_FIGMA_MCP_ENDPOINT: &str = "https://mcp.figma.com/mcp"; +const MAX_SSE_EVENT_SIZE: usize = 16 * 1024 * 1024; +const REMOTE_SESSION_TTL: Duration = Duration::from_secs(30); +const READ_ONLY_TOOL_NAMES: [&str; 6] = [ + "get_metadata", + "get_variable_defs", + "get_design_context", + "get_code_connect_map", + "get_screenshot", + "use_figma", +]; + +type RunningFigmaClient = rmcp::service::RunningService; + +// Keep at most one initialized MCP session for 30 seconds. Its capability catalog is fetched +// once, intersected with the locally compiled ReadToolCall allowlist, and reused concurrently. +// A closed session, TTL expiry, or tools/call transport failure evicts it; the next request then +// reconnects with a freshly resolved OAuth token and re-verifies the catalog. No remote-only tool +// name can cross this boundary, even when the server advertises it. +#[derive(Clone)] +struct RemoteSessionCache { + ttl: Duration, + state: Arc>>, +} + +#[derive(Clone)] +struct RemoteSession { + client: Arc, + capabilities: Arc>, +} + +struct CachedRemoteSession { + created_at: Instant, + session: RemoteSession, +} + +impl RemoteSessionCache { + fn new(ttl: Duration) -> Self { + Self { + ttl, + state: Arc::new(Mutex::new(None)), + } + } + + async fn get_or_connect(&self, connect: F) -> Result + where + F: FnOnce() -> Fut, + Fut: Future>, + { + let mut cached = self.state.lock().await; + if let Some(current) = cached.as_ref() + && current.created_at.elapsed() < self.ttl + && !current.session.client.is_closed() + { + return Ok(current.session.clone()); + } + let client = Arc::new(connect().await?); + let capabilities = client + .list_all_tools() + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::ListTools, error))? + .into_iter() + .map(|tool| tool.name.to_string()) + .filter(|name| is_read_only_tool_name(name)) + .collect::>(); + let session = RemoteSession { + client, + capabilities: Arc::new(capabilities), + }; + *cached = Some(CachedRemoteSession { + created_at: Instant::now(), + session: session.clone(), + }); + Ok(session) + } + + async fn invalidate(&self, session: &RemoteSession) { + let mut cached = self.state.lock().await; + if cached + .as_ref() + .is_some_and(|current| Arc::ptr_eq(¤t.session.client, &session.client)) + { + cached.take(); + } + } +} + +fn is_read_only_tool_name(name: &str) -> bool { + READ_ONLY_TOOL_NAMES.contains(&name) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BuiltinScript { + NodeSnapshot, + FastSnapshotEnvelope, + FastThemeEnvelope, + PageCatalog, + SearchSnapshot, + VariableCatalog, + LocalVariables, + UsedResources, + ExploreSnapshot, + SectionIndex, + MultiRootSnapshotEnvelope, + LargeValue, + AssetExport, +} + +impl BuiltinScript { + fn source(self, node_id: &str, inputs: ScriptInputs<'_>) -> String { + let default_root_ids = [node_id.to_owned()]; + let node_id = serde_json::to_string(node_id).expect("node id serializes"); + let source = match self { + Self::NodeSnapshot => include_str!("scripts/snapshot.js"), + Self::FastSnapshotEnvelope => include_str!("scripts/fast_snapshot.js"), + Self::FastThemeEnvelope => include_str!("scripts/fast_theme.js"), + Self::PageCatalog => include_str!("scripts/page_catalog.js"), + Self::SearchSnapshot => include_str!("scripts/search.js"), + Self::VariableCatalog => include_str!("scripts/variable_catalog.js"), + Self::LocalVariables => include_str!("scripts/variables.js"), + Self::UsedResources => include_str!("scripts/used_resources.js"), + Self::ExploreSnapshot => include_str!("scripts/explore.js"), + Self::SectionIndex => include_str!("scripts/section_index.js"), + Self::MultiRootSnapshotEnvelope => include_str!("scripts/fast_snapshot.js"), + Self::LargeValue => include_str!("scripts/large_value.js"), + Self::AssetExport => include_str!("scripts/assets.js"), + }; + let empty_resources = ResourceBatch { + variable_ids: Vec::new(), + styles: Vec::new(), + }; + let resources = serde_json::to_string(inputs.resources.unwrap_or(&empty_resources)) + .expect("resource batch serializes"); + let search = serde_json::to_string(inputs.search.unwrap_or(&SearchReadOptions::default())) + .expect("search options serialize"); + let explore = + serde_json::to_string(inputs.explore.unwrap_or(&ExploreReadOptions::default())) + .expect("explore options serialize"); + let snapshot = + serde_json::to_string(inputs.snapshot.unwrap_or(&SnapshotReadOptions::default())) + .expect("snapshot options serialize"); + let root_ids = serde_json::to_string(inputs.root_ids.unwrap_or(&default_root_ids)) + .expect("root ids serialize"); + let large_value = + serde_json::to_string(inputs.large_value.unwrap_or(&LargeValueReadOptions { + node_id: String::new(), + field: String::new(), + offset: 0, + max_chunk_bytes: 1, + byte_length: 0, + sha256: String::new(), + version: None, + })) + .expect("large value options serialize"); + let asset = inputs + .asset + .map(|(request, version)| { + json!({ + "assetId": request.asset_id, + "nodeId": request.node_id, + "field": request.field, + "imageHash": request.image_hash, + "format": request.format, + "scale": request.scale, + "version": version + }) + }) + .unwrap_or_else(|| json!({})); + let asset = serde_json::to_string(&asset).expect("asset options serialize"); + let section_index_probe = if self == Self::FastSnapshotEnvelope { + let mut probe = include_str!("scripts/section_index.js").replacen( + "if (section.type !== \"SECTION\") throw new Error(\"DEVUP_SECTION_REQUIRED\");", + "if (section.type === \"SECTION\") {", + 1, + ); + probe.push_str("\n}"); + format!("{{\n{probe}\n}}") + } else { + String::new() + }; + source + .replace( + "\"__DEVUP_LARGE_VALUE_HELPERS__\"", + include_str!("scripts/large_value_helpers.js"), + ) + .replace("\"__DEVUP_NODE_ID__\"", &node_id) + .replace("\"__DEVUP_ROOT_IDS__\"", &root_ids) + .replace("\"__DEVUP_SECTION_INDEX_PROBE__\"", §ion_index_probe) + .replace( + "\"__DEVUP_PLUGIN_API_MANIFEST__\"", + include_str!("plugin_api_manifest.json"), + ) + .replace( + "\"__DEVUP_TEXT_SEGMENT_MANIFEST__\"", + include_str!("text_segment_manifest.json"), + ) + .replace("\"__DEVUP_RESOURCE_BATCH__\"", &resources) + .replace("\"__DEVUP_SEARCH__\"", &search) + .replace("\"__DEVUP_EXPLORE__\"", &explore) + .replace("\"__DEVUP_SNAPSHOT__\"", &snapshot) + .replace("\"__DEVUP_LARGE_VALUE__\"", &large_value) + .replace("\"__DEVUP_ASSET__\"", &asset) + } +} + +#[derive(Default)] +struct ScriptInputs<'a> { + resources: Option<&'a ResourceBatch>, + search: Option<&'a SearchReadOptions>, + explore: Option<&'a ExploreReadOptions>, + snapshot: Option<&'a SnapshotReadOptions>, + root_ids: Option<&'a [String]>, + large_value: Option<&'a LargeValueReadOptions>, + asset: Option<(&'a AssetRequest, Option<&'a str>)>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SnapshotReadOptions { + pub offset: usize, + pub max_payload_bytes: usize, + pub max_field_bytes: usize, +} + +impl Default for SnapshotReadOptions { + fn default() -> Self { + Self { + offset: 0, + max_payload_bytes: 12_000, + max_field_bytes: 4_096, + } + } +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SearchReadOptions { + pub query: String, + #[serde(default)] + pub node_types: Vec, + pub match_kind: String, + pub limit: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ExploreReadOptions { + pub projection_limit: usize, + pub text_preview_limit: usize, +} + +impl Default for ExploreReadOptions { + fn default() -> Self { + Self { + projection_limit: 200, + text_preview_limit: 160, + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum ReadToolCall { + Metadata { + file_key: String, + node_id: Option, + }, + VariableDefs { + file_key: String, + node_id: String, + }, + DesignContext { + file_key: String, + node_id: String, + }, + CodeConnectMap { + file_key: String, + node_id: String, + }, + Screenshot { + file_key: String, + node_id: String, + }, + Snapshot { + file_key: String, + node_id: String, + script: BuiltinScript, + resources: Option, + snapshot: Option, + root_ids: Option>, + }, + SearchSnapshot { + file_key: String, + node_id: String, + options: SearchReadOptions, + }, + PageCatalog { + file_key: String, + }, + ExploreSnapshot { + file_key: String, + node_id: String, + options: ExploreReadOptions, + }, + FastTheme { + file_key: String, + }, + LargeValue { + file_key: String, + options: LargeValueReadOptions, + }, + AssetExport { + file_key: String, + version: Option, + request: Box, + }, +} + +impl ReadToolCall { + pub fn metadata(file_key: impl Into, node_id: Option<&str>) -> Self { + Self::Metadata { + file_key: file_key.into(), + node_id: node_id.map(str::to_owned), + } + } + + pub fn variable_defs(file_key: impl Into, node_id: impl Into) -> Self { + Self::VariableDefs { + file_key: file_key.into(), + node_id: node_id.into(), + } + } + + pub fn design_context(file_key: impl Into, node_id: impl Into) -> Self { + Self::DesignContext { + file_key: file_key.into(), + node_id: node_id.into(), + } + } + + pub fn code_connect_map(file_key: impl Into, node_id: impl Into) -> Self { + Self::CodeConnectMap { + file_key: file_key.into(), + node_id: node_id.into(), + } + } + + pub fn screenshot(file_key: impl Into, node_id: impl Into) -> Self { + Self::Screenshot { + file_key: file_key.into(), + node_id: node_id.into(), + } + } + + pub fn snapshot( + file_key: impl Into, + node_id: impl Into, + script: BuiltinScript, + ) -> Self { + let snapshot = (script == BuiltinScript::NodeSnapshot).then(SnapshotReadOptions::default); + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script, + resources: None, + snapshot, + root_ids: None, + } + } + + pub fn snapshot_chunk( + file_key: impl Into, + node_id: impl Into, + options: SnapshotReadOptions, + ) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script: BuiltinScript::NodeSnapshot, + resources: None, + snapshot: Some(options), + root_ids: None, + } + } + + pub fn fast_snapshot(file_key: impl Into, node_id: impl Into) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script: BuiltinScript::FastSnapshotEnvelope, + resources: None, + snapshot: None, + root_ids: None, + } + } + + pub fn section_index(file_key: impl Into, node_id: impl Into) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script: BuiltinScript::SectionIndex, + resources: None, + snapshot: None, + root_ids: None, + } + } + + pub fn multi_root_snapshot( + file_key: impl Into, + section_id: impl Into, + root_ids: Vec, + ) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: section_id.into(), + script: BuiltinScript::MultiRootSnapshotEnvelope, + resources: None, + snapshot: None, + root_ids: Some(root_ids), + } + } + + pub fn fast_theme(file_key: impl Into) -> Self { + Self::FastTheme { + file_key: file_key.into(), + } + } + + pub fn large_value(file_key: impl Into, options: LargeValueReadOptions) -> Self { + Self::LargeValue { + file_key: file_key.into(), + options, + } + } + + pub fn asset_export( + file_key: impl Into, + version: Option, + request: AssetRequest, + ) -> Self { + Self::AssetExport { + file_key: file_key.into(), + version, + request: Box::new(request), + } + } + + pub fn resource_batch( + file_key: impl Into, + node_id: impl Into, + resources: ResourceBatch, + ) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script: BuiltinScript::LocalVariables, + resources: Some(resources), + snapshot: None, + root_ids: None, + } + } + + pub fn used_resources( + file_key: impl Into, + node_id: impl Into, + resources: ResourceBatch, + ) -> Self { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script: BuiltinScript::UsedResources, + resources: Some(resources), + snapshot: None, + root_ids: None, + } + } + + pub fn search_snapshot( + file_key: impl Into, + node_id: impl Into, + options: SearchReadOptions, + ) -> Self { + Self::SearchSnapshot { + file_key: file_key.into(), + node_id: node_id.into(), + options, + } + } + + pub fn page_catalog(file_key: impl Into) -> Self { + Self::PageCatalog { + file_key: file_key.into(), + } + } + + pub fn explore_snapshot( + file_key: impl Into, + node_id: impl Into, + options: ExploreReadOptions, + ) -> Self { + Self::ExploreSnapshot { + file_key: file_key.into(), + node_id: node_id.into(), + options, + } + } + + pub fn tool_name(&self) -> &'static str { + match self { + Self::Metadata { .. } => "get_metadata", + Self::VariableDefs { .. } => "get_variable_defs", + Self::DesignContext { .. } => "get_design_context", + Self::CodeConnectMap { .. } => "get_code_connect_map", + Self::Screenshot { .. } => "get_screenshot", + Self::Snapshot { .. } + | Self::SearchSnapshot { .. } + | Self::PageCatalog { .. } + | Self::ExploreSnapshot { .. } + | Self::FastTheme { .. } + | Self::LargeValue { .. } + | Self::AssetExport { .. } => "use_figma", + } + } + + pub fn arguments(&self) -> Map { + let value = match self { + Self::Metadata { file_key, node_id } => { + json!({ "fileKey": file_key, "nodeId": node_id }) + } + Self::VariableDefs { file_key, node_id } + | Self::DesignContext { file_key, node_id } + | Self::CodeConnectMap { file_key, node_id } + | Self::Screenshot { file_key, node_id } => { + json!({ "fileKey": file_key, "nodeId": node_id }) + } + Self::Snapshot { + file_key, + node_id, + script, + resources, + snapshot, + root_ids, + } => json!({ + "fileKey": file_key, + "nodeId": node_id, + "code": script.source(node_id, ScriptInputs { + resources: resources.as_ref(), + snapshot: snapshot.as_ref(), + root_ids: root_ids.as_deref(), + ..ScriptInputs::default() + }) + }), + Self::SearchSnapshot { + file_key, + node_id, + options, + } => json!({ + "fileKey": file_key, + "nodeId": node_id, + "code": BuiltinScript::SearchSnapshot.source(node_id, ScriptInputs { + search: Some(options), + ..ScriptInputs::default() + }) + }), + Self::PageCatalog { file_key } => json!({ + "fileKey": file_key, + "code": BuiltinScript::PageCatalog.source("", ScriptInputs::default()) + }), + Self::ExploreSnapshot { + file_key, + node_id, + options, + } => json!({ + "fileKey": file_key, + "nodeId": node_id, + "code": BuiltinScript::ExploreSnapshot.source(node_id, ScriptInputs { + explore: Some(options), + ..ScriptInputs::default() + }) + }), + Self::FastTheme { file_key } => json!({ + "fileKey": file_key, + "code": BuiltinScript::FastThemeEnvelope.source("", ScriptInputs::default()) + }), + Self::LargeValue { file_key, options } => json!({ + "fileKey": file_key, + "nodeId": options.node_id, + "code": BuiltinScript::LargeValue.source(&options.node_id, ScriptInputs { + large_value: Some(options), + ..ScriptInputs::default() + }) + }), + Self::AssetExport { + file_key, + version, + request, + } => json!({ + "fileKey": file_key, + "nodeId": request.node_id, + "code": BuiltinScript::AssetExport.source(&request.node_id, ScriptInputs { + asset: Some((request, version.as_deref())), + ..ScriptInputs::default() + }) + }), + }; + value.as_object().cloned().unwrap_or_default() + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UpstreamResult { + pub raw: Value, +} + +#[async_trait] +pub trait FigmaUpstream: Send + Sync { + async fn list_tools(&self) -> Result, DevupError>; + async fn call_read_tool(&self, call: ReadToolCall) -> Result; +} + +#[derive(Clone)] +pub struct RemoteFigmaClient { + endpoint: String, + oauth: OAuthManager, + sessions: RemoteSessionCache, +} + +impl RemoteFigmaClient { + pub fn new(oauth: OAuthManager) -> Self { + Self { + endpoint: DEFAULT_FIGMA_MCP_ENDPOINT.to_owned(), + oauth, + sessions: RemoteSessionCache::new(REMOTE_SESSION_TTL), + } + } + + pub fn with_endpoint(endpoint: impl Into, oauth: OAuthManager) -> Self { + Self { + endpoint: endpoint.into(), + oauth, + sessions: RemoteSessionCache::new(REMOTE_SESSION_TTL), + } + } + + async fn connect(&self) -> Result { + let token = self.oauth.access_token().await?; + let config = StreamableHttpClientTransportConfig::with_uri(self.endpoint.clone()) + .auth_header(token.expose().to_owned()) + .max_sse_event_size(MAX_SSE_EVENT_SIZE) + .reinit_on_expired_session(true); + ().serve(StreamableHttpClientTransport::from_config(config)) + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error)) + } + + async fn session(&self) -> Result { + self.sessions.get_or_connect(|| self.connect()).await + } +} + +#[async_trait] +impl FigmaUpstream for RemoteFigmaClient { + async fn list_tools(&self) -> Result, DevupError> { + let session = self.session().await?; + Ok(session.capabilities.iter().cloned().collect()) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + if !is_read_only_tool_name(call.tool_name()) { + return Err(UpstreamFailureKind::CapabilityUnavailable.into_devup_error(None)); + } + let session = self.session().await?; + if !session.capabilities.contains(call.tool_name()) { + return Err(UpstreamFailureKind::CapabilityUnavailable.into_devup_error(None)); + } + let result = match session + .client + .call_tool( + CallToolRequestParams::new(call.tool_name()).with_arguments(call.arguments()), + ) + .await + { + Ok(result) => result, + Err(error) => { + self.sessions.invalidate(&session).await; + return Err(map_upstream_error(UpstreamFailureContext::CallTool, error)); + } + }; + let raw = serde_json::to_value(result) + .map_err(|error| map_upstream_error(UpstreamFailureContext::Decode, error))?; + Ok(UpstreamResult { raw }) + } +} + +fn map_upstream_error( + context: UpstreamFailureContext, + error: E, +) -> DevupError { + upstream_failure_error(context, None, &error.to_string()) +} + +#[cfg(test)] +mod tests { + use std::sync::atomic::{AtomicUsize, Ordering}; + + use rmcp::{ + ErrorData, RoleServer, ServerHandler, ServiceExt, + model::{ + CallToolResponse, CallToolResult, ContentBlock, ListToolsResult, + PaginatedRequestParams, ServerCapabilities, ServerInfo, Tool, + }, + service::RequestContext, + }; + + use super::*; + + #[derive(Clone)] + struct CountingToolServer { + list_calls: Arc, + tool_calls: Arc, + } + + impl ServerHandler for CountingToolServer { + fn get_info(&self) -> ServerInfo { + ServerInfo::new(ServerCapabilities::builder().enable_tools().build()) + } + + async fn list_tools( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + self.list_calls.fetch_add(1, Ordering::SeqCst); + Ok(ListToolsResult { + tools: vec![ + Tool::new("get_metadata", "read metadata", Map::new()), + Tool::new("delete_node", "write-like server tool", Map::new()), + ], + ..ListToolsResult::default() + }) + } + + async fn call_tool( + &self, + _request: CallToolRequestParams, + _context: RequestContext, + ) -> Result { + self.tool_calls.fetch_add(1, Ordering::SeqCst); + Ok(CallToolResult::success(vec![ContentBlock::text("ok")]).into()) + } + } + + async fn connect_counting_server( + connections: Arc, + list_calls: Arc, + tool_calls: Arc, + ) -> Result { + connections.fetch_add(1, Ordering::SeqCst); + let (server_transport, client_transport) = tokio::io::duplex(4_096); + tokio::spawn(async move { + let server = CountingToolServer { + list_calls, + tool_calls, + } + .serve(server_transport) + .await + .expect("test MCP server starts"); + let _ = server.waiting().await; + }); + ().serve(client_transport) + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error)) + } + + #[tokio::test] + async fn bounded_session_reuses_one_connection_and_one_filtered_capability_catalog() { + let connections = Arc::new(AtomicUsize::new(0)); + let list_calls = Arc::new(AtomicUsize::new(0)); + let tool_calls = Arc::new(AtomicUsize::new(0)); + let cache = RemoteSessionCache::new(Duration::from_secs(30)); + + let connect = || { + let connections = connections.clone(); + let list_calls = list_calls.clone(); + let tool_calls = tool_calls.clone(); + connect_counting_server(connections, list_calls, tool_calls) + }; + + let first = cache.get_or_connect(connect).await.unwrap(); + let second = cache.get_or_connect(connect).await.unwrap(); + assert!(Arc::ptr_eq(&first.client, &second.client)); + assert_eq!( + first + .capabilities + .iter() + .map(String::as_str) + .collect::>(), + ["get_metadata"] + ); + assert!(!first.capabilities.contains("delete_node")); + for session in [&first, &second] { + session + .client + .call_tool(CallToolRequestParams::new("get_metadata").with_arguments(Map::new())) + .await + .unwrap(); + } + + assert_eq!(connections.load(Ordering::SeqCst), 1); + assert_eq!(list_calls.load(Ordering::SeqCst), 1); + assert_eq!(tool_calls.load(Ordering::SeqCst), 2); + } + + #[tokio::test] + async fn expired_session_reconnects_and_reverifies_capabilities() { + let connections = Arc::new(AtomicUsize::new(0)); + let list_calls = Arc::new(AtomicUsize::new(0)); + let tool_calls = Arc::new(AtomicUsize::new(0)); + let cache = RemoteSessionCache::new(Duration::ZERO); + + let connect = + || connect_counting_server(connections.clone(), list_calls.clone(), tool_calls.clone()); + let first = cache.get_or_connect(connect).await.unwrap(); + let second = cache.get_or_connect(connect).await.unwrap(); + + assert!(!Arc::ptr_eq(&first.client, &second.client)); + assert_eq!(connections.load(Ordering::SeqCst), 2); + assert_eq!(list_calls.load(Ordering::SeqCst), 2); + assert!(!second.capabilities.contains("delete_node")); + } +} diff --git a/crates/devup-mcp-figma/src/url.rs b/crates/devup-mcp-figma/src/url.rs new file mode 100644 index 0000000..50a6125 --- /dev/null +++ b/crates/devup-mcp-figma/src/url.rs @@ -0,0 +1,97 @@ +use url::Url; + +use serde::{Deserialize, Serialize}; + +use super::DevupError; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FigmaTarget { + pub file_key: String, + pub node_id: Option, + pub branch_key: Option, +} + +impl FigmaTarget { + pub fn parse(input: &str) -> Result { + let url = Url::parse(input) + .map_err(|_| DevupError::unsupported_file("올바른 Figma 링크가 아닙니다."))?; + if url.scheme() != "https" || !matches!(url.host_str(), Some("figma.com" | "www.figma.com")) + { + return Err(DevupError::unsupported_file( + "HTTPS Figma 디자인 링크만 사용할 수 있습니다.", + )); + } + + let segments = url + .path_segments() + .map(|segments| segments.filter(|part| !part.is_empty()).collect::>()) + .unwrap_or_default(); + let (file_key, branch_key) = match segments.as_slice() { + ["design" | "file", file_key, ..] => ((*file_key).to_owned(), None), + ["branch", file_key, branch_key, ..] => { + ((*file_key).to_owned(), Some((*branch_key).to_owned())) + } + _ => { + return Err(DevupError::unsupported_file( + "지원하는 Figma design, file 또는 branch 링크가 아닙니다.", + )); + } + }; + + validate_key(&file_key)?; + if let Some(branch_key) = &branch_key { + validate_key(branch_key)?; + } + + let node_id = url + .query_pairs() + .find_map(|(name, value)| (name == "node-id").then(|| value.into_owned())) + .map(|node_id| normalize_node_id(&node_id)) + .transpose()?; + + Ok(Self { + file_key, + node_id, + branch_key, + }) + } +} + +fn validate_key(key: &str) -> Result<(), DevupError> { + if key.len() < 6 + || !key + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + { + return Err(DevupError::unsupported_file( + "Figma 파일 또는 브랜치 키 형식이 올바르지 않습니다.", + )); + } + Ok(()) +} + +fn normalize_node_id(node_id: &str) -> Result { + let normalized = if node_id.contains(':') { + node_id.to_owned() + } else if let Some((left, right)) = node_id.split_once('-') { + format!("{left}:{right}") + } else { + return Err(DevupError::unsupported_file( + "Figma node-id 형식이 올바르지 않습니다.", + )); + }; + + let mut parts = normalized.split(':'); + let valid = matches!((parts.next(), parts.next(), parts.next()), (Some(left), Some(right), None) + if !left.is_empty() + && !right.is_empty() + && left.bytes().all(|byte| byte.is_ascii_digit()) + && right.bytes().all(|byte| byte.is_ascii_digit())); + if !valid { + return Err(DevupError::unsupported_file( + "Figma node-id 형식이 올바르지 않습니다.", + )); + } + Ok(normalized) +} diff --git a/crates/devup-mcp-figma/src/variables.rs b/crates/devup-mcp-figma/src/variables.rs new file mode 100644 index 0000000..7c16c29 --- /dev/null +++ b/crates/devup-mcp-figma/src/variables.rs @@ -0,0 +1,377 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; + +use crate::{DevupError, ErrorCode, ResourceKind, UpstreamResult, UsedResourceRefs}; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourceStyleRef { + pub id: String, + pub style_type: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub consumer_start: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub consumer_end: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourceBatch { + #[serde(default)] + pub variable_ids: Vec, + #[serde(default)] + pub styles: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct VariableCatalog { + #[serde(default)] + pub collections: Vec, + #[serde(default)] + pub variable_ids: Vec, + #[serde(default)] + pub styles: Vec, + #[serde(default)] + pub local_complete: bool, + #[serde(default)] + pub used_remote_complete: bool, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct VariableBatchResult { + #[serde(default)] + pub collections: Vec, + #[serde(default)] + pub variables: Vec, + #[serde(default)] + pub styles: Vec, + #[serde(default)] + pub unresolved: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct UnresolvedResource { + pub id: String, + pub kind: ResourceKind, + pub reason: String, +} + +pub(crate) struct UsedResourceMerge { + pub result: UpstreamResult, + pub unresolved: Vec, +} + +pub(crate) fn catalog_from_result(result: &UpstreamResult) -> Result { + find::(&result.raw, &["collections", "variableIds", "styles"]) + .ok_or_else(invalid_variable_result) +} + +pub(crate) fn batch_from_result( + result: &UpstreamResult, +) -> Result { + find::(&result.raw, &["variables", "styles"]) + .ok_or_else(invalid_variable_result) +} + +pub(crate) fn merge_variable_results( + catalog: VariableCatalog, + batches: impl IntoIterator, +) -> Result { + let mut variables = Vec::new(); + let mut styles_by_id = std::collections::BTreeMap::::new(); + let mut consumer_counts = std::collections::BTreeMap::::new(); + let mut consumer_fragments = + std::collections::BTreeMap::>>::new(); + for batch in batches { + variables.extend(batch.variables); + for mut style in batch.styles { + let Some(object) = style.as_object_mut() else { + return Err(invalid_variable_result()); + }; + let Some(id) = object.get("id").and_then(Value::as_str).map(str::to_owned) else { + return Err(invalid_variable_result()); + }; + if let Some(start) = object + .remove("$consumerStart") + .and_then(|value| value.as_u64()) + { + let entries = object + .remove("$consumerEntries") + .and_then(|value| value.as_array().cloned()) + .ok_or_else(invalid_variable_result)?; + let consumers = entries + .into_iter() + .map(expand_consumer_entry) + .collect::, _>>()?; + consumer_fragments + .entry(id) + .or_default() + .insert(start as usize, consumers); + continue; + } + let count = object + .remove("$consumerCount") + .and_then(|value| value.as_u64()) + .unwrap_or(0) as usize; + consumer_counts.insert(id.clone(), count); + styles_by_id.insert(id, style); + } + } + let mut styles = Vec::with_capacity(catalog.styles.len()); + for style_ref in &catalog.styles { + let mut style = styles_by_id.remove(&style_ref.id).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma style이 삭제되거나 변경되었습니다.", + true, + ) + })?; + let expected = consumer_counts.remove(&style_ref.id).unwrap_or(0); + let mut consumers = Vec::with_capacity(expected); + for (start, mut fragment) in consumer_fragments.remove(&style_ref.id).unwrap_or_default() { + if start != consumers.len() { + return Err(incomplete_consumers()); + } + consumers.append(&mut fragment); + } + if consumers.len() != expected { + return Err(incomplete_consumers()); + } + style + .as_object_mut() + .ok_or_else(invalid_variable_result)? + .insert("consumers".to_owned(), Value::Array(consumers)); + styles.push(style); + } + Ok(UpstreamResult { + raw: json!({ + "collections": catalog.collections, + "variables": variables, + "styles": styles, + "usedRemoteVariables": [], + "localComplete": catalog.local_complete, + "usedRemoteComplete": catalog.used_remote_complete + }), + }) +} + +pub(crate) fn merge_used_resource_results( + refs: &UsedResourceRefs, + batches: impl IntoIterator, +) -> Result { + let mut collections_by_id = std::collections::BTreeMap::::new(); + let mut variables_by_id = std::collections::BTreeMap::::new(); + let mut styles_by_id = std::collections::BTreeMap::::new(); + let mut unresolved_by_key = + std::collections::BTreeMap::<(ResourceKind, String), UnresolvedResource>::new(); + + for batch in batches { + for collection in batch.collections { + let id = resource_value_id(&collection)?; + collections_by_id.insert(id, collection); + } + for variable in batch.variables { + let id = resource_value_id(&variable)?; + variables_by_id.insert(id, variable); + } + for style in batch.styles { + let id = resource_value_id(&style)?; + styles_by_id.insert(id, style); + } + for unresolved in batch.unresolved { + unresolved_by_key.insert((unresolved.kind, unresolved.id.clone()), unresolved); + } + } + + let mut variables = Vec::with_capacity(refs.variable_ids.len()); + for id in &refs.variable_ids { + if let Some(variable) = variables_by_id.remove(id) { + variables.push(variable); + } else { + unresolved_by_key + .entry((ResourceKind::Variable, id.clone())) + .or_insert_with(|| UnresolvedResource { + id: id.clone(), + kind: ResourceKind::Variable, + reason: "notFoundOrUnavailable".to_owned(), + }); + } + } + + let mut styles = Vec::with_capacity(refs.styles.len()); + for style_ref in &refs.styles { + if let Some(style) = styles_by_id.remove(&style_ref.id) { + styles.push(style); + } else { + unresolved_by_key + .entry((ResourceKind::Style, style_ref.id.clone())) + .or_insert_with(|| UnresolvedResource { + id: style_ref.id.clone(), + kind: ResourceKind::Style, + reason: "notFoundOrUnavailable".to_owned(), + }); + } + } + + let unresolved = unresolved_by_key.into_values().collect::>(); + let collections = collections_by_id.into_values().collect::>(); + let used_remote_variables = variables + .iter() + .filter(|variable| variable.get("remote").and_then(Value::as_bool) == Some(true)) + .cloned() + .collect::>(); + let used_style_ids = refs + .styles + .iter() + .map(|style| style.id.as_str()) + .collect::>(); + let used_remote_complete = unresolved.is_empty(); + Ok(UsedResourceMerge { + result: UpstreamResult { + raw: json!({ + "collections": collections, + "variables": variables, + "styles": styles, + "usedRemoteVariables": used_remote_variables, + "localComplete": false, + "usedRemoteComplete": used_remote_complete, + "unresolved": &unresolved, + "usedVariableIds": &refs.variable_ids, + "usedStyleIds": used_style_ids + }), + }, + unresolved, + }) +} + +fn resource_value_id(value: &Value) -> Result { + value + .get("id") + .and_then(Value::as_str) + .map(str::to_owned) + .ok_or_else(invalid_variable_result) +} + +fn expand_consumer_entry(entry: Value) -> Result { + let values = entry.as_array().ok_or_else(invalid_variable_result)?; + if values.len() != 3 { + return Err(invalid_variable_result()); + } + let node_id = values[0].as_str().ok_or_else(invalid_variable_result)?; + let node_type = values[1].as_str().ok_or_else(invalid_variable_result)?; + Ok(json!({ + "node": { "$nodeId": node_id, "$nodeType": node_type }, + "fields": values[2].clone() + })) +} + +fn incomplete_consumers() -> DevupError { + DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma style consumer 목록이 변경되었습니다.", + true, + ) +} + +fn find(value: &Value, required_keys: &[&str]) -> Option +where + T: for<'de> Deserialize<'de>, +{ + if let Value::Object(object) = value + && required_keys.iter().all(|key| object.contains_key(*key)) + && let Ok(parsed) = serde_json::from_value(value.clone()) + { + return Some(parsed); + } + match value { + Value::Object(object) => { + if let Some(Value::String(text)) = object.get("text") + && let Ok(value) = serde_json::from_str::(text) + && let Some(parsed) = find(&value, required_keys) + { + return Some(parsed); + } + object.values().find_map(|value| find(value, required_keys)) + } + Value::Array(values) => values.iter().find_map(|value| find(value, required_keys)), + Value::String(text) => serde_json::from_str::(text) + .ok() + .and_then(|value| find(&value, required_keys)), + _ => None, + } +} + +fn invalid_variable_result() -> DevupError { + DevupError::new( + ErrorCode::DevupThemeConflict, + "Figma MCP 응답에서 변수/style batch를 찾지 못했습니다.", + false, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn merges_compact_consumer_fragments_in_range_order() { + let catalog = VariableCatalog { + collections: Vec::new(), + variable_ids: Vec::new(), + styles: vec![ResourceStyleRef { + id: "s1".to_owned(), + style_type: "TEXT".to_owned(), + consumer_start: None, + consumer_end: None, + }], + local_complete: true, + used_remote_complete: false, + }; + let batches = vec![ + VariableBatchResult { + collections: Vec::new(), + variables: Vec::new(), + styles: vec![json!({ + "id": "s1", + "name": "Body", + "styleType": "TEXT", + "value": {"fontSize": 16}, + "$consumerCount": 2 + })], + unresolved: Vec::new(), + }, + VariableBatchResult { + collections: Vec::new(), + variables: Vec::new(), + styles: vec![json!({ + "id": "s1", + "styleType": "TEXT", + "$consumerStart": 1, + "$consumerEntries": [["2:2", "TEXT", ["textStyleId"]]] + })], + unresolved: Vec::new(), + }, + VariableBatchResult { + collections: Vec::new(), + variables: Vec::new(), + styles: vec![json!({ + "id": "s1", + "styleType": "TEXT", + "$consumerStart": 0, + "$consumerEntries": [["2:1", "TEXT", ["textStyleId"]]] + })], + unresolved: Vec::new(), + }, + ]; + + let merged = merge_variable_results(catalog, batches).unwrap(); + let consumers = merged.raw["styles"][0]["consumers"].as_array().unwrap(); + assert_eq!(consumers.len(), 2); + assert_eq!(consumers[0]["node"]["$nodeId"], "2:1"); + assert_eq!(consumers[1]["node"]["$nodeId"], "2:2"); + assert_eq!(merged.raw["styles"][0]["value"]["fontSize"], 16); + } +} diff --git a/crates/devup-mcp-figma/tests/assets.rs b/crates/devup-mcp-figma/tests/assets.rs new file mode 100644 index 0000000..539705a --- /dev/null +++ b/crates/devup-mcp-figma/tests/assets.rs @@ -0,0 +1,189 @@ +use std::collections::BTreeMap; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{ + AssetFormat, AssetRequest, AssetSelection, AssetStatus, CollectionRequest, CollectionScope, + CollectorSession, CollectorStep, FigmaTarget, RawNode, ReadToolCall, Snapshot, UpstreamResult, + asset_export_from_result, discover_asset_manifest, +}; +use serde_json::{Map, json}; + +fn node(id: &str, node_type: &str, fields: serde_json::Value) -> RawNode { + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(fields).unwrap(), + extra: Map::new(), + field_errors: BTreeMap::new(), + } +} + +#[test] +fn collector_exports_only_explicit_assets_and_preserves_snapshot_on_export_failure() { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=1-1").unwrap(); + let mut request = CollectionRequest::new(target, CollectionScope::Node); + request.asset_selections = vec![AssetSelection { + asset_id: "1:1:fills:1".to_owned(), + format: AssetFormat::Png, + scale: 2, + }]; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata) = collector.advance().unwrap() else { + panic!("metadata") + }; + collector + .accept( + &metadata.id, + UpstreamResult { + raw: json!({"structuredContent":{"devupMetadata":{ + "fileKey":"FileKey123","version":"v1","rootId":"1:1", + "nodes":[{"id":"1:1","type":"FRAME","childrenIds":[],"descendantCount":0}] + }}}), + }, + ) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("snapshot") + }; + collector + .accept( + &snapshot_call.id, + UpstreamResult { + raw: json!({ + "fileKey":"FileKey123","version":"v1","rootIds":["1:1"], + "nodes":[ + serde_json::to_value(snapshot().nodes["1:1"].clone()).unwrap(), + {"id":"__DEVUP_SNAPSHOT_CURSOR__","type":"DEVUP_INTERNAL","fields":{"nextOffset":1,"complete":true,"totalNodes":1},"extra":{},"fieldErrors":{}} + ],"diagnostics":[] + }), + }, + ) + .unwrap(); + + let CollectorStep::Call(asset_call) = collector.advance().unwrap() else { + panic!("explicit asset export") + }; + let ReadToolCall::AssetExport { request, .. } = asset_call.call else { + panic!("asset export call") + }; + assert_eq!(request.asset_id, "1:1:fills:1"); + collector + .accept( + &asset_call.id, + UpstreamResult { + raw: json!({ + "kind":"devupAssetExport","fileKey":"FileKey123","version":"v1", + "assetId":"1:1:fills:1","nodeId":"1:1","field":"fills/1", + "imageHash":"image-hash-123","format":"png","scale":2, + "status":"failed","byteLength":null,"sha256":null, + "errorCode":"DEVUP_ASSET_EXPORT_FAILED" + }), + }, + ) + .unwrap(); + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("complete") + }; + assert_eq!(parts.assets.len(), 1); + assert_eq!(parts.assets[0].status, AssetStatus::Failed); + assert_eq!(parts.snapshot_chunks[0].nodes.len(), 1); + assert!( + parts.snapshot_chunks[0] + .diagnostics + .iter() + .any(|diagnostic| diagnostic.code == "DEVUP_ASSET_EXPORT_FAILED") + ); +} + +fn snapshot() -> Snapshot { + Snapshot { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + roots: vec!["1:1".to_owned()], + nodes: [ + node( + "1:1", + "FRAME", + json!({ + "childrenIds": ["1:2"], + "fills": [ + {"type": "SOLID", "color": {"r": 1, "g": 1, "b": 1}}, + {"type": "IMAGE", "imageHash": "image-hash-123", "scaleMode": "FILL"} + ] + }), + ), + node( + "1:2", + "VECTOR", + json!({"parentId": "1:1", "childrenIds": [], "fills": []}), + ), + ] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + } +} + +#[test] +fn manifest_preserves_image_and_vector_source_details_without_exporting_bytes() { + let manifest = discover_asset_manifest(&snapshot()); + + assert_eq!(manifest.version, 1); + assert_eq!(manifest.assets.len(), 2); + assert_eq!(manifest.assets[0].asset_id, "1:1:fills:1"); + assert_eq!(manifest.assets[0].node_id, "1:1"); + assert_eq!(manifest.assets[0].field, "fills/1"); + assert_eq!(manifest.assets[0].source_kind, "image-fill"); + assert_eq!( + manifest.assets[0].image_hash.as_deref(), + Some("image-hash-123") + ); + assert_eq!(manifest.assets[0].status, AssetStatus::Available); + assert_eq!(manifest.assets[1].asset_id, "1:2:node"); + assert_eq!(manifest.assets[1].source_kind, "vector-node"); + assert!(manifest.assets[1].data_base64.is_none()); +} + +#[test] +fn exported_asset_validates_descriptor_bytes_hash_and_requested_settings() { + let bytes = b"synthetic-png"; + let request = AssetRequest { + asset_id: "1:1:fills:1".to_owned(), + node_id: "1:1".to_owned(), + field: "fills/1".to_owned(), + image_hash: Some("image-hash-123".to_owned()), + format: AssetFormat::Png, + scale: 2, + }; + let result = UpstreamResult { + raw: json!({"content": [ + {"type":"text","text": json!({ + "kind":"devupAssetExport","fileKey":"FileKey123","version":"v1", + "assetId":"1:1:fills:1","nodeId":"1:1","field":"fills/1", + "imageHash":"image-hash-123","format":"png","scale":2, + "status":"exported","byteLength":bytes.len(), + "sha256":"294ad7145322ec19f8250cca8480a933f1ce8c9e2ad1038e7ae8930d55a6598a" + }).to_string()}, + {"type":"image","data":STANDARD.encode(bytes),"mimeType":"image/png"} + ]}), + }; + + let exported = asset_export_from_result(&result, "FileKey123", Some("v1"), &request).unwrap(); + assert_eq!(exported.status, AssetStatus::Exported); + assert_eq!(exported.byte_length, Some(bytes.len())); + let encoded = STANDARD.encode(bytes); + assert_eq!(exported.data_base64.as_deref(), Some(encoded.as_str())); + + let mut mismatched = result; + mismatched.raw["content"][0]["text"] = json!({ + "kind":"devupAssetExport","fileKey":"FileKey123","version":"v1", + "assetId":"wrong","nodeId":"1:1","field":"fills/1","imageHash":"image-hash-123", + "format":"png","scale":2,"status":"exported","byteLength":bytes.len(), + "sha256":"294ad7145322ec19f8250cca8480a933f1ce8c9e2ad1038e7ae8930d55a6598a" + }) + .to_string() + .into(); + assert!(asset_export_from_result(&mismatched, "FileKey123", Some("v1"), &request).is_err()); +} diff --git a/crates/devup-mcp-figma/tests/collector.rs b/crates/devup-mcp-figma/tests/collector.rs new file mode 100644 index 0000000..83f746c --- /dev/null +++ b/crates/devup-mcp-figma/tests/collector.rs @@ -0,0 +1,1862 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{ + BuiltinScript, CollectionRequest, CollectionScope, CollectorSession, CollectorStep, DevupError, + DiagnosticSeverity, ErrorCode, ExploreBounds, ExploreReadOptions, FigmaTarget, ReadToolCall, + ResourceScope, SectionCandidate, SectionIndex, SectionReadOptions, SectionSummary, + UpstreamResult, merge_chunks, +}; +use image::{ExtendedColorType, ImageEncoder, codecs::png::PngEncoder}; +use serde_json::{Value, json}; + +#[test] +fn exact_node_fast_path_completes_in_one_call() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast snapshot call expected") + }; + assert_eq!(fast_call.call.tool_name(), "use_figma"); + assert!( + fast_call.call.arguments()["code"] + .as_str() + .unwrap() + .contains("devupFastSnapshotDescriptor") + ); + + collector + .accept(&fast_call.id, fast_envelope_result()) + .unwrap(); + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("fast snapshot should complete without another call") + }; + + assert_eq!(parts.snapshot_chunks.len(), 1); + assert_eq!(parts.snapshot_chunks[0].nodes.len(), 1); + assert_eq!(parts.stats.figma_tool_calls, 1); + assert_eq!(parts.stats.transport, "png-envelope-v1"); + assert!(!parts.stats.fallback_used); + assert_eq!(parts.stats.node_count, 1); + assert_eq!(parts.stats.variable_count, 0); + assert_eq!(parts.stats.style_count, 0); + let metadata = parts.metadata.to_string(); + assert!(!metadata.contains("image/png")); + assert!(!metadata.contains("devupFastSnapshotDescriptor")); +} + +#[test] +fn requested_reference_png_is_collected_after_the_design_snapshot() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.reference_png = true; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast snapshot call expected") + }; + collector + .accept(&fast_call.id, fast_envelope_result()) + .unwrap(); + + let CollectorStep::Call(screenshot_call) = collector.advance().unwrap() else { + panic!("reference screenshot call expected") + }; + assert_eq!(screenshot_call.call.tool_name(), "get_screenshot"); + assert_eq!(screenshot_call.call.arguments()["fileKey"], "FileKey123"); + assert_eq!(screenshot_call.call.arguments()["nodeId"], "1:2"); + let data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="; + collector + .accept( + &screenshot_call.id, + UpstreamResult { + raw: json!({"content": [{"type": "image", "mimeType": "image/png", "data": data}]}), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("collection should complete with its reference PNG") + }; + let reference = parts.reference_png.expect("reference PNG"); + assert_eq!(reference.mime_type, "image/png"); + assert_eq!(reference.data_base64, data); + assert_eq!(reference.byte_length, STANDARD.decode(data).unwrap().len()); + assert_eq!(reference.sha256.len(), 64); + assert_eq!(parts.stats.figma_tool_calls, 2); +} + +#[test] +fn reference_png_rejects_a_signature_only_payload() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + let signature_only = STANDARD.encode(b"\x89PNG\r\n\x1a\n"); + + let error = collector + .accept( + &screenshot_call_id, + screenshot_result(json!({ + "type": "image", + "mimeType": "image/png", + "data": signature_only + })), + ) + .expect_err("a PNG signature without chunks or pixels must be rejected"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_a_truncated_image() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + let mut png = STANDARD.decode(valid_reference_png_base64()).unwrap(); + png.truncate(png.len() - 8); + + let error = collector + .accept( + &screenshot_call_id, + screenshot_result(json!({ + "type": "image", + "mimeType": "image/png", + "data": STANDARD.encode(png) + })), + ) + .expect_err("a truncated PNG must be rejected even when its signature is intact"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_multiple_image_content_blocks() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + let image = json!({ + "type": "image", + "mimeType": "image/png", + "data": valid_reference_png_base64() + }); + + let error = collector + .accept( + &screenshot_call_id, + UpstreamResult { + raw: json!({"content": [image.clone(), image]}), + }, + ) + .expect_err("referencePng accepts exactly one official ImageContent block"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_zero_content_blocks() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + + let error = collector + .accept( + &screenshot_call_id, + UpstreamResult { + raw: json!({"content": []}), + }, + ) + .expect_err("referencePng requires exactly one ImageContent block"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_an_image_hidden_in_json_text() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + let hidden = json!({ + "type": "image", + "mimeType": "image/png", + "data": valid_reference_png_base64() + }) + .to_string(); + + let error = collector + .accept( + &screenshot_call_id, + screenshot_result(json!({"type": "text", "text": hidden})), + ) + .expect_err("JSON embedded in text is not an official ImageContent response"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_an_image_nested_outside_the_official_result() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + + let error = collector + .accept( + &screenshot_call_id, + UpstreamResult { + raw: json!({ + "result": { + "content": [{ + "type": "image", + "mimeType": "image/png", + "data": valid_reference_png_base64() + }] + } + }), + }, + ) + .expect_err("nested lookalikes are not the official CallToolResult shape"); + + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn reference_png_rejects_dimensions_above_the_decode_bound() { + let (mut collector, screenshot_call_id) = collector_awaiting_reference_png(); + let pixels = vec![0_u8; 8_193]; + let mut png = Vec::new(); + PngEncoder::new(&mut png) + .write_image(&pixels, 8_193, 1, ExtendedColorType::L8) + .unwrap(); + + let error = collector + .accept( + &screenshot_call_id, + screenshot_result(json!({ + "type": "image", + "mimeType": "image/png", + "data": STANDARD.encode(png) + })), + ) + .expect_err("decoded dimensions are bounded independently of compressed size"); + + assert_eq!(error.code, ErrorCode::DevupFigmaResponseTooLarge); +} + +#[test] +fn malformed_fast_result_restarts_legacy_from_metadata() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast call expected") + }; + collector + .accept( + &fast_call.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "unsupported"}]}), + }, + ) + .unwrap(); + + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("legacy metadata must restart after a malformed envelope") + }; + assert_eq!(metadata_call.call.tool_name(), "get_metadata"); + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("legacy snapshot expected") + }; + assert!( + snapshot_call.call.arguments()["code"] + .as_str() + .unwrap() + .contains("__DEVUP_SNAPSHOT_CURSOR__") + ); + collector + .accept(&snapshot_call.id, snapshot("1:2")) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("legacy fallback should complete") + }; + assert_eq!(parts.stats.figma_tool_calls, 3); + assert_eq!(parts.stats.transport, "legacy-cursor"); + assert!(parts.stats.fallback_used); + assert_eq!( + parts.stats.fallback_reason.as_deref(), + Some("descriptorMissing") + ); + assert_eq!(parts.stats.node_count, 1); +} + +#[test] +fn rejected_fast_call_can_restart_legacy_collection() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast call expected") + }; + + let recovered = collector + .reject( + &fast_call.id, + &DevupError::new( + ErrorCode::DevupFigmaDirectUnavailable, + "private upstream detail", + true, + ), + ) + .unwrap(); + + assert!(recovered); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("legacy metadata call expected") + }; + assert_eq!(metadata_call.call.tool_name(), "get_metadata"); +} + +#[test] +fn legacy_used_resources_combine_variables_and_styles_in_one_call() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept( + &fast_call.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "fallback"}]}), + }, + ) + .unwrap(); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + let mut used_snapshot = snapshot("1:2"); + used_snapshot.raw["nodes"][0]["fields"] = json!({ + "name": "Synthetic", + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "VariableID:1:2"}] + }, + "textStyleId": "S:text" + }); + collector.accept(&snapshot_call.id, used_snapshot).unwrap(); + + let CollectorStep::Call(resources_call) = collector.advance().unwrap() else { + panic!("one combined resource call expected") + }; + let code = resources_call.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(code.contains("VariableID:1:2")); + assert!(code.contains("S:text")); + assert!(matches!( + collector.advance().unwrap(), + CollectorStep::AwaitingResults + )); +} + +fn target(node_id: &str) -> FigmaTarget { + FigmaTarget::parse(&format!( + "https://www.figma.com/design/FileKey123/Fixture?node-id={}", + node_id.replace(':', "-") + )) + .unwrap() +} + +fn collector_awaiting_reference_png() -> (CollectorSession, String) { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.reference_png = true; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast snapshot call expected") + }; + collector + .accept(&fast_call.id, fast_envelope_result()) + .unwrap(); + let CollectorStep::Call(screenshot_call) = collector.advance().unwrap() else { + panic!("reference screenshot call expected") + }; + (collector, screenshot_call.id) +} + +fn screenshot_result(content: Value) -> UpstreamResult { + UpstreamResult { + raw: json!({"content": [content]}), + } +} + +fn valid_reference_png_base64() -> &'static str { + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=" +} + +fn fast_envelope_result() -> UpstreamResult { + let mut envelope = json!({ + "schemaVersion": 1, + "source": {"fileKey": "FileKey123", "rootId": "1:2"}, + "snapshot": { + "fileKey": "FileKey123", + "version": "v1", + "rootIds": ["1:2"], + "nodes": [{ + "id": "1:2", + "type": "FRAME", + "fields": {"name": "Synthetic", "childrenIds": []}, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + }, + "resources": { + "collections": [], + "variables": [], + "styles": [], + "usedRemoteVariables": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "nodeCount": 1, + "variableRefCount": 0, + "styleRefCount": 0, + "utf8Bytes": 0 + } + }); + let envelope_bytes = loop { + let bytes = serde_json::to_vec(&envelope).unwrap(); + if envelope["integrity"]["utf8Bytes"] == bytes.len() as u64 { + break bytes; + } + envelope["integrity"]["utf8Bytes"] = Value::from(bytes.len()); + }; + + let mut png = b"\x89PNG\r\n\x1a\n".to_vec(); + push_png_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut payload = Vec::with_capacity(envelope_bytes.len() + 8); + payload.extend_from_slice(&0_u32.to_be_bytes()); + payload.extend_from_slice(&1_u32.to_be_bytes()); + payload.extend_from_slice(&envelope_bytes); + push_png_chunk(&mut png, b"duVp", &payload); + push_png_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_png_chunk(&mut png, b"IEND", &[]); + let descriptor = json!({ + "kind": "devupFastSnapshotDescriptor", + "schemaVersion": 1, + "rootId": "1:2", + "nodeCount": 1, + "variableRefCount": 0, + "styleRefCount": 0, + "utf8Bytes": envelope_bytes.len(), + "chunkCount": 1 + }); + UpstreamResult { + raw: json!({"content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ]}), + } +} + +fn fast_theme_envelope_result() -> UpstreamResult { + let mut envelope = json!({ + "schemaVersion": 1, + "source": {"fileKey": "FileKey123", "version": "v2"}, + "resources": { + "collections": [{"id": "c", "name": "Theme"}], + "variables": [{"id": "v", "name": "primary"}], + "styles": [{"id": "s", "name": "body", "styleType": "TEXT"}], + "usedRemoteVariables": [], + "usedVariableIds": ["v"], + "usedStyleIds": ["s"], + "localComplete": true, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "collectionCount": 1, + "variableCount": 1, + "styleCount": 1, + "unresolvedCount": 0, + "utf8Bytes": 0 + } + }); + let envelope_bytes = loop { + let bytes = serde_json::to_vec(&envelope).unwrap(); + if envelope["integrity"]["utf8Bytes"] == bytes.len() as u64 { + break bytes; + } + envelope["integrity"]["utf8Bytes"] = Value::from(bytes.len()); + }; + let mut png = b"\x89PNG\r\n\x1a\n".to_vec(); + push_png_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut payload = Vec::with_capacity(envelope_bytes.len() + 8); + payload.extend_from_slice(&0_u32.to_be_bytes()); + payload.extend_from_slice(&1_u32.to_be_bytes()); + payload.extend_from_slice(&envelope_bytes); + push_png_chunk(&mut png, b"duVp", &payload); + push_png_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_png_chunk(&mut png, b"IEND", &[]); + let descriptor = json!({ + "kind": "devupFastThemeDescriptor", + "schemaVersion": 1, + "collectionCount": 1, + "variableCount": 1, + "styleCount": 1, + "unresolvedCount": 0, + "utf8Bytes": envelope_bytes.len(), + "chunkCount": 1 + }); + UpstreamResult { + raw: json!({"content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ]}), + } +} + +fn push_png_chunk(output: &mut Vec, chunk_type: &[u8; 4], data: &[u8]) { + output.extend_from_slice(&(data.len() as u32).to_be_bytes()); + output.extend_from_slice(chunk_type); + output.extend_from_slice(data); + let mut crc_input = Vec::with_capacity(4 + data.len()); + crc_input.extend_from_slice(chunk_type); + crc_input.extend_from_slice(data); + output.extend_from_slice(&crc32(&crc_input).to_be_bytes()); +} + +fn crc32(bytes: &[u8]) -> u32 { + let mut crc = u32::MAX; + for byte in bytes { + crc ^= u32::from(*byte); + for _ in 0..8 { + crc = (crc >> 1) ^ (0xedb8_8320 & 0_u32.wrapping_sub(crc & 1)); + } + } + !crc +} + +fn file_target() -> FigmaTarget { + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture").unwrap() +} + +fn metadata(node_type: &str, children: &[&str], descendant_count: usize) -> UpstreamResult { + UpstreamResult { + raw: json!({ + "structuredContent": { + "devupMetadata": { + "fileKey": "FileKey123", + "version": "v1", + "rootId": "1:2", + "nodes": [{ + "id": "1:2", + "type": node_type, + "childrenIds": children, + "descendantCount": descendant_count + }] + } + } + }), + } +} + +fn snapshot(root_id: &str) -> UpstreamResult { + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", + "version": "v1", + "rootIds": [root_id], + "nodes": [{ + "id": root_id, + "type": "FRAME", + "fields": {"name": "Synthetic"}, + "extra": {}, + "fieldErrors": {} + }] + }), + } +} + +fn official_xml_metadata() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "content": [ + { + "type": "text", + "text": "" + }, + { + "type": "text", + "text": "Synthetic guidance that is not metadata" + } + ] + }), + } +} + +fn official_top_level_pages() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "content": [{ + "type": "text", + "text": "No nodeId was provided. Listing the top-level pages of the document. Call get_metadata again with one of the page ids below (or any node id underneath) to get the XML metadata for that subtree.\n\nTop-level pages of the document:\n- 0:1: 표지\n- 12:34: 본문: 교정" + }] + }), + } +} + +fn file_page_metadata() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "structuredContent": { + "devupMetadata": { + "fileKey": "FileKey123", + "version": "v1", + "rootId": "0:1", + "nodes": [ + { + "id": "0:1", + "type": "PAGE", + "name": "표지", + "childrenIds": ["1:2"], + "descendantCount": 1 + }, + { + "id": "1:2", + "type": "FRAME", + "name": "A : STORY-F-PROOFREAD", + "childrenIds": [], + "descendantCount": 0 + } + ] + } + } + }), + } +} + +#[test] +fn file_scope_starts_from_the_file_even_when_the_url_contains_a_node() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::File); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("metadata call expected") + }; + assert_eq!(metadata_call.call.tool_name(), "get_metadata"); + assert_eq!(metadata_call.expected_node_id, None); + assert_eq!(metadata_call.call.arguments()["nodeId"], json!(null)); +} + +#[test] +fn official_top_level_page_list_expands_to_page_metadata_calls() { + let request = CollectionRequest::new(file_target(), CollectionScope::File); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(file_metadata) = collector.advance().unwrap() else { + panic!("file metadata call expected") + }; + + collector + .accept(&file_metadata.id, official_top_level_pages()) + .unwrap(); + + let CollectorStep::Call(first_page) = collector.advance().unwrap() else { + panic!("first page metadata call expected") + }; + let CollectorStep::Call(second_page) = collector.advance().unwrap() else { + panic!("second page metadata call expected") + }; + assert_eq!(first_page.call.tool_name(), "get_metadata"); + assert_eq!(first_page.expected_node_id.as_deref(), Some("0:1")); + assert_eq!(second_page.call.tool_name(), "get_metadata"); + assert_eq!(second_page.expected_node_id.as_deref(), Some("12:34")); +} + +#[test] +fn metadata_only_file_collection_completes_without_snapshot_calls() { + let mut request = CollectionRequest::new(file_target(), CollectionScope::File); + request.metadata_only = true; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(file_metadata) = collector.advance().unwrap() else { + panic!("file metadata call expected") + }; + collector + .accept(&file_metadata.id, official_top_level_pages()) + .unwrap(); + + let CollectorStep::Call(first_page) = collector.advance().unwrap() else { + panic!("first page metadata call expected") + }; + let CollectorStep::Call(second_page) = collector.advance().unwrap() else { + panic!("second page metadata call expected") + }; + collector + .accept(&first_page.id, file_page_metadata()) + .unwrap(); + let mut second = file_page_metadata(); + second.raw["structuredContent"]["devupMetadata"]["rootId"] = json!("12:34"); + second.raw["structuredContent"]["devupMetadata"]["nodes"] = json!([{ + "id": "12:34", + "type": "PAGE", + "name": "본문: 교정", + "childrenIds": [], + "descendantCount": 0 + }]); + collector.accept(&second_page.id, second).unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("metadata-only collection should complete") + }; + assert_eq!(parts.snapshot_chunks.len(), 1); + let chunk = &parts.snapshot_chunks[0]; + assert_eq!(chunk.root_ids, ["0:1", "12:34"]); + assert_eq!(chunk.nodes.len(), 3); + let match_node = chunk.nodes.iter().find(|node| node.id == "1:2").unwrap(); + assert_eq!(match_node.fields["name"], json!("A : STORY-F-PROOFREAD")); +} + +#[test] +fn variables_only_file_collection_skips_page_and_node_snapshots() { + let mut request = CollectionRequest::new(file_target(), CollectionScope::File); + request.resource_scope = ResourceScope::File; + request.variables_only = true; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(fast_theme) = collector.advance().unwrap() else { + panic!("fast theme call expected") + }; + assert_eq!(fast_theme.call.tool_name(), "use_figma"); + assert!( + fast_theme.call.arguments()["code"] + .as_str() + .unwrap() + .contains("devupFastThemeDescriptor") + ); + collector + .accept(&fast_theme.id, fast_theme_envelope_result()) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("valid fast theme should complete in one call") + }; + assert_eq!(parts.stats.figma_tool_calls, 1); + assert_eq!(parts.stats.transport, "png-theme-envelope-v1"); + assert!(!parts.stats.fallback_used); + assert_eq!(parts.stats.variable_count, 1); + assert_eq!(parts.stats.style_count, 1); + assert_eq!(parts.variables.as_ref().unwrap().raw["localComplete"], true); +} + +#[test] +fn malformed_or_rejected_fast_theme_restarts_legacy_collection_atomically() { + let mut request = CollectionRequest::new(file_target(), CollectionScope::File); + request.resource_scope = ResourceScope::File; + request.variables_only = true; + let mut malformed = CollectorSession::new(request.clone()); + let CollectorStep::Call(fast) = malformed.advance().unwrap() else { + panic!("fast theme call expected") + }; + malformed + .accept( + &fast.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "corrupt"}]}), + }, + ) + .unwrap(); + let CollectorStep::Call(metadata) = malformed.advance().unwrap() else { + panic!("legacy metadata must restart from zero") + }; + assert_eq!(metadata.call.tool_name(), "get_metadata"); + assert_eq!(metadata.expected_node_id, None); + + let mut rejected = CollectorSession::new(request); + let CollectorStep::Call(fast) = rejected.advance().unwrap() else { + panic!("fast theme call expected") + }; + assert!( + rejected + .reject( + &fast.id, + &DevupError::new( + ErrorCode::DevupFigmaDirectUnavailable, + "fast theme unavailable", + true, + ), + ) + .unwrap() + ); + let CollectorStep::Call(metadata) = rejected.advance().unwrap() else { + panic!("rejected fast theme must restart legacy metadata") + }; + assert_eq!(metadata.call.tool_name(), "get_metadata"); +} + +#[test] +fn node_collection_advances_from_metadata_to_snapshot_to_complete() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("metadata call expected") + }; + assert_eq!(metadata_call.call.tool_name(), "get_metadata"); + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("snapshot call expected") + }; + assert_eq!(snapshot_call.call.tool_name(), "use_figma"); + assert_eq!(snapshot_call.expected_node_id.as_deref(), Some("1:2")); + collector + .accept(&snapshot_call.id, snapshot("1:2")) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("collection should be complete") + }; + assert_eq!(parts.target.node_id.as_deref(), Some("1:2")); + assert_eq!(parts.source_version.as_deref(), Some("v1")); + assert_eq!(parts.snapshot_chunks.len(), 1); +} + +#[test] +fn large_page_is_split_in_declared_child_order() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Page); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&call.id, metadata("PAGE", &["1:3", "1:4"], 500)) + .unwrap(); + + let CollectorStep::Call(first) = collector.advance().unwrap() else { + panic!() + }; + let CollectorStep::Call(second) = collector.advance().unwrap() else { + panic!() + }; + assert_eq!(first.expected_node_id.as_deref(), Some("1:3")); + assert_eq!(second.expected_node_id.as_deref(), Some("1:4")); + + collector.accept(&second.id, snapshot("1:4")).unwrap(); + collector.accept(&first.id, snapshot("1:3")).unwrap(); + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!() + }; + let root_order = parts + .snapshot_chunks + .iter() + .flat_map(|chunk| chunk.root_ids.iter().map(String::as_str)) + .collect::>(); + assert_eq!(root_order, ["1:3", "1:4"]); +} + +#[test] +fn rejects_snapshot_from_a_different_file_version() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + let mut wrong_version = snapshot("1:2"); + wrong_version.raw["version"] = json!("v2"); + + let error = collector + .accept(&snapshot_call.id, wrong_version) + .unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaVersionChanged); +} + +#[test] +fn exposes_at_most_four_in_flight_calls() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Page); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept( + &metadata_call.id, + metadata("PAGE", &["1:3", "1:4", "1:5", "1:6", "1:7"], 500), + ) + .unwrap(); + + let mut issued = Vec::new(); + for _ in 0..4 { + let CollectorStep::Call(call) = collector.advance().unwrap() else { + panic!("four calls should be available") + }; + issued.push(call); + } + assert!(matches!( + collector.advance().unwrap(), + CollectorStep::AwaitingResults + )); + + collector.accept(&issued[0].id, snapshot("1:3")).unwrap(); + let CollectorStep::Call(fifth) = collector.advance().unwrap() else { + panic!("the fifth call should be released after one result") + }; + assert_eq!(fifth.expected_node_id.as_deref(), Some("1:7")); +} + +#[test] +fn rejects_unknown_or_replayed_call_ids() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(call) = collector.advance().unwrap() else { + panic!() + }; + + let unknown = collector + .accept("unknown", metadata("FRAME", &[], 1)) + .unwrap_err(); + assert_eq!(unknown.code, ErrorCode::DevupFigmaHandoffInvalid); + + collector + .accept(&call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let replayed = collector + .accept(&call.id, metadata("FRAME", &[], 1)) + .unwrap_err(); + assert_eq!(replayed.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn variable_collection_uses_catalog_then_batched_resources() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::File; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&snapshot_call.id, snapshot("1:2")) + .unwrap(); + + let CollectorStep::Call(catalog_call) = collector.advance().unwrap() else { + panic!("variable/style catalog should follow the snapshot") + }; + let catalog_code = catalog_call.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(catalog_code.contains("getLocalVariableCollectionsAsync")); + assert!(!catalog_code.contains("getLocalVariablesAsync")); + let catalog = UpstreamResult { + raw: json!({ + "content": [{ + "type": "text", + "text": "{\"collections\":[{\"id\":\"c1\",\"name\":\"Synthetic\",\"defaultModeId\":\"m1\",\"modes\":[]}],\"variableIds\":[\"v1\"],\"styles\":[{\"id\":\"s1\",\"styleType\":\"TEXT\"}],\"localComplete\":true,\"usedRemoteComplete\":false}" + }] + }), + }; + collector.accept(&catalog_call.id, catalog).unwrap(); + + let CollectorStep::Call(batch_call) = collector.advance().unwrap() else { + panic!("resource batch should follow the catalog") + }; + let batch_code = batch_call.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(batch_code.contains("getVariableByIdAsync")); + assert!(batch_code.contains("getStyleByIdAsync")); + let variable_batch = UpstreamResult { + raw: json!({ + "content": [{ + "type": "text", + "text": "{\"variables\":[{\"id\":\"v1\",\"name\":\"Synthetic Variable\"}],\"styles\":[]}" + }] + }), + }; + collector.accept(&batch_call.id, variable_batch).unwrap(); + let CollectorStep::Call(style_call) = collector.advance().unwrap() else { + panic!("style batch should be separate") + }; + collector + .accept( + &style_call.id, + UpstreamResult { + raw: json!({ + "variables": [], + "styles": [{"id": "s1", "name": "Synthetic Style", "styleType": "TEXT", "value": {}}] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("collection should finish after variables") + }; + let merged = &parts.variables.as_ref().unwrap().raw; + assert_eq!(merged["collections"][0]["id"], "c1"); + assert_eq!(merged["variables"][0]["id"], "v1"); + assert_eq!(merged["styles"][0]["id"], "s1"); + assert_eq!(parts.styles.as_ref().unwrap().raw, *merged); +} + +#[test] +fn accepts_the_official_xml_metadata_envelope_without_inventing_values() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + + collector + .accept(&metadata_call.id, official_xml_metadata()) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + assert_eq!(snapshot_call.expected_file_key, "FileKey123"); + assert_eq!(snapshot_call.expected_node_id.as_deref(), Some("1:2")); +} + +#[test] +fn variable_batches_merge_in_catalog_order_when_results_arrive_out_of_order() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::File; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&snapshot_call.id, snapshot("1:2")) + .unwrap(); + let CollectorStep::Call(catalog_call) = collector.advance().unwrap() else { + panic!() + }; + let variable_ids = (0..9) + .map(|index| format!("v{index:02}")) + .collect::>(); + let expected_ids = variable_ids.clone(); + collector + .accept( + &catalog_call.id, + UpstreamResult { + raw: json!({ + "collections": [], + "variableIds": variable_ids, + "styles": [], + "localComplete": true, + "usedRemoteComplete": false + }), + }, + ) + .unwrap(); + let CollectorStep::Call(first) = collector.advance().unwrap() else { + panic!() + }; + let CollectorStep::Call(second) = collector.advance().unwrap() else { + panic!() + }; + let first_values = (0..8) + .map(|index| json!({"id": format!("v{index:02}")})) + .collect::>(); + collector + .accept( + &second.id, + UpstreamResult { + raw: json!({"variables": [{"id": "v08"}], "styles": []}), + }, + ) + .unwrap(); + collector + .accept( + &first.id, + UpstreamResult { + raw: json!({"variables": first_values, "styles": []}), + }, + ) + .unwrap(); + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!() + }; + let variables = parts.variables.unwrap(); + let ids = variables.raw["variables"] + .as_array() + .unwrap() + .iter() + .map(|variable| variable["id"].as_str().unwrap()) + .collect::>(); + assert_eq!(ids, expected_ids); +} + +#[test] +fn style_consumers_are_planned_as_compact_bounded_fragments() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::File; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept(&snapshot_call.id, snapshot("1:2")) + .unwrap(); + let CollectorStep::Call(catalog_call) = collector.advance().unwrap() else { + panic!() + }; + collector + .accept( + &catalog_call.id, + UpstreamResult { + raw: json!({ + "collections": [], + "variableIds": [], + "styles": [ + {"id": "s1", "styleType": "TEXT"}, + {"id": "s2", "styleType": "PAINT"} + ], + "localComplete": true, + "usedRemoteComplete": false + }), + }, + ) + .unwrap(); + + let CollectorStep::Call(base_styles) = collector.advance().unwrap() else { + panic!("style definitions should be batched") + }; + let base_arguments = base_styles.call.arguments(); + let base_code = base_arguments["code"].as_str().unwrap(); + assert!(base_code.contains("s1")); + assert!(base_code.contains("s2")); + collector + .accept( + &base_styles.id, + UpstreamResult { + raw: json!({ + "variables": [], + "styles": [ + {"id": "s1", "name": "Text", "styleType": "TEXT", "value": {}, "$consumerCount": 321}, + {"id": "s2", "name": "Paint", "styleType": "PAINT", "value": [], "$consumerCount": 0} + ] + }), + }, + ) + .unwrap(); + + let CollectorStep::Call(first) = collector.advance().unwrap() else { + panic!("first consumer fragment should be scheduled") + }; + let CollectorStep::Call(second) = collector.advance().unwrap() else { + panic!("second consumer fragment should be scheduled") + }; + let first_arguments = first.call.arguments(); + let second_arguments = second.call.arguments(); + let first_code = first_arguments["code"].as_str().unwrap(); + let second_code = second_arguments["code"].as_str().unwrap(); + assert!(first_code.contains("s1")); + assert!(first_code.contains("\"consumerStart\":0")); + assert!(first_code.contains("\"consumerEnd\":320")); + assert!(second_code.contains("s1")); + assert!(second_code.contains("\"consumerStart\":320")); + assert!(second_code.contains("\"consumerEnd\":321")); +} + +#[test] +fn used_scope_resolves_only_snapshot_references_and_keeps_partial_results() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast_call) = collector.advance().unwrap() else { + panic!("fast call expected") + }; + collector + .accept( + &fast_call.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "fallback"}]}), + }, + ) + .unwrap(); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("metadata call expected") + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 1)) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("snapshot call expected") + }; + let mut used_snapshot = snapshot("1:2"); + used_snapshot.raw["nodes"][0]["fields"] = json!({ + "name": "Synthetic", + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "VariableID:1:2"}] + }, + "textStyleId": "S:text" + }); + collector.accept(&snapshot_call.id, used_snapshot).unwrap(); + + let CollectorStep::Call(resource_call) = collector.advance().unwrap() else { + panic!("combined used resource batch should follow the snapshot") + }; + let resource_code = resource_call.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(resource_code.contains("getVariableByIdAsync")); + assert!(resource_code.contains("VariableID:1:2")); + assert!(resource_code.contains("S:text")); + assert!(!resource_code.contains("getStyleConsumersAsync")); + + collector + .accept( + &resource_call.id, + UpstreamResult { + raw: json!({ + "collections": [{ + "id": "collection:1", + "name": "Foundation", + "defaultModeId": "mode:1", + "modes": [{"modeId": "mode:1", "name": "Default"}] + }], + "variables": [{ + "id": "VariableID:1:2", + "name": "primary", + "remote": true, + "variableCollectionId": "collection:1", + "resolvedType": "COLOR", + "valuesByMode": {"mode:1": {"r": 1, "g": 0, "b": 0, "a": 1}} + }], + "styles": [], + "unresolved": [{"id": "S:text", "kind": "style", "reason": "notFoundOrUnavailable"}] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("used resource collection should complete") + }; + let resources = &parts.variables.as_ref().unwrap().raw; + assert_eq!(resources["collections"][0]["id"], "collection:1"); + assert_eq!(resources["variables"][0]["name"], "primary"); + assert_eq!(resources["styles"], json!([])); + assert_eq!(resources["usedRemoteComplete"], false); + assert_eq!(resources["unresolved"][0]["id"], "S:text"); + assert_eq!(resources["usedVariableIds"], json!(["VariableID:1:2"])); + assert_eq!(resources["usedStyleIds"], json!(["S:text"])); + let diagnostic = parts.snapshot_chunks[0] + .diagnostics + .iter() + .find(|diagnostic| diagnostic.code == "DEVUP_RESOURCE_UNRESOLVED") + .expect("unresolved resource diagnostic"); + assert_eq!(diagnostic.node_id.as_deref(), Some("1:2")); + assert_eq!(diagnostic.severity, Some(DiagnosticSeverity::Warning)); + assert_eq!(diagnostic.property.as_deref(), Some("textStyleId")); + assert_eq!(diagnostic.resource_kind.as_deref(), Some("style")); + assert_eq!(diagnostic.resource_id.as_deref(), Some("S:text")); + assert_eq!(diagnostic.fallback.as_deref(), Some("raw-value")); + assert_eq!(diagnostic.recoverable, Some(true)); +} + +#[test] +fn explore_collection_starts_with_one_bounded_projection_and_no_resources() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.explore = Some(ExploreReadOptions::default()); + request.resource_scope = ResourceScope::None; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(explore_call) = collector.advance().unwrap() else { + panic!("explore projection call expected") + }; + assert_eq!(explore_call.call.tool_name(), "use_figma"); + assert_eq!(explore_call.expected_node_id.as_deref(), Some("1:2")); + let code = explore_call.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(code.contains("projectionTruncated")); + assert!(!code.contains("getLocalVariableCollectionsAsync")); + assert!(!code.contains("getVariableByIdAsync")); + + collector + .accept( + &explore_call.id, + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", + "version": null, + "rootIds": ["0:1"], + "nodes": [ + { + "id": "0:1", "type": "PAGE", + "fields": {"name": "Page", "x": 0, "y": 0, "width": 1000, "height": 1000, "projectionTruncated": false}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "1:2", "type": "FRAME", + "fields": {"name": "Heading", "parentId": "0:1", "x": 0, "y": 0, "width": 1000, "height": 80, "childCount": 1}, + "extra": {}, "fieldErrors": {} + } + ], + "diagnostics": [] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("explore collection should complete after one projection") + }; + assert_eq!(parts.snapshot_chunks.len(), 1); + assert_eq!(parts.snapshot_chunks[0].nodes.len(), 2); + assert!(parts.variables.is_none()); +} + +#[test] +fn node_snapshot_follows_the_compiled_cursor_until_complete() { + let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(metadata_call) = collector.advance().unwrap() else { + panic!("metadata call expected") + }; + collector + .accept(&metadata_call.id, metadata("FRAME", &[], 2)) + .unwrap(); + + let CollectorStep::Call(first_call) = collector.advance().unwrap() else { + panic!("first snapshot chunk expected") + }; + assert!( + first_call.call.arguments()["code"] + .as_str() + .unwrap() + .contains("\"offset\":0") + ); + collector + .accept( + &first_call.id, + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", "version": "v1", "rootIds": ["1:2"], + "nodes": [ + {"id": "1:2", "type": "FRAME", "fields": {"name": "Root", "childrenIds": ["1:3"]}, "extra": {}, "fieldErrors": {}}, + {"id": "__DEVUP_SNAPSHOT_CURSOR__", "type": "DEVUP_INTERNAL", "fields": {"nextOffset": 1, "complete": false, "totalNodes": 2}, "extra": {}, "fieldErrors": {}} + ], "diagnostics": [] + }), + }, + ) + .unwrap(); + + let CollectorStep::Call(second_call) = collector.advance().unwrap() else { + panic!("second snapshot chunk expected") + }; + assert!( + second_call.call.arguments()["code"] + .as_str() + .unwrap() + .contains("\"offset\":1") + ); + collector + .accept( + &second_call.id, + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", "version": "v1", "rootIds": ["1:2"], + "nodes": [ + {"id": "1:3", "type": "TEXT", "fields": {"name": "Child", "characters": "완료", "childrenIds": []}, "extra": {}, "fieldErrors": {}}, + {"id": "__DEVUP_SNAPSHOT_CURSOR__", "type": "DEVUP_INTERNAL", "fields": {"nextOffset": 2, "complete": true, "totalNodes": 2}, "extra": {}, "fieldErrors": {}} + ], "diagnostics": [] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("snapshot pagination should complete") + }; + assert_eq!(parts.snapshot_chunks.len(), 2); + assert!( + parts + .snapshot_chunks + .iter() + .flat_map(|chunk| &chunk.nodes) + .all(|node| node.id != "__DEVUP_SNAPSHOT_CURSOR__") + ); +} + +#[test] +fn section_collection_indexes_before_planning_selected_roots() { + let mut request = CollectionRequest::new(target("10:1"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.section = Some(SectionReadOptions { + frame_ids: vec!["10:2".to_owned(), "10:3".to_owned()], + all_screens: false, + }); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(index_call) = collector.advance().unwrap() else { + panic!("compact section index expected") + }; + assert!( + index_call.call.arguments()["code"] + .as_str() + .unwrap() + .contains("subtreeNodeCount") + ); + collector + .accept(&index_call.id, compact_section_index()) + .unwrap(); + + let CollectorStep::Call(batch_call) = collector.advance().unwrap() else { + panic!("one bounded multi-root call expected") + }; + let arguments = batch_call.call.arguments(); + let code = arguments["code"].as_str().unwrap(); + assert!(code.contains("[\"10:3\",\"10:2\"]")); + assert_eq!(batch_call.expected_node_id.as_deref(), Some("10:1")); +} + +#[test] +fn failed_section_batch_retries_only_its_root_and_preserves_fast_resources() { + let mut request = CollectionRequest::new(target("10:1"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.section = Some(SectionReadOptions { + frame_ids: vec![ + "root-0".to_owned(), + "root-1".to_owned(), + "root-2".to_owned(), + ], + all_screens: false, + }); + request.cached_section_index = Some(three_batch_section_index()); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(first_fast) = collector.advance().unwrap() else { + panic!("first fast batch expected") + }; + let CollectorStep::Call(second_fast) = collector.advance().unwrap() else { + panic!("second fast batch expected") + }; + assert_eq!(multi_root_ids(&first_fast.call), ["root-0"]); + assert_eq!(multi_root_ids(&second_fast.call), ["root-1"]); + collector + .accept( + &second_fast.id, + fast_multi_envelope_result(&["root-1"], &["variable-success-1"]), + ) + .unwrap(); + assert!( + collector + .reject( + &first_fast.id, + &DevupError::new( + ErrorCode::DevupFigmaDirectUnavailable, + "synthetic fast batch failure", + true, + ), + ) + .unwrap() + ); + + let CollectorStep::Call(third_fast) = collector.advance().unwrap() else { + panic!("the untouched third fast batch must remain queued") + }; + assert_eq!(multi_root_ids(&third_fast.call), ["root-2"]); + let CollectorStep::Call(failed_root_retry) = collector.advance().unwrap() else { + panic!("only the failed root must be retried through the legacy cursor") + }; + assert_eq!(legacy_root_id(&failed_root_retry.call), "root-0"); + collector + .accept( + &third_fast.id, + fast_multi_envelope_result(&["root-2"], &["variable-success-2"]), + ) + .unwrap(); + let mut failed_snapshot = snapshot("root-0"); + failed_snapshot.raw["nodes"][0]["fields"] = json!({ + "name": "Failed fast root", + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "variable-fallback"}] + } + }); + collector + .accept(&failed_root_retry.id, failed_snapshot) + .unwrap(); + + let CollectorStep::Call(missing_resources) = collector.advance().unwrap() else { + panic!("only resources missing from the failed fast batch should be acquired") + }; + let resource_code = missing_resources.call.arguments()["code"] + .as_str() + .unwrap() + .to_owned(); + assert!(resource_code.contains("variable-fallback")); + assert!(!resource_code.contains("variable-success-1")); + assert!(!resource_code.contains("variable-success-2")); + collector + .accept( + &missing_resources.id, + UpstreamResult { + raw: json!({ + "collections": [], + "variables": [{"id": "variable-fallback", "name": "Fallback"}], + "styles": [] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("partial fast fallback should complete") + }; + assert_eq!(parts.stats.figma_tool_calls, 5); + assert_eq!(parts.stats.transport, "hybrid-multi-root-cursor"); + assert_eq!( + merge_chunks(parts.snapshot_chunks.clone()).unwrap().roots, + ["root-0", "root-1", "root-2"] + ); + let resources = parts.variables.unwrap(); + let variable_ids = resources.raw["variables"] + .as_array() + .unwrap() + .iter() + .map(|variable| variable["id"].as_str().unwrap()) + .collect::>(); + assert_eq!( + variable_ids, + std::collections::BTreeSet::from([ + "variable-fallback", + "variable-success-1", + "variable-success-2" + ]) + ); +} + +#[test] +fn oversized_section_root_uses_legacy_once_and_preserves_fast_resources() { + let mut request = CollectionRequest::new(target("10:1"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.section = Some(SectionReadOptions { + frame_ids: vec!["root-0".to_owned(), "root-1".to_owned()], + all_screens: false, + }); + request.cached_section_index = Some(section_index_with_node_counts(&[1_000, 5_000])); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast) = collector.advance().unwrap() else { + panic!("bounded root should use the fast batch") + }; + let CollectorStep::Call(oversized) = collector.advance().unwrap() else { + panic!("oversized root should be scheduled once through the legacy cursor") + }; + assert_eq!(multi_root_ids(&fast.call), ["root-0"]); + assert_eq!(legacy_root_id(&oversized.call), "root-1"); + collector + .accept( + &fast.id, + fast_multi_envelope_result(&["root-0"], &["variable-fast"]), + ) + .unwrap(); + let mut oversized_snapshot = snapshot("root-1"); + oversized_snapshot.raw["nodes"][0]["fields"] = json!({ + "name": "Oversized root", + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "variable-oversized"}] + } + }); + collector.accept(&oversized.id, oversized_snapshot).unwrap(); + + let CollectorStep::Call(resources) = collector.advance().unwrap() else { + panic!("the oversized root's missing resources should be collected") + }; + let resource_arguments = resources.call.arguments(); + let resource_code = resource_arguments["code"].as_str().unwrap(); + assert!(resource_code.contains("variable-oversized")); + assert!(!resource_code.contains("variable-fast")); + collector + .accept( + &resources.id, + UpstreamResult { + raw: json!({ + "collections": [], + "variables": [{"id": "variable-oversized", "name": "Oversized"}], + "styles": [] + }), + }, + ) + .unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("hybrid oversized collection should complete") + }; + assert_eq!(parts.stats.figma_tool_calls, 3); + assert_eq!(parts.stats.transport, "hybrid-multi-root-cursor"); + assert_eq!( + merge_chunks(parts.snapshot_chunks.clone()).unwrap().roots, + ["root-0", "root-1"] + ); + let variables = parts.variables.unwrap(); + assert_eq!(variables.raw["variables"].as_array().unwrap().len(), 2); +} + +#[test] +fn section_collection_without_selection_completes_after_the_compact_index() { + let mut request = CollectionRequest::new(target("10:1"), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + request.section = Some(SectionReadOptions { + frame_ids: Vec::new(), + all_screens: false, + }); + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(index_call) = collector.advance().unwrap() else { + panic!("compact section index expected") + }; + collector + .accept(&index_call.id, compact_section_index()) + .unwrap(); + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("selection discovery must not collect a full subtree") + }; + + assert_eq!(parts.stats.figma_tool_calls, 1); + assert_eq!(parts.snapshot_chunks.len(), 1); + assert_eq!(parts.snapshot_chunks[0].nodes.len(), 3); + assert_eq!( + parts.metadata["sectionIndex"]["candidates"] + .as_array() + .unwrap() + .len(), + 2 + ); +} + +fn compact_section_index() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", "version": null, "rootIds": ["10:1"], + "nodes": [ + {"id": "10:1", "type": "SECTION", "fields": { + "name": "Proofread", "parentId": "0:1", "childrenIds": ["10:2", "10:3"], + "visible": true, "projectionTruncated": false, + "absoluteBoundingBox": {"x": 0, "y": 0, "width": 1200, "height": 1000} + }, "extra": {}, "fieldErrors": {}}, + {"id": "10:2", "type": "FRAME", "fields": { + "name": "Second", "parentId": "10:1", "childrenIds": [], "visible": true, + "directChildCount": 5, "subtreeNodeCount": 20, "estimatedSerializedBytes": 10000, + "absoluteBoundingBox": {"x": 500, "y": 120, "width": 360, "height": 740} + }, "extra": {}, "fieldErrors": {}}, + {"id": "10:3", "type": "FRAME", "fields": { + "name": "First", "parentId": "10:1", "childrenIds": [], "visible": true, + "directChildCount": 5, "subtreeNodeCount": 20, "estimatedSerializedBytes": 10000, + "absoluteBoundingBox": {"x": 100, "y": 120, "width": 360, "height": 740} + }, "extra": {}, "fieldErrors": {}} + ], + "diagnostics": [] + }), + } +} + +fn three_batch_section_index() -> SectionIndex { + section_index_with_node_counts(&[3_000, 3_000, 3_000]) +} + +fn section_index_with_node_counts(node_counts: &[usize]) -> SectionIndex { + let section_bounds = ExploreBounds { + x: 0.0, + y: 0.0, + width: 1000.0, + height: 1000.0, + }; + SectionIndex { + file_key: "FileKey123".to_owned(), + source_version: Some("v1".to_owned()), + section: SectionSummary { + node_id: "10:1".to_owned(), + name: "Section".to_owned(), + bounds: section_bounds, + }, + candidates: node_counts + .iter() + .enumerate() + .map(|(index, node_count)| SectionCandidate { + node_id: format!("root-{index}"), + name: format!("Root {index}"), + node_type: "FRAME".to_owned(), + visible: true, + bounds: ExploreBounds { + y: index as f64 * 200.0, + ..section_bounds + }, + parent_id: Some("10:1".to_owned()), + breadcrumb: vec!["Section".to_owned(), format!("Root {index}")], + direct_child_count: 0, + subtree_node_count: *node_count, + estimated_serialized_bytes: 1_000, + selection_reasons: vec!["screen-like".to_owned()], + canonical_url: format!( + "https://www.figma.com/design/FileKey123/devup?node-id=root-{index}" + ), + }) + .collect(), + truncated: false, + } +} + +fn multi_root_ids(call: &ReadToolCall) -> Vec<&str> { + let ReadToolCall::Snapshot { + script: BuiltinScript::MultiRootSnapshotEnvelope, + root_ids: Some(root_ids), + .. + } = call + else { + panic!("multi-root fast snapshot call expected") + }; + root_ids.iter().map(String::as_str).collect() +} + +fn legacy_root_id(call: &ReadToolCall) -> &str { + let ReadToolCall::Snapshot { + node_id, + script: BuiltinScript::NodeSnapshot, + root_ids: None, + .. + } = call + else { + panic!("legacy root snapshot call expected") + }; + node_id +} + +fn fast_multi_envelope_result(root_ids: &[&str], variable_ids: &[&str]) -> UpstreamResult { + assert_eq!(root_ids.len(), variable_ids.len()); + let nodes = root_ids + .iter() + .zip(variable_ids) + .map(|(root_id, variable_id)| { + json!({ + "id": root_id, + "type": "FRAME", + "fields": { + "name": root_id, + "childrenIds": [], + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": variable_id}] + } + }, + "extra": {}, + "fieldErrors": {} + }) + }) + .collect::>(); + let variables = variable_ids + .iter() + .map(|id| json!({"id": id, "name": id})) + .collect::>(); + let mut envelope = json!({ + "schemaVersion": 1, + "source": {"fileKey": "FileKey123", "rootId": "10:1"}, + "snapshot": { + "fileKey": "FileKey123", + "version": "v1", + "rootIds": root_ids, + "nodes": nodes, + "diagnostics": [] + }, + "resources": { + "collections": [], + "variables": variables, + "styles": [], + "usedRemoteVariables": [], + "usedVariableIds": variable_ids, + "usedStyleIds": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "nodeCount": root_ids.len(), + "variableRefCount": variable_ids.len(), + "styleRefCount": 0, + "utf8Bytes": 0 + } + }); + let envelope_bytes = loop { + let bytes = serde_json::to_vec(&envelope).unwrap(); + if envelope["integrity"]["utf8Bytes"] == bytes.len() as u64 { + break bytes; + } + envelope["integrity"]["utf8Bytes"] = Value::from(bytes.len()); + }; + let mut png = b"\x89PNG\r\n\x1a\n".to_vec(); + push_png_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut payload = Vec::with_capacity(envelope_bytes.len() + 8); + payload.extend_from_slice(&0_u32.to_be_bytes()); + payload.extend_from_slice(&1_u32.to_be_bytes()); + payload.extend_from_slice(&envelope_bytes); + push_png_chunk(&mut png, b"duVp", &payload); + push_png_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_png_chunk(&mut png, b"IEND", &[]); + let descriptor = json!({ + "kind": "devupFastSnapshotDescriptor", + "schemaVersion": 1, + "rootId": "10:1", + "nodeCount": root_ids.len(), + "variableRefCount": variable_ids.len(), + "styleRefCount": 0, + "utf8Bytes": envelope_bytes.len(), + "chunkCount": 1 + }); + UpstreamResult { + raw: json!({"content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ]}), + } +} diff --git a/crates/devup-mcp-figma/tests/envelope.rs b/crates/devup-mcp-figma/tests/envelope.rs new file mode 100644 index 0000000..19180e8 --- /dev/null +++ b/crates/devup-mcp-figma/tests/envelope.rs @@ -0,0 +1,573 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{ + FigmaTarget, UpstreamResult, decode_fast_multi_snapshot, decode_fast_snapshot, + decode_fast_theme, +}; +use serde_json::{Value, json}; + +const PNG_SIGNATURE: &[u8; 8] = b"\x89PNG\r\n\x1a\n"; + +#[test] +fn valid_multichunk_envelope_round_trips() { + let target = target(); + let envelope = complete_envelope(); + let result = upstream_result(envelope.clone(), 2); + + let decoded = decode_fast_snapshot(&result, &target).expect("valid envelope"); + + assert_eq!(decoded.snapshot.file_key, "fileKey123"); + assert_eq!(decoded.snapshot.root_ids, ["1:1"]); + assert_eq!(decoded.snapshot.nodes.len(), 2); + assert_eq!( + decoded.resources.raw["variables"].as_array().unwrap().len(), + 1 + ); + assert_eq!(decoded.resources.raw["styles"].as_array().unwrap().len(), 1); + assert_eq!(decoded.stats.raw_bytes, envelope.len()); + assert!(decoded.stats.wire_bytes > envelope.len()); + assert_eq!(decoded.stats.chunk_count, 2); +} + +#[test] +fn valid_multi_image_envelope_round_trips() { + let target = target(); + let envelope = complete_envelope(); + let result = upstream_result_with_split_pngs(envelope.clone(), 2); + + let decoded = decode_fast_snapshot(&result, &target).expect("valid split envelope"); + + assert_eq!(decoded.snapshot.nodes.len(), 2); + assert_eq!(decoded.stats.raw_bytes, envelope.len()); + assert_eq!(decoded.stats.chunk_count, 2); + assert!(decoded.stats.wire_bytes > envelope.len()); +} + +#[test] +fn valid_multi_root_envelope_requires_the_exact_ordered_root_set() { + let envelope = mutate_envelope(|value| { + value["source"]["rootId"] = json!("9:9"); + value["snapshot"]["rootIds"] = json!(["1:1", "1:2"]); + }); + let mut result = upstream_result(envelope, 1); + let mut descriptor: Value = + serde_json::from_str(result.raw["content"][0]["text"].as_str().unwrap()).unwrap(); + descriptor["rootId"] = json!("9:9"); + result.raw["content"][0]["text"] = json!(descriptor.to_string()); + let section_target = FigmaTarget { + node_id: Some("9:9".to_owned()), + ..target() + }; + + let decoded = decode_fast_multi_snapshot( + &result, + §ion_target, + &["1:1".to_owned(), "1:2".to_owned()], + ) + .expect("valid multi-root envelope"); + assert_eq!(decoded.snapshot.root_ids, ["1:1", "1:2"]); + + let error = decode_fast_multi_snapshot( + &result, + §ion_target, + &["1:2".to_owned(), "1:1".to_owned()], + ) + .expect_err("ordered root mismatch"); + assert_eq!(error.details["category"], "targetMismatch"); +} + +#[test] +fn out_of_order_chunks_are_rejected() { + let envelope = complete_envelope(); + let png = envelope_png_with_order(&envelope, &[1, 0]); + let result = upstream_result_with_png(png, envelope.len(), 2); + + let error = decode_fast_snapshot(&result, &target()).expect_err("out of order chunks"); + + assert_eq!(error.details["category"], "envelopeChunkSequence"); +} + +#[test] +fn noncanonical_png_header_is_rejected() { + let envelope = complete_envelope(); + let png = envelope_png_with_ihdr(&envelope, &[0, 0, 0, 2, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let result = upstream_result_with_png(png, envelope.len(), 1); + + let error = decode_fast_snapshot(&result, &target()).expect_err("noncanonical PNG"); + + assert_eq!(error.details["category"], "pngIhdr"); +} + +#[test] +fn png_without_idat_is_rejected() { + let envelope = complete_envelope(); + let mut png = PNG_SIGNATURE.to_vec(); + push_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut data = Vec::with_capacity(envelope.len() + 8); + data.extend_from_slice(&0_u32.to_be_bytes()); + data.extend_from_slice(&1_u32.to_be_bytes()); + data.extend_from_slice(&envelope); + push_chunk(&mut png, b"duVp", &data); + push_chunk(&mut png, b"IEND", &[]); + + assert_category( + upstream_result_with_png(png, envelope.len(), 1), + &target(), + "pngIdat", + ); +} + +#[test] +fn invalid_utf8_is_rejected_before_json_decode() { + let bytes = vec![0xff, 0xfe, 0xfd]; + let result = upstream_result_with_png(envelope_png(&bytes, 1), bytes.len(), 1); + + let error = decode_fast_snapshot(&result, &target()).expect_err("invalid UTF-8"); + + assert_eq!(error.details["category"], "envelopeUtf8"); +} + +#[test] +fn corrupt_transport_shapes_are_rejected_without_panicking() { + let envelope = complete_envelope(); + + let mut bad_signature = envelope_png(&envelope, 1); + bad_signature[0] = 0; + assert_category( + upstream_result_with_png(bad_signature, envelope.len(), 1), + &target(), + "pngSignature", + ); + + let mut bad_crc = envelope_png(&envelope, 1); + let marker = bad_crc + .windows(4) + .position(|window| window == b"duVp") + .unwrap(); + bad_crc[marker + 12] ^= 1; + assert_category( + upstream_result_with_png(bad_crc, envelope.len(), 1), + &target(), + "pngCrc", + ); + + let mut truncated = envelope_png(&envelope, 1); + truncated.pop(); + assert_category( + upstream_result_with_png(truncated, envelope.len(), 1), + &target(), + "pngLength", + ); + + assert_category( + upstream_result_with_png( + envelope_png_with_order(&envelope, &[0, 0]), + envelope.len(), + 2, + ), + &target(), + "envelopeChunkSequence", + ); +} + +#[test] +fn image_content_contract_is_strict() { + let envelope = complete_envelope(); + + let mut missing = upstream_result(envelope.clone(), 1); + missing.raw["content"].as_array_mut().unwrap().truncate(1); + assert_category(missing, &target(), "imageMissing"); + + let mut wrong_mime = upstream_result(envelope.clone(), 1); + wrong_mime.raw["content"][1]["mimeType"] = Value::from("image/jpeg"); + assert_category(wrong_mime, &target(), "imageMime"); + + let mut duplicate = upstream_result_with_split_pngs(envelope.clone(), 2); + let repeated = duplicate.raw["content"][1].clone(); + duplicate.raw["content"] + .as_array_mut() + .unwrap() + .push(repeated); + assert_category(duplicate, &target(), "imageMultiplicity"); + + let oversized = vec![0_u8; 11 * 1024 * 1024 + 1]; + let error = decode_fast_snapshot( + &upstream_result_with_png(oversized, envelope.len(), 1), + &target(), + ) + .expect_err("oversized PNG"); + assert_eq!(error.details["category"], "png"); +} + +#[test] +fn schema_target_graph_and_resource_integrity_are_validated() { + let unsupported = mutate_envelope(|value| value["schemaVersion"] = Value::from(2)); + assert_category(upstream_result(unsupported, 1), &target(), "schemaVersion"); + + let wrong_target = FigmaTarget { + file_key: "otherFileKey".to_owned(), + ..target() + }; + assert_category( + upstream_result(complete_envelope(), 1), + &wrong_target, + "targetMismatch", + ); + + let duplicate_node = mutate_envelope(|value| { + let duplicate = value["snapshot"]["nodes"][1].clone(); + value["snapshot"]["nodes"] + .as_array_mut() + .unwrap() + .push(duplicate); + }); + assert_category( + upstream_result(duplicate_node, 1), + &target(), + "duplicateNode", + ); + + let dangling_child = mutate_envelope(|value| { + value["snapshot"]["nodes"][0]["fields"]["childrenIds"][0] = Value::from("9:9"); + }); + assert_category( + upstream_result(dangling_child, 1), + &target(), + "danglingChild", + ); + + let missing_resource = mutate_envelope(|value| { + value["resources"]["variables"] = json!([]); + }); + assert_category( + upstream_result(missing_resource, 1), + &target(), + "resourceMissing", + ); +} + +#[test] +fn descriptor_must_match_the_binary_envelope() { + let mut result = upstream_result(complete_envelope(), 2); + let descriptor_text = result.raw["content"][0]["text"].as_str().unwrap(); + let mut descriptor: Value = serde_json::from_str(descriptor_text).unwrap(); + descriptor["nodeCount"] = Value::from(99); + result.raw["content"][0]["text"] = Value::from(descriptor.to_string()); + + assert_category(result, &target(), "nodeCount"); +} + +#[test] +fn valid_fast_theme_envelope_round_trips_and_validates_counts() { + let envelope = theme_envelope(); + let result = theme_upstream_result(envelope.clone(), 1); + + let decoded = decode_fast_theme(&result, "fileKey123").expect("valid fast theme"); + + assert_eq!(decoded.source_version, Some("v42".to_owned())); + assert_eq!( + decoded.resources.raw["collections"] + .as_array() + .unwrap() + .len(), + 1 + ); + assert_eq!( + decoded.resources.raw["variables"].as_array().unwrap().len(), + 1 + ); + assert_eq!(decoded.resources.raw["styles"].as_array().unwrap().len(), 1); + assert_eq!(decoded.resources.raw["localComplete"], true); + assert_eq!(decoded.stats.raw_bytes, envelope.len()); + + let mut bad = theme_upstream_result(envelope, 1); + let descriptor = bad.raw["content"][0]["text"].as_str().unwrap(); + let mut descriptor: Value = serde_json::from_str(descriptor).unwrap(); + descriptor["variableCount"] = json!(2); + bad.raw["content"][0]["text"] = json!(descriptor.to_string()); + let error = decode_fast_theme(&bad, "fileKey123").expect_err("count mismatch"); + assert_eq!(error.details["category"], "variableCount"); +} + +fn target() -> FigmaTarget { + FigmaTarget { + file_key: "fileKey123".to_owned(), + node_id: Some("1:1".to_owned()), + branch_key: None, + } +} + +fn complete_envelope() -> Vec { + finalize_envelope(json!({ + "schemaVersion": 1, + "source": { + "fileKey": "fileKey123", + "rootId": "1:1" + }, + "snapshot": { + "fileKey": "fileKey123", + "version": null, + "rootIds": ["1:1"], + "nodes": [ + { + "id": "1:1", + "type": "FRAME", + "fields": { + "childrenIds": ["1:2"], + "boundVariables": { + "fills": {"type": "VARIABLE_ALIAS", "id": "VariableID:1:1"} + } + } + }, + { + "id": "1:2", + "type": "TEXT", + "fields": { + "textStyleId": "S:style1", + "characters": "테스트" + } + } + ], + "diagnostics": [] + }, + "resources": { + "collections": [], + "variables": [{"id": "VariableID:1:1", "name": "color/text"}], + "styles": [{"id": "S:style1", "name": "body", "styleType": "TEXT"}], + "usedRemoteVariables": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "nodeCount": 2, + "variableRefCount": 1, + "styleRefCount": 1, + "utf8Bytes": 0 + } + })) +} + +fn theme_envelope() -> Vec { + finalize_envelope(json!({ + "schemaVersion": 1, + "source": {"fileKey": "fileKey123", "version": "v42"}, + "resources": { + "collections": [{"id": "c", "name": "Theme"}], + "variables": [{"id": "v", "name": "primary"}], + "styles": [{"id": "s", "name": "body", "styleType": "TEXT"}], + "usedRemoteVariables": [], + "usedVariableIds": ["v"], + "usedStyleIds": ["s"], + "localComplete": true, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "collectionCount": 1, + "variableCount": 1, + "styleCount": 1, + "unresolvedCount": 0, + "utf8Bytes": 0 + } + })) +} + +fn theme_upstream_result(envelope: Vec, chunk_count: usize) -> UpstreamResult { + let png = envelope_png(&envelope, chunk_count); + let descriptor = json!({ + "kind": "devupFastThemeDescriptor", + "schemaVersion": 1, + "collectionCount": 1, + "variableCount": 1, + "styleCount": 1, + "unresolvedCount": 0, + "utf8Bytes": envelope.len(), + "chunkCount": chunk_count + }); + UpstreamResult { + raw: json!({ + "content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ] + }), + } +} + +fn mutate_envelope(mutate: impl FnOnce(&mut Value)) -> Vec { + let mut value: Value = serde_json::from_slice(&complete_envelope()).unwrap(); + mutate(&mut value); + finalize_envelope(value) +} + +fn finalize_envelope(mut value: Value) -> Vec { + for _ in 0..8 { + let bytes = serde_json::to_vec(&value).unwrap(); + let length = bytes.len() as u64; + if value["integrity"]["utf8Bytes"] == length { + return bytes; + } + value["integrity"]["utf8Bytes"] = Value::from(length); + } + panic!("utf8Bytes did not converge"); +} + +fn assert_category(result: UpstreamResult, target: &FigmaTarget, expected: &str) { + let error = decode_fast_snapshot(&result, target).expect_err(expected); + assert_eq!(error.details["category"], expected); +} + +fn upstream_result(envelope: Vec, chunk_count: usize) -> UpstreamResult { + let png = envelope_png(&envelope, chunk_count); + upstream_result_with_png(png, envelope.len(), chunk_count) +} + +fn upstream_result_with_png( + png: Vec, + envelope_length: usize, + chunk_count: usize, +) -> UpstreamResult { + let descriptor = json!({ + "kind": "devupFastSnapshotDescriptor", + "schemaVersion": 1, + "rootId": "1:1", + "nodeCount": 2, + "variableRefCount": 1, + "styleRefCount": 1, + "utf8Bytes": envelope_length, + "chunkCount": chunk_count + }); + UpstreamResult { + raw: json!({ + "content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ] + }), + } +} + +fn upstream_result_with_split_pngs(envelope: Vec, chunk_count: usize) -> UpstreamResult { + assert!(chunk_count > 0 && chunk_count <= envelope.len()); + let per_chunk = envelope.len().div_ceil(chunk_count); + let payloads = envelope.chunks(per_chunk).collect::>(); + assert_eq!(payloads.len(), chunk_count); + let mut content = vec![json!({ + "type": "text", + "text": json!({ + "kind": "devupFastSnapshotDescriptor", + "schemaVersion": 1, + "rootId": "1:1", + "nodeCount": 2, + "variableRefCount": 1, + "styleRefCount": 1, + "utf8Bytes": envelope.len(), + "chunkCount": chunk_count + }).to_string() + })]; + for (sequence, payload) in payloads.into_iter().enumerate() { + let png = envelope_png_for_chunk(payload, sequence, chunk_count); + content.push(json!({ + "type": "image", + "data": STANDARD.encode(png), + "mimeType": "image/png" + })); + } + UpstreamResult { + raw: json!({"content": content}), + } +} + +fn envelope_png(envelope: &[u8], chunk_count: usize) -> Vec { + assert!(chunk_count > 0 && chunk_count <= envelope.len()); + let order = (0..chunk_count).collect::>(); + envelope_png_with_order(envelope, &order) +} + +fn envelope_png_with_ihdr(envelope: &[u8], ihdr: &[u8; 13]) -> Vec { + let mut png = PNG_SIGNATURE.to_vec(); + push_chunk(&mut png, b"IHDR", ihdr); + let mut data = Vec::with_capacity(envelope.len() + 8); + data.extend_from_slice(&0_u32.to_be_bytes()); + data.extend_from_slice(&1_u32.to_be_bytes()); + data.extend_from_slice(envelope); + push_chunk(&mut png, b"duVp", &data); + push_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_chunk(&mut png, b"IEND", &[]); + png +} + +fn envelope_png_for_chunk(payload: &[u8], sequence: usize, total: usize) -> Vec { + let mut png = PNG_SIGNATURE.to_vec(); + push_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut data = Vec::with_capacity(payload.len() + 8); + data.extend_from_slice(&(sequence as u32).to_be_bytes()); + data.extend_from_slice(&(total as u32).to_be_bytes()); + data.extend_from_slice(payload); + push_chunk(&mut png, b"duVp", &data); + push_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_chunk(&mut png, b"IEND", &[]); + png +} + +fn envelope_png_with_order(envelope: &[u8], order: &[usize]) -> Vec { + let chunk_count = order.len(); + assert!(chunk_count > 0 && chunk_count <= envelope.len()); + let mut png = PNG_SIGNATURE.to_vec(); + push_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + + let per_chunk = envelope.len().div_ceil(chunk_count); + let payloads = envelope.chunks(per_chunk).collect::>(); + assert_eq!(payloads.len(), chunk_count); + for &sequence in order { + let payload = payloads[sequence]; + let mut data = Vec::with_capacity(payload.len() + 8); + data.extend_from_slice(&(sequence as u32).to_be_bytes()); + data.extend_from_slice(&(chunk_count as u32).to_be_bytes()); + data.extend_from_slice(payload); + push_chunk(&mut png, b"duVp", &data); + } + + push_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_chunk(&mut png, b"IEND", &[]); + png +} + +fn push_chunk(output: &mut Vec, chunk_type: &[u8; 4], data: &[u8]) { + output.extend_from_slice(&(data.len() as u32).to_be_bytes()); + output.extend_from_slice(chunk_type); + output.extend_from_slice(data); + let mut crc_input = Vec::with_capacity(4 + data.len()); + crc_input.extend_from_slice(chunk_type); + crc_input.extend_from_slice(data); + output.extend_from_slice(&crc32(&crc_input).to_be_bytes()); +} + +fn crc32(bytes: &[u8]) -> u32 { + let mut crc = u32::MAX; + for byte in bytes { + crc ^= u32::from(*byte); + for _ in 0..8 { + crc = (crc >> 1) ^ (0xedb8_8320 & 0_u32.wrapping_sub(crc & 1)); + } + } + !crc +} diff --git a/crates/devup-mcp-figma/tests/explore.rs b/crates/devup-mcp-figma/tests/explore.rs new file mode 100644 index 0000000..760d215 --- /dev/null +++ b/crates/devup-mcp-figma/tests/explore.rs @@ -0,0 +1,463 @@ +use std::collections::BTreeMap; + +use devup_mcp_figma::{ + ExploreKind, ExploreNode, ExploreOptions, FigmaTarget, RawNode, Snapshot, TargetKind, + classify_explore_node, classify_target, collect_section_notes, explore_snapshot, +}; +use serde_json::{Map, json}; + +fn raw_node( + id: &str, + node_type: &str, + name: &str, + bounds: [f64; 4], + child_count: usize, + text_preview: &str, +) -> RawNode { + let [x, y, width, height] = bounds; + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(json!({ + "name": name, + "parentId": "0:1", + "childrenIds": [], + "x": x, + "y": y, + "width": width, + "height": height, + "childCount": child_count, + "textPreview": text_preview + })) + .unwrap(), + extra: Map::new(), + field_errors: BTreeMap::new(), + } +} + +fn projection(nodes_reversed: bool, truncated: bool) -> Snapshot { + let mut nodes = vec![ + raw_node( + "1:1", + "FRAME", + "[FR-026] 본연체", + [0.0, 0.0, 1200.0, 80.0], + 1, + "본연체", + ), + raw_node( + "1:2", + "FRAME", + "A : STORY-F-PROOFREAD", + [0.0, 120.0, 360.0, 740.0], + 12, + "이야기가 글로 정리되었어요", + ), + raw_node( + "1:3", + "FRAME", + "A : STORY-F-PROOFREAD", + [400.0, 120.0, 360.0, 740.0], + 13, + "공개 설정 나만 보기", + ), + raw_node( + "1:4", + "TEXT", + "Annotation", + [800.0, 140.0, 180.0, 40.0], + 0, + "개발 참고", + ), + raw_node( + "2:1", + "FRAME", + "[FR-027] 다음 기능", + [0.0, 1000.0, 1200.0, 80.0], + 1, + "다음 기능", + ), + raw_node( + "2:2", + "FRAME", + "A : NEXT", + [0.0, 1120.0, 360.0, 740.0], + 8, + "다음 화면", + ), + ]; + if nodes_reversed { + nodes.reverse(); + } + let mut page = raw_node( + "0:1", + "PAGE", + "Phase2 Hand-off", + [0.0, 0.0, 3000.0, 3000.0], + 407, + "", + ); + page.fields.insert("parentId".to_owned(), json!(null)); + page.fields + .insert("projectionTruncated".to_owned(), json!(truncated)); + nodes.push(page); + Snapshot { + file_key: "85CgSws3o5XsLv7aAwWJyS".to_owned(), + version: None, + roots: vec!["0:1".to_owned()], + nodes: nodes + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + } +} + +fn target(node_id: &str) -> FigmaTarget { + FigmaTarget::parse(&format!( + "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Girok?node-id={}", + node_id.replace(':', "-") + )) + .unwrap() +} + +#[test] +fn classification_distinguishes_heading_screen_annotation_and_container() { + let heading = ExploreNode::try_from(&raw_node( + "1:1", + "FRAME", + "[FR-026] 본연체", + [0.0, 0.0, 1200.0, 80.0], + 1, + "본연체", + )) + .unwrap(); + let screen = ExploreNode::try_from(&raw_node( + "1:2", + "FRAME", + "Screen", + [0.0, 120.0, 360.0, 740.0], + 12, + "화면", + )) + .unwrap(); + let annotation = ExploreNode::try_from(&raw_node( + "1:3", + "TEXT", + "Note", + [0.0, 120.0, 120.0, 30.0], + 0, + "참고", + )) + .unwrap(); + let container = ExploreNode::try_from(&raw_node( + "1:4", + "SECTION", + "Screens", + [0.0, 120.0, 2400.0, 1800.0], + 8, + "", + )) + .unwrap(); + + assert_eq!(classify_explore_node(&heading), ExploreKind::Heading); + assert_eq!(classify_explore_node(&screen), ExploreKind::Screen); + assert_eq!(classify_explore_node(&annotation), ExploreKind::Annotation); + assert_eq!(classify_explore_node(&container), ExploreKind::Container); +} + +#[test] +fn heading_group_keeps_duplicate_states_and_stops_at_the_next_heading() { + let result = explore_snapshot( + &projection(false, false), + &target("1:1"), + &ExploreOptions { limit: 50 }, + ) + .unwrap(); + + assert_eq!(result.anchor.kind, ExploreKind::Heading); + assert_eq!(result.group.as_ref().unwrap().title, "[FR-026] 본연체"); + assert_eq!( + result + .candidates + .iter() + .map(|candidate| candidate.node.node_id.as_str()) + .collect::>(), + ["1:2", "1:3"] + ); + assert!(result.candidates.iter().all(|candidate| { + candidate + .selection_reasons + .iter() + .any(|reason| reason == "screen-like") + && candidate + .selection_reasons + .iter() + .any(|reason| reason == "before-next-heading") + })); + assert!( + !result + .candidates + .iter() + .any(|candidate| candidate.node.node_id == "2:2") + ); + assert!(result.candidates[0].canonical_url.ends_with("node-id=1-2")); +} + +#[test] +fn candidate_order_is_stable_and_truncation_combines_projection_and_limit() { + let normal = explore_snapshot( + &projection(false, false), + &target("1:1"), + &ExploreOptions { limit: 1 }, + ) + .unwrap(); + let reversed = explore_snapshot( + &projection(true, true), + &target("1:1"), + &ExploreOptions { limit: 1 }, + ) + .unwrap(); + + assert_eq!(normal.candidates, reversed.candidates); + assert!(normal.truncated); + assert!(reversed.truncated); +} + +#[test] +fn exact_screen_anchor_is_returned_without_semantic_guessing() { + let result = explore_snapshot( + &projection(false, false), + &target("1:2"), + &ExploreOptions { limit: 50 }, + ) + .unwrap(); + + assert_eq!(result.anchor.kind, ExploreKind::Screen); + assert_eq!(result.candidates.len(), 1); + assert_eq!(result.candidates[0].node.node_id, "1:2"); + assert_eq!( + result.candidates[0].selection_reasons, + ["exact-screen-anchor"] + ); +} + +#[test] +fn target_classification_and_section_candidates_are_explicit_and_complete() { + let mut page = raw_node("0:1", "PAGE", "Screens", [0.0, 0.0, 2400.0, 2000.0], 2, ""); + page.fields.insert("parentId".to_owned(), json!(null)); + page.fields.insert("childrenIds".to_owned(), json!(["1:1"])); + let mut section = raw_node( + "1:1", + "SECTION", + "Proofread States", + [100.0, 100.0, 1400.0, 1000.0], + 3, + "", + ); + section.fields.insert("parentId".to_owned(), json!("0:1")); + section + .fields + .insert("childrenIds".to_owned(), json!(["1:2", "1:3", "1:4"])); + let mut first = raw_node( + "1:2", + "FRAME", + "Default", + [120.0, 180.0, 360.0, 740.0], + 4, + "default state", + ); + first.fields.insert("parentId".to_owned(), json!("1:1")); + first.fields.insert("visible".to_owned(), json!(true)); + first.fields.insert( + "breadcrumb".to_owned(), + json!(["Screens", "Proofread States", "Default"]), + ); + first.fields.insert("pageChildIndex".to_owned(), json!(0)); + let mut hidden = raw_node( + "1:3", + "FRAME", + "Hidden", + [520.0, 180.0, 360.0, 740.0], + 2, + "hidden state", + ); + hidden.fields.insert("parentId".to_owned(), json!("1:1")); + hidden.fields.insert("visible".to_owned(), json!(false)); + let mut nested_container = raw_node( + "1:4", + "GROUP", + "Nested", + [920.0, 160.0, 400.0, 800.0], + 1, + "", + ); + nested_container + .fields + .insert("parentId".to_owned(), json!("1:1")); + nested_container + .fields + .insert("childrenIds".to_owned(), json!(["1:5"])); + let mut nested = raw_node( + "1:5", + "FRAME", + "Nested screen", + [940.0, 180.0, 360.0, 740.0], + 3, + "nested state", + ); + nested.fields.insert("parentId".to_owned(), json!("1:4")); + nested.fields.insert("visible".to_owned(), json!(true)); + nested.fields.insert( + "breadcrumb".to_owned(), + json!(["Screens", "Proofread States", "Nested", "Nested screen"]), + ); + nested.fields.insert("pageChildIndex".to_owned(), json!(0)); + let mut component = raw_node( + "2:1", + "COMPONENT", + "Button", + [1700.0, 100.0, 320.0, 480.0], + 2, + "", + ); + component.fields.insert("parentId".to_owned(), json!("0:1")); + let other = raw_node( + "2:2", + "TEXT", + "Note", + [1700.0, 600.0, 200.0, 40.0], + 0, + "note", + ); + let snapshot = Snapshot { + file_key: "85CgSws3o5XsLv7aAwWJyS".to_owned(), + version: None, + roots: vec!["0:1".to_owned()], + nodes: [ + page, + section, + first, + hidden, + nested_container, + nested, + component, + other, + ] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + }; + + assert_eq!( + classify_target( + &snapshot, + &FigmaTarget { + file_key: snapshot.file_key.clone(), + node_id: None, + branch_key: None, + } + ), + TargetKind::File + ); + assert_eq!(classify_target(&snapshot, &target("0:1")), TargetKind::Page); + assert_eq!( + classify_target(&snapshot, &target("1:1")), + TargetKind::Section + ); + assert_eq!( + classify_target(&snapshot, &target("1:2")), + TargetKind::Screen + ); + assert_eq!( + classify_target(&snapshot, &target("2:1")), + TargetKind::Component + ); + assert_eq!( + classify_target(&snapshot, &target("2:2")), + TargetKind::Other + ); + + let result = explore_snapshot(&snapshot, &target("1:1"), &ExploreOptions { limit: 50 }) + .expect("section exploration"); + assert_eq!(result.target_kind, TargetKind::Section); + assert_eq!( + result + .candidates + .iter() + .map(|candidate| candidate.node.node_id.as_str()) + .collect::>(), + ["1:2", "1:5"] + ); + let first = &result.candidates[0]; + assert!(first.node.visible); + assert_eq!(first.node.child_count, 4); + assert_eq!( + first.node.breadcrumb, + ["Screens", "Proofread States", "Default"] + ); + assert_eq!(first.node.page_child_index, Some(0)); + assert_eq!(first.node.bounds.width, 360.0); + assert!(first.canonical_url.ends_with("node-id=1-2")); +} + +#[test] +fn section_notes_combine_direct_text_and_descendant_annotations() { + let mut section = raw_node( + "1:1", + "SECTION", + "Documented section", + [0.0, 0.0, 1200.0, 900.0], + 2, + "", + ); + section.fields.insert("parentId".to_owned(), json!(null)); + section + .fields + .insert("childrenIds".to_owned(), json!(["1:2", "1:3"])); + let mut direct = raw_node("1:2", "TEXT", "Note", [0.0, 0.0, 200.0, 30.0], 0, ""); + direct.fields.insert("parentId".to_owned(), json!("1:1")); + direct + .fields + .insert("characters".to_owned(), json!(" Introductory note ")); + let mut frame = raw_node("1:3", "FRAME", "Card", [0.0, 50.0, 360.0, 740.0], 1, ""); + frame.fields.insert("parentId".to_owned(), json!("1:1")); + frame + .fields + .insert("childrenIds".to_owned(), json!(["1:4"])); + frame.fields.insert( + "annotations".to_owned(), + json!([{"label": " Use the compact variant "}, {"label": " "}]), + ); + let mut image = raw_node( + "1:4", + "RECTANGLE", + "Hero image", + [0.0, 50.0, 360.0, 200.0], + 0, + "", + ); + image.fields.insert("parentId".to_owned(), json!("1:3")); + image.fields.insert( + "annotations".to_owned(), + json!([{"labelMarkdown": "Maintain the aspect ratio"}]), + ); + let snapshot = Snapshot { + file_key: "file-key".to_owned(), + version: None, + roots: vec!["1:1".to_owned()], + nodes: [section, direct, frame, image] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect(), + diagnostics: Vec::new(), + }; + + let expected = + "Introductory note\n[Card] Use the compact variant\n[Hero image] Maintain the aspect ratio"; + assert_eq!(collect_section_notes(&snapshot, "1:1").unwrap(), expected); + let explored = explore_snapshot(&snapshot, &target("1:1"), &ExploreOptions { limit: 50 }) + .expect("Section exploration"); + assert_eq!(explored.group.expect("Section group").notes, expected); +} diff --git a/crates/devup-mcp-figma/tests/figma_url.rs b/crates/devup-mcp-figma/tests/figma_url.rs new file mode 100644 index 0000000..c09a3c4 --- /dev/null +++ b/crates/devup-mcp-figma/tests/figma_url.rs @@ -0,0 +1,78 @@ +use devup_mcp_figma::{ErrorCode, FigmaTarget}; + +#[test] +fn parses_design_link_and_normalizes_dash_node_id() { + let target = FigmaTarget::parse( + "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/%EA%B8%B0%EB%A1%9D?node-id=3879-35481&t=secret", + ) + .expect("valid Figma design link"); + + assert_eq!(target.file_key, "85CgSws3o5XsLv7aAwWJyS"); + assert_eq!(target.node_id.as_deref(), Some("3879:35481")); + assert_eq!(target.branch_key, None); +} + +#[test] +fn accepts_file_and_branch_routes() { + let file = FigmaTarget::parse("https://figma.com/file/Abc_123-xyz/Name") + .expect("legacy file links remain valid"); + assert_eq!(file.file_key, "Abc_123-xyz"); + + let branch = FigmaTarget::parse( + "https://www.figma.com/branch/FileKey123/BranchKey456/Name?node-id=1%3A2", + ) + .expect("branch link"); + assert_eq!(branch.file_key, "FileKey123"); + assert_eq!(branch.branch_key.as_deref(), Some("BranchKey456")); + assert_eq!(branch.node_id.as_deref(), Some("1:2")); +} + +#[test] +fn rejects_non_figma_and_deceptive_hosts() { + for url in [ + "http://www.figma.com/design/GoodKey123/Name", + "https://figma.com.evil.test/design/GoodKey123/Name", + "https://evil.test/design/GoodKey123/Name", + ] { + let error = FigmaTarget::parse(url).expect_err("host or scheme must be rejected"); + assert_eq!(error.code, ErrorCode::DevupFigmaUnsupportedFile); + assert!(!error.retryable); + } +} + +#[test] +fn rejects_malformed_keys_and_node_ids() { + for url in [ + "https://figma.com/design/a/Name", + "https://figma.com/design/key.with.dot/Name", + "https://figma.com/design/GoodKey123/Name?node-id=abc", + "https://figma.com/design/GoodKey123/Name?node-id=1%3A2%3A3", + ] { + let error = FigmaTarget::parse(url).expect_err("malformed link must be rejected"); + assert_eq!(error.code, ErrorCode::DevupFigmaUnsupportedFile); + } +} + +#[test] +fn serializes_the_stable_public_error_code() { + let error = + FigmaTarget::parse("https://evil.test/design/GoodKey123/Name").expect_err("invalid host"); + + assert_eq!( + serde_json::to_value(error.code).expect("serialize error code"), + "DEVUP_FIGMA_UNSUPPORTED_FILE" + ); +} + +#[test] +fn errors_do_not_echo_query_secrets() { + let error = FigmaTarget::parse( + "https://evil.test/design/GoodKey123/Name?access_token=top-secret&code=oauth-code", + ) + .expect_err("invalid host"); + + let rendered = format!("{error:?} {error}"); + assert!(!rendered.contains("top-secret")); + assert!(!rendered.contains("oauth-code")); + assert!(!rendered.contains("access_token")); +} diff --git a/crates/devup-mcp-figma/tests/large_values.rs b/crates/devup-mcp-figma/tests/large_values.rs new file mode 100644 index 0000000..f93bbc0 --- /dev/null +++ b/crates/devup-mcp-figma/tests/large_values.rs @@ -0,0 +1,218 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{ + CollectionRequest, CollectionScope, CollectorSession, CollectorStep, FigmaTarget, + LargeValueAssembler, LargeValueCursor, LargeValueDescriptor, LargeValueFragment, ReadToolCall, + UpstreamResult, +}; +use serde_json::json; + +fn descriptor() -> LargeValueDescriptor { + LargeValueDescriptor { + node_id: "1:2".to_owned(), + field: "characters".to_owned(), + byte_length: 19, + sha256: "5ab6efd34df9db2f30a0581487fd5d023fde8f658c3dfe9378dbed52332e11f8".to_owned(), + cursor: LargeValueCursor { + next_offset: 0, + max_chunk_bytes: 8, + }, + } +} + +fn fragment(offset: usize, bytes: &[u8], complete: bool) -> LargeValueFragment { + LargeValueFragment { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + node_id: "1:2".to_owned(), + field: "characters".to_owned(), + offset, + next_offset: offset + bytes.len(), + byte_length: 19, + sha256: descriptor().sha256, + data_base64: STANDARD.encode(bytes), + complete, + } +} + +#[test] +fn reassembles_out_of_order_fragments_and_accepts_identical_duplicates() { + let literal = br#""hello large value""#; + let mut assembler = + LargeValueAssembler::new("FileKey123", Some("v1".to_owned()), descriptor()).unwrap(); + + assembler.push(fragment(8, &literal[8..16], false)).unwrap(); + assembler.push(fragment(0, &literal[..8], false)).unwrap(); + assembler.push(fragment(0, &literal[..8], false)).unwrap(); + assembler.push(fragment(16, &literal[16..], true)).unwrap(); + + assert_eq!( + assembler.finish().unwrap(), + serde_json::json!("hello large value") + ); +} + +#[test] +fn rejects_conflicting_duplicate_missing_and_wrong_identity_fragments() { + let literal = br#""hello large value""#; + let mut conflicting = + LargeValueAssembler::new("FileKey123", Some("v1".to_owned()), descriptor()).unwrap(); + conflicting.push(fragment(0, &literal[..8], false)).unwrap(); + assert!(conflicting.push(fragment(0, b"different", false)).is_err()); + + let mut missing = + LargeValueAssembler::new("FileKey123", Some("v1".to_owned()), descriptor()).unwrap(); + missing.push(fragment(0, &literal[..8], false)).unwrap(); + missing.push(fragment(16, &literal[16..], true)).unwrap(); + assert!(missing.finish().is_err()); + + let mut wrong_identity = fragment(0, &literal[..8], false); + wrong_identity.node_id = "9:9".to_owned(); + let mut assembler = + LargeValueAssembler::new("FileKey123", Some("v1".to_owned()), descriptor()).unwrap(); + assert!(assembler.push(wrong_identity).is_err()); +} + +#[test] +fn collector_resolves_every_descriptor_before_completing_the_snapshot() { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=1-2").unwrap(); + let mut collector = + CollectorSession::new(CollectionRequest::new(target, CollectionScope::Node)); + let CollectorStep::Call(metadata) = collector.advance().unwrap() else { + panic!("metadata call") + }; + collector + .accept( + &metadata.id, + UpstreamResult { + raw: json!({"structuredContent":{"devupMetadata":{ + "fileKey":"FileKey123","version":"v1","rootId":"1:2", + "nodes":[{"id":"1:2","type":"TEXT","childrenIds":[],"descendantCount":0}] + }}}), + }, + ) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("snapshot call") + }; + collector + .accept( + &snapshot_call.id, + UpstreamResult { + raw: json!({ + "fileKey":"FileKey123","version":"v1","rootIds":["1:2"], + "nodes":[ + {"id":"1:2","type":"TEXT","fields":{"characters":{"$largeValue":descriptor()}},"extra":{},"fieldErrors":{}}, + {"id":"__DEVUP_SNAPSHOT_CURSOR__","type":"DEVUP_INTERNAL","fields":{"nextOffset":1,"complete":true,"totalNodes":1},"extra":{},"fieldErrors":{}} + ],"diagnostics":[] + }), + }, + ) + .unwrap(); + + let literal = br#""hello large value""#; + for (offset, end) in [(0, 8), (8, 16), (16, 19)] { + let step = collector.advance().unwrap(); + let CollectorStep::Call(call) = step else { + panic!("large value continuation call, got {step:?}") + }; + let ReadToolCall::LargeValue { options, .. } = call.call else { + panic!("large value read") + }; + assert_eq!(options.offset, offset); + collector + .accept( + &call.id, + UpstreamResult { + raw: serde_json::to_value(fragment(offset, &literal[offset..end], end == 19)) + .unwrap(), + }, + ) + .unwrap(); + } + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("complete snapshot") + }; + assert_eq!( + parts.snapshot_chunks[0].nodes[0].fields["characters"], + json!("hello large value") + ); +} + +#[test] +fn collector_marks_large_value_as_unsupported_when_upstream_rejects_continuation() { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=1-2").unwrap(); + let mut collector = + CollectorSession::new(CollectionRequest::new(target, CollectionScope::Node)); + let CollectorStep::Call(metadata) = collector.advance().unwrap() else { + panic!("metadata call") + }; + collector + .accept( + &metadata.id, + UpstreamResult { + raw: json!({"structuredContent":{"devupMetadata":{ + "fileKey":"FileKey123","version":"v1","rootId":"1:2", + "nodes":[{"id":"1:2","type":"TEXT","childrenIds":[],"descendantCount":0}] + }}}), + }, + ) + .unwrap(); + let CollectorStep::Call(snapshot_call) = collector.advance().unwrap() else { + panic!("snapshot call") + }; + collector + .accept( + &snapshot_call.id, + UpstreamResult { + raw: json!({ + "fileKey":"FileKey123","version":"v1","rootIds":["1:2"], + "nodes":[ + {"id":"1:2","type":"TEXT","fields":{"characters":{"$largeValue":descriptor()}},"extra":{},"fieldErrors":{}}, + {"id":"__DEVUP_SNAPSHOT_CURSOR__","type":"DEVUP_INTERNAL","fields":{"nextOffset":1,"complete":true,"totalNodes":1},"extra":{},"fieldErrors":{}} + ],"diagnostics":[] + }), + }, + ) + .unwrap(); + + let CollectorStep::Call(continuation) = collector.advance().unwrap() else { + panic!("large value continuation call") + }; + assert!( + collector + .reject( + &continuation.id, + &devup_mcp_figma::DevupError::new( + devup_mcp_figma::ErrorCode::DevupSnapshotUnsupported, + "upstream does not support field getter", + false, + ), + ) + .unwrap() + ); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("complete snapshot") + }; + let node = &parts.snapshot_chunks[0].nodes[0]; + assert_eq!( + node.fields["characters"], + json!({"$truncated":"unsupported-by-upstream","byteLength":19}) + ); + assert_eq!( + node.field_errors.get("characters").map(String::as_str), + Some("DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM") + ); + assert!( + parts.snapshot_chunks[0] + .diagnostics + .iter() + .any(|diagnostic| { + diagnostic.code == "DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM" + && diagnostic.node_id.as_deref() == Some("1:2") + }) + ); +} diff --git a/crates/devup-mcp-figma/tests/oauth_flow.rs b/crates/devup-mcp-figma/tests/oauth_flow.rs new file mode 100644 index 0000000..522f007 --- /dev/null +++ b/crates/devup-mcp-figma/tests/oauth_flow.rs @@ -0,0 +1,166 @@ +use std::{collections::HashMap, sync::Arc, time::Duration}; + +use axum::{ + Json, Router, + extract::{Form, State}, + routing::{get, post}, +}; +use devup_mcp_figma::{ + AuthStatus, BrowserOpener, CredentialStore, MemoryCredentialStore, OAuthManager, +}; +use serde_json::{Value, json}; +use tokio::{net::TcpListener, sync::Mutex}; + +#[derive(Clone, Default)] +struct Captured { + registration: Arc>>, + token_form: Arc>>>, +} + +#[derive(Clone)] +struct AppState { + base: String, + captured: Captured, +} + +async fn protected_resource(State(state): State) -> Json { + let base = state.base; + Json(json!({ + "resource": format!("{base}/mcp"), + "authorization_servers": [base], + "scopes_supported": ["mcp:connect"] + })) +} + +async fn authorization_metadata(State(state): State) -> Json { + let base = state.base; + Json(json!({ + "issuer": base, + "authorization_endpoint": format!("{base}/authorize"), + "token_endpoint": format!("{base}/token"), + "registration_endpoint": format!("{base}/register"), + "code_challenge_methods_supported": ["S256"], + "scopes_supported": ["mcp:connect"] + })) +} + +async fn register(State(state): State, Json(body): Json) -> Json { + *state.captured.registration.lock().await = Some(body); + Json(json!({"client_id": "dynamic-client"})) +} + +async fn token( + State(state): State, + Form(form): Form>, +) -> Json { + *state.captured.token_form.lock().await = Some(form); + Json(json!({ + "access_token": "access-secret", + "refresh_token": "refresh-secret", + "token_type": "Bearer", + "expires_in": 3600, + "scope": "mcp:connect" + })) +} + +#[derive(Debug)] +struct CallbackOpener; + +impl BrowserOpener for CallbackOpener { + fn open(&self, authorization_url: &str) -> Result<(), devup_mcp_figma::DevupError> { + let url = url::Url::parse(authorization_url).expect("authorization URL"); + let values = url.query_pairs().into_owned().collect::>(); + let redirect = values.get("redirect_uri").expect("redirect_uri").clone(); + let state = values.get("state").expect("state").clone(); + tokio::spawn(async move { + reqwest::get(format!("{redirect}?code=authorization-code&state={state}")) + .await + .expect("callback request"); + }); + Ok(()) + } +} + +#[tokio::test] +async fn login_discovers_registers_uses_pkce_and_stores_tokens() -> anyhow::Result<()> { + let listener = TcpListener::bind("127.0.0.1:0").await?; + let base = format!("http://{}", listener.local_addr()?); + let captured = Captured::default(); + let app = Router::new() + .route( + "/.well-known/oauth-protected-resource/mcp", + get(protected_resource), + ) + .route( + "/.well-known/oauth-authorization-server", + get(authorization_metadata), + ) + .route("/register", post(register)) + .route("/token", post(token)) + .with_state(AppState { + base: base.clone(), + captured: captured.clone(), + }); + tokio::spawn(async move { + axum::serve(listener, app).await.expect("mock OAuth server"); + }); + + let store = MemoryCredentialStore::default(); + let manager = OAuthManager::with_endpoint(format!("{base}/mcp"), store.clone()) + .with_callback_timeout(Duration::from_secs(3)); + let authorization = manager.login(&CallbackOpener).await?; + + assert_eq!(manager.status().await?, AuthStatus::Connected); + assert_eq!(manager.access_token().await?.expose(), "access-secret"); + assert!(!format!("{authorization:?}").contains("access-secret")); + assert!(!format!("{authorization:?}").contains("refresh-secret")); + + let registration = captured + .registration + .lock() + .await + .clone() + .expect("registration"); + assert_eq!(registration["client_name"], "devup-mcp"); + assert_eq!(registration["token_endpoint_auth_method"], "none"); + assert!( + registration["redirect_uris"][0] + .as_str() + .expect("redirect uri") + .starts_with("http://127.0.0.1:") + ); + + let form = captured + .token_form + .lock() + .await + .clone() + .expect("token form"); + assert_eq!( + form.get("client_id").map(String::as_str), + Some("dynamic-client") + ); + assert_eq!( + form.get("code").map(String::as_str), + Some("authorization-code") + ); + assert!( + form.get("code_verifier") + .is_some_and(|value| value.len() >= 43) + ); + assert_eq!( + form.get("resource").map(String::as_str), + Some(format!("{base}/mcp").as_str()) + ); + Ok(()) +} + +#[tokio::test] +async fn logout_clears_persisted_authorization() -> anyhow::Result<()> { + let store = MemoryCredentialStore::default(); + assert!(CredentialStore::load(&store).await?.is_none()); + let manager = OAuthManager::with_endpoint("https://mcp.figma.com/mcp", store); + manager.logout().await?; + assert_eq!(manager.status().await?, AuthStatus::Disconnected); + Ok(()) +} diff --git a/crates/devup-mcp-figma/tests/payload_contract.rs b/crates/devup-mcp-figma/tests/payload_contract.rs new file mode 100644 index 0000000..c1e9d31 --- /dev/null +++ b/crates/devup-mcp-figma/tests/payload_contract.rs @@ -0,0 +1,120 @@ +use devup_mcp_figma::{ + CollectedParts, CollectedPayload, CollectionScope, CollectionStats, CompletenessState, + ErrorCode, FigmaTarget, PayloadCompleteness, PayloadStructure, SnapshotChunk, UpstreamResult, + validate_payload_context, +}; +use serde_json::json; + +fn synthetic_parts() -> CollectedParts { + CollectedParts { + target: FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=1-2") + .unwrap(), + scope: CollectionScope::Node, + metadata: json!({ + "name": "PRIVATE_METADATA_VALUE", + "nodes": [{"id": "1:2", "type": "FRAME"}] + }), + snapshot_chunks: vec![ + serde_json::from_value::(json!({ + "fileKey": "FileKey123", + "version": "v1", + "rootIds": ["1:2"], + "nodes": [{ + "id": "1:2", + "type": "FRAME", + "fields": { + "name": "PRIVATE_NODE_VALUE", + "futureField": {"nested": 42}, + "childrenIds": [] + }, + "extra": {"futureEnumerable": true}, + "fieldErrors": {"restrictedGetter": "access denied"} + }] + })) + .unwrap(), + ], + variables: Some(UpstreamResult { + raw: json!({"variables": [{"id": "v1", "name": "PRIVATE_VARIABLE"}]}), + }), + styles: Some(UpstreamResult { + raw: json!({"styles": [{"id": "s1", "name": "PRIVATE_STYLE"}]}), + }), + source_version: Some("v1".to_owned()), + stats: CollectionStats::default(), + assets: Vec::new(), + reference_png: None, + } +} + +#[test] +fn collected_payload_round_trips_without_losing_unknown_fields() { + let payload = CollectedPayload::try_from(synthetic_parts()).unwrap(); + assert_eq!(payload.completeness, PayloadCompleteness::UsedTokens); + + let encoded = serde_json::to_value(&payload).unwrap(); + let decoded: CollectedPayload = serde_json::from_value(encoded).unwrap(); + assert_eq!(decoded, payload); + assert_eq!( + decoded.snapshot.nodes["1:2"].fields["futureField"]["nested"], + 42 + ); + assert_eq!( + decoded.snapshot.nodes["1:2"].extra["futureEnumerable"], + true + ); +} + +#[test] +fn structure_report_contains_shapes_but_no_design_values() { + let payload = CollectedPayload::try_from(synthetic_parts()).unwrap(); + let report = PayloadStructure::from_payload(&payload); + let serialized = serde_json::to_string(&report).unwrap(); + + assert!(serialized.contains("futureField")); + assert!(serialized.contains("restrictedGetter")); + assert!(serialized.contains("schemaHash")); + for private in [ + "PRIVATE_METADATA_VALUE", + "PRIVATE_NODE_VALUE", + "PRIVATE_VARIABLE", + "PRIVATE_STYLE", + "access denied", + ] { + assert!(!serialized.contains(private), "leaked {private}"); + } +} + +#[test] +fn payload_context_rejects_a_different_figma_target() { + let payload = CollectedPayload::try_from(synthetic_parts()).unwrap(); + let expected = + FigmaTarget::parse("https://www.figma.com/design/DifferentFile/Fixture?node-id=9-9") + .unwrap(); + + let error = validate_payload_context(&payload, &expected).unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[test] +fn completeness_report_combines_graph_and_unresolved_resource_state() { + let mut parts = synthetic_parts(); + parts.variables = Some(UpstreamResult { + raw: json!({ + "variables": [], + "styles": [], + "unresolved": [{ + "id": "VariableID:1:404", + "kind": "variable", + "reason": "notFoundOrUnavailable" + }] + }), + }); + let payload = CollectedPayload::try_from(parts).unwrap(); + + let report = payload.completeness_report(); + + assert_eq!(report.state, CompletenessState::Partial); + assert_eq!(report.snapshot.state, CompletenessState::Partial); + assert_eq!(report.resources.state, CompletenessState::Partial); + assert_eq!(report.resources.unresolved_count, 1); +} diff --git a/crates/devup-mcp-figma/tests/section.rs b/crates/devup-mcp-figma/tests/section.rs new file mode 100644 index 0000000..c4b4a1a --- /dev/null +++ b/crates/devup-mcp-figma/tests/section.rs @@ -0,0 +1,250 @@ +use std::collections::BTreeMap; + +use devup_mcp_figma::{ + BatchLimits, ExploreBounds, FigmaTarget, RawNode, SectionCandidate, SectionIndex, + SectionSummary, Snapshot, build_section_index, plan_batches, +}; +use serde_json::{Map, json}; + +#[test] +fn index_contains_only_top_level_visible_screens_in_visual_order() -> anyhow::Result<()> { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=10-1")?; + let snapshot = fixture_snapshot(); + + let index: SectionIndex = build_section_index(&snapshot, &target)?; + + assert_eq!(index.section.node_id, "10:1"); + assert_eq!(index.candidates.len(), 3); + assert_eq!( + index + .candidates + .iter() + .map(|candidate| candidate.node_id.as_str()) + .collect::>(), + ["10:3", "10:2", "10:4"] + ); + let first = &index.candidates[0]; + assert_eq!(first.name, "First"); + assert_eq!(first.node_type, "FRAME"); + assert!(first.visible); + assert_eq!(first.direct_child_count, 1); + assert_eq!(first.subtree_node_count, 2); + assert!(first.estimated_serialized_bytes > 0); + assert_eq!(first.breadcrumb, ["Proofread", "First"]); + assert!(first.selection_reasons.contains(&"screen-like".to_owned())); + assert!( + first + .selection_reasons + .contains(&"inside-section".to_owned()) + ); + assert!(first.canonical_url.ends_with("node-id=10-3")); + assert!( + !index + .candidates + .iter() + .any(|candidate| { matches!(candidate.node_id.as_str(), "10:5" | "10:6" | "10:7") }) + ); + Ok(()) +} + +#[test] +fn selection_and_batches_are_strict_bounded_and_deterministic() -> anyhow::Result<()> { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=10-1")?; + let index = build_section_index(&fixture_snapshot(), &target)?; + + assert_eq!(index.select(&[], true)?, vec!["10:3", "10:2", "10:4"]); + assert_eq!( + index.select(&["10:4".to_owned(), "10:3".to_owned()], false)?, + vec!["10:3", "10:4"] + ); + assert!( + index + .select(&["10:3".to_owned(), "10:3".to_owned()], false) + .is_err() + ); + assert!(index.select(&["99:99".to_owned()], false).is_err()); + assert!(index.select(&[], false).is_err()); + assert!(index.select(&["10:3".to_owned()], true).is_err()); + + let selected = index.select(&[], true)?; + let max_nodes = index.candidates[0].subtree_node_count + index.candidates[1].subtree_node_count; + let batches = plan_batches( + &index, + &selected, + BatchLimits { + max_estimated_bytes: usize::MAX, + max_nodes, + }, + )?; + assert_eq!(batches.len(), 2); + assert_eq!(batches[0].root_ids, ["10:3", "10:2"]); + assert_eq!(batches[1].root_ids, ["10:4"]); + assert!(!batches.iter().any(|batch| batch.oversized)); + + let oversized = plan_batches( + &index, + &["10:3".to_owned()], + BatchLimits { + max_estimated_bytes: 1, + max_nodes: 1, + }, + )?; + assert_eq!(oversized.len(), 1); + assert!(oversized[0].oversized); + Ok(()) +} + +#[test] +fn packing_uses_two_balanced_batches_for_a_nontrivial_visual_sequence() -> anyhow::Result<()> { + let index = packing_index(&[4, 4, 6, 6]); + let selected = index + .candidates + .iter() + .map(|candidate| candidate.node_id.clone()) + .collect::>(); + + let batches = plan_batches( + &index, + &selected, + BatchLimits { + max_estimated_bytes: 10, + max_nodes: 10, + }, + )?; + + assert_eq!(batches.len(), 2); + assert_eq!(batches[0].root_ids, ["root-0", "root-2"]); + assert_eq!(batches[1].root_ids, ["root-1", "root-3"]); + assert!( + batches + .iter() + .all(|batch| batch.estimated_bytes == 10 && batch.node_count == 10) + ); + Ok(()) +} + +fn packing_index(weights: &[usize]) -> SectionIndex { + let bounds = ExploreBounds { + x: 0.0, + y: 0.0, + width: 100.0, + height: 100.0, + }; + SectionIndex { + file_key: "FileKey123".to_owned(), + source_version: Some("v1".to_owned()), + section: SectionSummary { + node_id: "section".to_owned(), + name: "Section".to_owned(), + bounds, + }, + candidates: weights + .iter() + .enumerate() + .map(|(index, weight)| SectionCandidate { + node_id: format!("root-{index}"), + name: format!("Root {index}"), + node_type: "FRAME".to_owned(), + visible: true, + bounds: ExploreBounds { + y: index as f64 * 120.0, + ..bounds + }, + parent_id: Some("section".to_owned()), + breadcrumb: vec!["Section".to_owned(), format!("Root {index}")], + direct_child_count: 0, + subtree_node_count: *weight, + estimated_serialized_bytes: *weight, + selection_reasons: vec!["screen-like".to_owned()], + canonical_url: format!( + "https://www.figma.com/design/FileKey123/devup?node-id=root-{index}" + ), + }) + .collect(), + truncated: false, + } +} + +fn fixture_snapshot() -> Snapshot { + let nodes = [ + node( + "10:1", + "SECTION", + json!({ + "name": "Proofread", "parentId": "0:1", "visible": true, + "childrenIds": ["10:2", "10:3", "10:4", "10:5", "10:6"] , + "absoluteBoundingBox": {"x": 0, "y": 0, "width": 1600, "height": 1600} + }), + ), + node( + "10:2", + "FRAME", + json!({ + "name": "Second", "parentId": "10:1", "visible": true, + "childrenIds": [], "absoluteBoundingBox": {"x": 500, "y": 100, "width": 360, "height": 740} + }), + ), + node( + "10:3", + "FRAME", + json!({ + "name": "First", "parentId": "10:1", "visible": true, + "childrenIds": ["10:7"], "absoluteBoundingBox": {"x": 100, "y": 100, "width": 360, "height": 740} + }), + ), + node( + "10:4", + "FRAME", + json!({ + "name": "Third", "parentId": "10:1", "visible": true, + "childrenIds": [], "absoluteBoundingBox": {"x": 100, "y": 900, "width": 360, "height": 740} + }), + ), + node( + "10:5", + "TEXT", + json!({ + "name": "Note", "parentId": "10:1", "visible": true, "childrenIds": [], + "characters": "annotation", "absoluteBoundingBox": {"x": 900, "y": 100, "width": 100, "height": 30} + }), + ), + node( + "10:6", + "FRAME", + json!({ + "name": "Hidden", "parentId": "10:1", "visible": false, + "childrenIds": [], "absoluteBoundingBox": {"x": 900, "y": 300, "width": 360, "height": 740} + }), + ), + node( + "10:7", + "FRAME", + json!({ + "name": "Nested", "parentId": "10:3", "visible": true, + "childrenIds": [], "absoluteBoundingBox": {"x": 110, "y": 120, "width": 340, "height": 700} + }), + ), + ] + .into_iter() + .map(|node| (node.id.clone(), node)) + .collect::>(); + Snapshot { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + roots: vec!["10:1".to_owned()], + nodes, + diagnostics: Vec::new(), + } +} + +fn node(id: &str, node_type: &str, fields: serde_json::Value) -> RawNode { + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: fields.as_object().cloned().unwrap_or_default(), + extra: Map::new(), + field_errors: BTreeMap::new(), + } +} diff --git a/crates/devup-mcp-figma/tests/snapshot.rs b/crates/devup-mcp-figma/tests/snapshot.rs new file mode 100644 index 0000000..84758eb --- /dev/null +++ b/crates/devup-mcp-figma/tests/snapshot.rs @@ -0,0 +1,379 @@ +use devup_mcp_figma::{ + CompletenessState, Diagnostic, ErrorCode, RawNode, Snapshot, SnapshotChunk, UpstreamResult, + merge_chunks, snapshot_chunk_from_result, +}; +use serde_json::json; + +fn chunk(version: &str, node: serde_json::Value) -> SnapshotChunk { + serde_json::from_value(json!({ + "fileKey": "file-key", + "version": version, + "rootIds": ["1:1"], + "nodes": [node], + "diagnostics": [] + })) + .expect("valid synthetic snapshot chunk") +} + +#[test] +fn preserves_known_unknown_and_failed_fields_without_loss() { + let node: RawNode = serde_json::from_value(json!({ + "id": "1:1", + "type": "FRAME", + "fields": { + "name": "Root", + "layoutMode": "HORIZONTAL", + "futurePluginApiField": {"nested": [1, true, null]} + }, + "extra": {"runtimeOnlyField": "kept"}, + "fieldErrors": {"inaccessibleGetter": "getter failed"} + })) + .expect("raw node"); + + let round_trip = serde_json::to_value(&node).expect("serialize raw node"); + assert_eq!( + round_trip["fields"]["futurePluginApiField"]["nested"], + json!([1, true, null]) + ); + assert_eq!(round_trip["extra"]["runtimeOnlyField"], "kept"); + assert_eq!( + round_trip["fieldErrors"]["inaccessibleGetter"], + "getter failed" + ); +} + +#[test] +fn merges_chunks_by_node_id_and_keeps_child_order() { + let root = json!({ + "id": "1:1", + "type": "FRAME", + "fields": {"childrenIds": ["1:3", "1:2"]}, + "extra": {}, + "fieldErrors": {} + }); + let child = json!({ + "id": "1:2", + "type": "TEXT", + "fields": {"characters": "hello"}, + "extra": {}, + "fieldErrors": {} + }); + + let snapshot = merge_chunks(vec![chunk("42", root.clone()), chunk("42", child)]) + .expect("matching chunks merge"); + + assert_eq!(snapshot.roots, vec!["1:1"]); + assert_eq!(snapshot.nodes.len(), 2); + assert_eq!( + snapshot.nodes["1:1"].fields["childrenIds"], + json!(["1:3", "1:2"]) + ); + + let deduplicated = merge_chunks(vec![chunk("42", root.clone()), chunk("42", root)]) + .expect("identical duplicate is safe"); + assert_eq!(deduplicated.nodes.len(), 1); +} + +#[test] +fn rejects_cross_version_and_conflicting_chunks() { + let first = json!({ + "id": "1:1", "type": "FRAME", "fields": {"name": "before"}, + "extra": {}, "fieldErrors": {} + }); + let after = json!({ + "id": "1:1", "type": "FRAME", "fields": {"name": "after"}, + "extra": {}, "fieldErrors": {} + }); + + let version_error = merge_chunks(vec![chunk("1", first.clone()), chunk("2", after.clone())]) + .expect_err("versions must not mix"); + assert_eq!(version_error.code, ErrorCode::DevupFigmaVersionChanged); + + let conflict = merge_chunks(vec![chunk("1", first), chunk("1", after)]) + .expect_err("same id with different data is unsafe"); + assert_eq!(conflict.code, ErrorCode::DevupSnapshotUnsupported); +} + +#[test] +fn typed_views_are_additive_over_the_raw_snapshot() { + let snapshot: Snapshot = merge_chunks(vec![chunk( + "1", + json!({ + "id": "1:1", + "type": "FRAME", + "fields": { + "name": "Row", + "layoutMode": "HORIZONTAL", + "width": 320, + "futureField": 99 + }, + "extra": {}, + "fieldErrors": {} + }), + )]) + .expect("snapshot"); + let view = snapshot.nodes["1:1"].typed_view(); + + assert_eq!(view.name(), Some("Row")); + assert_eq!(view.string("layoutMode"), Some("HORIZONTAL")); + assert_eq!(view.number("width"), Some(320.0)); + assert_eq!(snapshot.nodes["1:1"].fields["futureField"], 99); +} + +#[test] +fn extracts_snapshot_from_structured_or_text_mcp_results() { + let payload = json!({ + "fileKey": "file-key", "version": null, "rootIds": ["1:1"], + "nodes": [{"id": "1:1", "type": "FRAME", "fields": {}, "extra": {}, "fieldErrors": {}}], + "diagnostics": [] + }); + let structured = UpstreamResult { + raw: json!({"structuredContent": {"result": payload.clone()}, "content": []}), + }; + let text = UpstreamResult { + raw: json!({"content": [{"type": "text", "text": serde_json::to_string(&payload).unwrap()}]}), + }; + + assert_eq!( + snapshot_chunk_from_result(&structured).unwrap().nodes[0].id, + "1:1" + ); + assert_eq!( + snapshot_chunk_from_result(&text).unwrap().file_key, + "file-key" + ); +} + +#[test] +fn audit_marks_missing_children_parent_mismatches_and_field_loss_partial() { + let snapshot = merge_chunks(vec![ + serde_json::from_value::(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["1:1"], + "nodes": [ + { + "id": "1:1", + "type": "FRAME", + "fields": { + "childrenIds": ["1:2", "1:3", "1:404"], + "childCount": 3 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "1:2", + "type": "FRAME", + "fields": { + "parentId": "1:1", + "childrenIds": [], + "visible": false + }, + "extra": { + "fillGeometry": {"$truncated": "byte-budget", "byteLength": 9000} + }, + "fieldErrors": {"restrictedGetter": "access denied"} + }, + { + "id": "1:3", + "type": "INSTANCE", + "fields": { + "parentId": "9:9", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "1:9", + "type": "TEXT", + "fields": {"parentId": "8:8", "childrenIds": []}, + "extra": {}, + "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .unwrap(), + ]) + .unwrap(); + + let audit = snapshot.audit(); + + assert_eq!(audit.state, CompletenessState::Partial); + assert_eq!(audit.root_count, 1); + assert_eq!(audit.preserved_node_count, 4); + assert_eq!(audit.reachable_node_count, 3); + assert_eq!(audit.orphan_node_ids, vec!["1:9"]); + assert_eq!(audit.declared_child_count, 3); + assert_eq!(audit.exported_child_count, 2); + assert_eq!(audit.missing_children.len(), 1); + assert_eq!(audit.missing_children[0].parent_id, "1:1"); + assert_eq!(audit.missing_children[0].child_id, "1:404"); + assert_eq!(audit.parent_mismatches.len(), 1); + assert_eq!(audit.parent_mismatches[0].parent_id, "1:1"); + assert_eq!(audit.parent_mismatches[0].child_id, "1:3"); + assert_eq!( + audit.parent_mismatches[0].observed_parent_id.as_deref(), + Some("9:9") + ); + assert_eq!(audit.truncated_fields.len(), 1); + assert_eq!(audit.truncated_fields[0].node_id, "1:2"); + assert_eq!(audit.truncated_fields[0].field, "fillGeometry"); + assert_eq!(audit.field_error_count, 1); +} + +#[test] +fn audit_treats_hidden_and_expanded_instance_children_as_complete() { + let snapshot = merge_chunks(vec![ + serde_json::from_value::(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["1:1"], + "nodes": [ + { + "id": "1:1", + "type": "FRAME", + "fields": {"childrenIds": ["1:2"], "childCount": 1}, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "1:2", + "type": "INSTANCE", + "fields": { + "parentId": "1:1", + "childrenIds": ["1:3"], + "childCount": 1, + "visible": false + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "1:3", + "type": "TEXT", + "fields": {"parentId": "1:2", "childrenIds": [], "childCount": 0}, + "extra": {}, + "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .unwrap(), + ]) + .unwrap(); + + let audit = snapshot.audit(); + + assert_eq!(audit.state, CompletenessState::Complete); + assert_eq!(audit.reachable_node_count, 3); + assert_eq!(audit.declared_child_count, 2); + assert_eq!(audit.exported_child_count, 2); + assert!(audit.missing_children.is_empty()); + assert!(audit.parent_mismatches.is_empty()); + assert!(audit.orphan_node_ids.is_empty()); + assert!(audit.truncated_fields.is_empty()); +} + +#[test] +fn audit_fails_when_a_requested_root_is_missing() { + let snapshot = Snapshot { + file_key: "file-key".to_owned(), + version: Some("1".to_owned()), + roots: vec!["1:404".to_owned()], + nodes: Default::default(), + diagnostics: Vec::new(), + }; + + let audit = snapshot.audit(); + + assert_eq!(audit.state, CompletenessState::Failed); + assert_eq!(audit.missing_root_ids, vec!["1:404"]); + assert_eq!(audit.reachable_node_count, 0); +} + +#[test] +fn audit_reports_observed_child_count_mismatches() { + let snapshot = merge_chunks(vec![ + serde_json::from_value::(json!({ + "fileKey": "file-key", + "version": "1", + "rootIds": ["1:1"], + "nodes": [ + { + "id": "1:1", + "type": "FRAME", + "fields": {"childrenIds": ["1:2"], "childCount": 2}, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "1:2", + "type": "TEXT", + "fields": {"parentId": "1:1", "childrenIds": [], "childCount": 0}, + "extra": {}, + "fieldErrors": {} + } + ], + "diagnostics": [] + })) + .unwrap(), + ]) + .unwrap(); + + let audit = snapshot.audit(); + + assert_eq!(audit.state, CompletenessState::Partial); + assert_eq!(audit.child_count_mismatches.len(), 1); + assert_eq!(audit.child_count_mismatches[0].node_id, "1:1"); + assert_eq!(audit.child_count_mismatches[0].declared_count, 2); + assert_eq!(audit.child_count_mismatches[0].exported_count, 1); +} + +#[test] +fn audit_preserves_declared_order_for_missing_children() { + let snapshot = merge_chunks(vec![chunk( + "1", + json!({ + "id": "1:1", + "type": "FRAME", + "fields": {"childrenIds": ["1:missing-b", "1:missing-a"]}, + "extra": {}, + "fieldErrors": {} + }), + )]) + .unwrap(); + + let audit = snapshot.audit(); + + assert_eq!( + audit + .missing_children + .iter() + .map(|missing| missing.child_id.as_str()) + .collect::>(), + vec!["1:missing-b", "1:missing-a"] + ); +} + +#[test] +fn structured_diagnostic_round_trips_safe_recovery_context() { + let expected = json!({ + "code": "DEVUP_RESOURCE_UNRESOLVED", + "message": "Figma resource fallback", + "nodeId": "1:2", + "severity": "warning", + "property": "fills.color", + "resourceKind": "variable", + "resourceId": "VariableID:1:404", + "fallback": "raw-value", + "recoverable": true, + "details": {"modeId": "1:0"} + }); + + let diagnostic: Diagnostic = serde_json::from_value(expected.clone()).unwrap(); + + assert_eq!(serde_json::to_value(diagnostic).unwrap(), expected); +} diff --git a/crates/devup-mcp-figma/tests/source_policy.rs b/crates/devup-mcp-figma/tests/source_policy.rs new file mode 100644 index 0000000..8faf7f1 --- /dev/null +++ b/crates/devup-mcp-figma/tests/source_policy.rs @@ -0,0 +1,167 @@ +use devup_mcp_figma::{ + ErrorCode, SourcePolicy, UpstreamFailureContext, UpstreamFailureKind, + classify_upstream_failure, fallback_allowed, fallback_allowed_for_error, + upstream_failure_error, +}; + +#[test] +fn auto_falls_back_only_for_identity_or_capability_failures() { + use UpstreamFailureKind::{ + AuthUnavailable, CapabilityUnavailable, CatalogRejected, NodeNotFound, PermissionDenied, + RateLimited, VersionChanged, + }; + + for kind in [ + CatalogRejected, + AuthUnavailable, + CapabilityUnavailable, + PermissionDenied, + ] { + assert!(fallback_allowed(SourcePolicy::Auto, kind), "{kind:?}"); + assert!(!fallback_allowed(SourcePolicy::Direct, kind), "{kind:?}"); + assert!(!fallback_allowed(SourcePolicy::Host, kind), "{kind:?}"); + } + + for kind in [RateLimited, NodeNotFound, VersionChanged] { + assert!(!fallback_allowed(SourcePolicy::Auto, kind), "{kind:?}"); + } +} + +#[test] +fn classifies_upstream_failures_from_boundary_metadata() { + let cases = [ + ( + UpstreamFailureContext::RegisterClient, + Some(403), + "client is not approved for the Figma MCP Catalog", + UpstreamFailureKind::CatalogRejected, + ), + ( + UpstreamFailureContext::Connect, + Some(401), + "unauthorized", + UpstreamFailureKind::AuthUnavailable, + ), + ( + UpstreamFailureContext::ListTools, + None, + "required tool use_figma is unavailable", + UpstreamFailureKind::CapabilityUnavailable, + ), + ( + UpstreamFailureContext::CallTool, + Some(403), + "forbidden", + UpstreamFailureKind::PermissionDenied, + ), + ( + UpstreamFailureContext::CallTool, + Some(429), + "too many requests", + UpstreamFailureKind::RateLimited, + ), + ( + UpstreamFailureContext::CallTool, + Some(404), + "node not found", + UpstreamFailureKind::NodeNotFound, + ), + ( + UpstreamFailureContext::Decode, + None, + "invalid json", + UpstreamFailureKind::InvalidResponse, + ), + ( + UpstreamFailureContext::Connect, + None, + "connection reset", + UpstreamFailureKind::Transport, + ), + ]; + + for (context, status, message, expected) in cases { + assert_eq!( + classify_upstream_failure(context, status, message), + expected, + "{context:?}: {message}" + ); + } +} + +#[test] +fn public_policy_and_error_codes_have_stable_json_values() { + assert_eq!(serde_json::to_value(SourcePolicy::Auto).unwrap(), "auto"); + assert_eq!( + serde_json::to_value(SourcePolicy::Direct).unwrap(), + "direct" + ); + assert_eq!(serde_json::to_value(SourcePolicy::Host).unwrap(), "host"); + let codes = [ + ( + ErrorCode::DevupFigmaDirectUnavailable, + "DEVUP_FIGMA_DIRECT_UNAVAILABLE", + ), + ( + ErrorCode::DevupFigmaCatalogRejected, + "DEVUP_FIGMA_CATALOG_REJECTED", + ), + ( + ErrorCode::DevupFigmaHostRequired, + "DEVUP_FIGMA_HOST_REQUIRED", + ), + ( + ErrorCode::DevupFigmaHandoffExpired, + "DEVUP_FIGMA_HANDOFF_EXPIRED", + ), + ( + ErrorCode::DevupFigmaHandoffInvalid, + "DEVUP_FIGMA_HANDOFF_INVALID", + ), + ( + ErrorCode::DevupCompatCorpusDrift, + "DEVUP_COMPAT_CORPUS_DRIFT", + ), + ]; + for (code, expected) in codes { + assert_eq!(serde_json::to_value(code).unwrap(), expected); + } +} + +#[test] +fn classified_errors_never_copy_the_raw_upstream_message() { + let raw = "catalog rejected Authorization: Bearer figma-secret-token"; + let kind = classify_upstream_failure(UpstreamFailureContext::RegisterClient, Some(403), raw); + let error = kind.into_devup_error(Some(403)); + let serialized = serde_json::to_string(&error).unwrap(); + + assert_eq!(error.code, ErrorCode::DevupFigmaCatalogRejected); + assert!(serialized.contains("\"source\":\"direct\"")); + assert!(serialized.contains("\"status\":403")); + assert!(!serialized.contains("figma-secret-token")); + assert!(!serialized.contains("Authorization")); +} + +#[test] +fn auto_can_decide_fallback_from_the_safe_public_error() { + let catalog = upstream_failure_error( + UpstreamFailureContext::Connect, + Some(403), + "Figma MCP Catalog rejected bearer-secret", + ); + assert!(fallback_allowed_for_error(SourcePolicy::Auto, &catalog)); + assert!(!fallback_allowed_for_error(SourcePolicy::Direct, &catalog)); + + let rate_limited = + upstream_failure_error(UpstreamFailureContext::CallTool, Some(429), "bearer-secret"); + assert!(!fallback_allowed_for_error( + SourcePolicy::Auto, + &rate_limited + )); + assert_eq!(rate_limited.code, ErrorCode::DevupFigmaRateLimited); + assert!( + !serde_json::to_string(&rate_limited) + .unwrap() + .contains("bearer-secret") + ); +} diff --git a/crates/devup-mcp-figma/tests/upstream_contract.rs b/crates/devup-mcp-figma/tests/upstream_contract.rs new file mode 100644 index 0000000..e3da675 --- /dev/null +++ b/crates/devup-mcp-figma/tests/upstream_contract.rs @@ -0,0 +1,434 @@ +use devup_mcp_figma::{ + BuiltinScript, ExploreReadOptions, ReadToolCall, ResourceBatch, ResourceStyleRef, + SearchReadOptions, SnapshotReadOptions, +}; + +#[test] +fn maps_every_read_call_to_the_fixed_figma_tool_contract() { + let calls = [ + ( + ReadToolCall::metadata("file-key", Some("1:2")), + "get_metadata", + ), + ( + ReadToolCall::variable_defs("file-key", "1:2"), + "get_variable_defs", + ), + ( + ReadToolCall::design_context("file-key", "1:2"), + "get_design_context", + ), + ( + ReadToolCall::code_connect_map("file-key", "1:2"), + "get_code_connect_map", + ), + ( + ReadToolCall::screenshot("file-key", "1:2"), + "get_screenshot", + ), + ( + ReadToolCall::snapshot("file-key", "1:2", BuiltinScript::NodeSnapshot), + "use_figma", + ), + ]; + + for (call, expected_name) in calls { + assert_eq!(call.tool_name(), expected_name); + let arguments = call.arguments(); + assert_eq!( + arguments.get("fileKey").and_then(|v| v.as_str()), + Some("file-key") + ); + } +} + +#[test] +fn snapshot_accepts_only_compiled_in_scripts() { + let call = ReadToolCall::snapshot("file-key", "1:2", BuiltinScript::NodeSnapshot); + let arguments = call.arguments(); + let code = arguments + .get("code") + .and_then(|value| value.as_str()) + .expect("built-in script"); + + assert!(code.contains("figma.getNodeByIdAsync")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn snapshot_is_byte_bounded_and_cursor_driven() { + let call = ReadToolCall::snapshot_chunk( + "file-key", + "1:2", + SnapshotReadOptions { + offset: 7, + max_payload_bytes: 12_000, + max_field_bytes: 4_096, + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert!(code.contains("snapshotOptions")); + assert!(code.contains("maxPayloadBytes")); + assert!(code.contains("maxFieldBytes")); + assert!(code.contains("$largeValue")); + assert!(code.contains("__DEVUP_SNAPSHOT_CURSOR__")); + assert!(code.contains("\"offset\":7")); + assert!(code.contains("\"maxPayloadBytes\":12000")); +} + +#[test] +fn large_values_use_a_compiled_bounded_read_only_continuation() { + let call = ReadToolCall::large_value( + "file-key", + devup_mcp_figma::LargeValueReadOptions { + node_id: "1:2".to_owned(), + field: "characters".to_owned(), + offset: 4096, + max_chunk_bytes: 8192, + byte_length: 20000, + sha256: "abc123".to_owned(), + version: Some("v1".to_owned()), + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("getNodeByIdAsync")); + assert!(code.contains("getStyledTextSegments")); + assert!(code.contains("dataBase64")); + assert!(code.contains("\"offset\":4096")); + assert!(code.contains("\"maxChunkBytes\":8192")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn asset_export_uses_only_compiled_read_only_export_settings() { + let call = ReadToolCall::asset_export( + "file-key", + Some("v1".to_owned()), + devup_mcp_figma::AssetRequest { + asset_id: "1:2:node".to_owned(), + node_id: "1:2".to_owned(), + field: "node".to_owned(), + image_hash: None, + format: devup_mcp_figma::AssetFormat::Svg, + scale: 1, + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("exportAsync")); + assert!(code.contains("figma.io.write")); + assert!(code.contains("DEVUP_ASSET_EXPORT_FAILED")); + assert!(code.contains("\"format\":\"svg\"")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn snapshot_manifest_covers_current_official_node_properties() { + let call = ReadToolCall::snapshot("file-key", "1:2", BuiltinScript::NodeSnapshot); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + for property in [ + "\"maskType\"", + "\"overflowDirection\"", + "\"primaryAxisAlignItems\"", + "\"componentPropertyReferences\"", + "\"detachedInfo\"", + "\"exposedInstances\"", + "\"isExposedInstance\"", + ] { + assert!(code.contains(property), "manifest omitted {property}"); + } +} + +#[test] +fn snapshot_reads_only_manifest_properties_supported_by_the_runtime_node() { + let call = ReadToolCall::snapshot("file-key", "1:2", BuiltinScript::NodeSnapshot); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert!(code.contains("if (name in value) names.add(name)")); + assert!(!code.contains("const names = new Set(manifest)")); +} + +#[test] +fn snapshot_collects_styled_text_segments_from_the_compiled_manifest() { + let call = ReadToolCall::snapshot("file-key", "1:2", BuiltinScript::NodeSnapshot); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert!(code.contains("getStyledTextSegments(textSegmentManifest)")); + assert!(code.contains("fields.styledTextSegments")); + for field in [ + "fontName", + "fontWeight", + "fontSize", + "textDecoration", + "textCase", + "lineHeight", + "letterSpacing", + "fills", + "textStyleId", + "fillStyleId", + "listOptions", + "indentation", + "hyperlink", + ] { + assert!(code.contains(&format!("\"{field}\"")), "missing {field}"); + } +} + +#[test] +fn search_uses_a_compiled_read_only_page_projection() { + let call = ReadToolCall::search_snapshot( + "file-key", + "0:1", + SearchReadOptions { + query: "본연체".to_owned(), + node_types: vec!["FRAME".to_owned()], + match_kind: "normalized".to_owned(), + limit: 20, + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("figma.setCurrentPageAsync(page)")); + assert!(code.contains("page.findAll")); + assert!(code.contains("본연체")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn explore_uses_a_bounded_spatial_projection() { + let call = ReadToolCall::explore_snapshot( + "file-key", + "3879:35481", + ExploreReadOptions { + projection_limit: 120, + text_preview_limit: 96, + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("figma.getNodeByIdAsync")); + assert!(code.contains("current.type !== \"PAGE\"")); + assert!(code.contains("projectionLimit")); + assert!(code.contains("textPreviewLimit")); + assert!(code.contains("projectionTruncated")); + assert!(code.contains("anchor.type === \"SECTION\"")); + assert!(code.contains("breadcrumb")); + assert!(code.contains("visible")); + assert!(code.contains("sectionQueue")); + assert!(code.contains("120")); + assert!(code.contains("96")); + assert!(!code.contains("page.findAll")); + assert!(!code.contains("eval(")); +} + +#[test] +fn section_index_exposes_compact_candidates_without_descendant_fields() { + let call = ReadToolCall::section_index("file-key", "4217:7743"); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("subtreeNodeCount")); + assert!(code.contains("estimatedSerializedBytes")); + assert!(code.contains("directChildCount")); + assert!(code.contains("selectionReasons")); + assert!(code.contains("projectionTruncated")); + assert!(!code.contains("snapshotNode")); + assert!(!code.contains("styledTextSegments")); + assert!(!code.contains("__DEVUP_PLUGIN_API_MANIFEST__")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn multi_root_fast_snapshot_embeds_only_validated_root_ids() { + let call = ReadToolCall::multi_root_snapshot( + "file-key", + "4217:7743", + vec!["10:3".to_owned(), "10:2".to_owned()], + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert_eq!(call.arguments()["nodeId"], "4217:7743"); + assert!(code.contains("[\"10:3\",\"10:2\"]")); + assert!(code.contains("requestedRootIds")); + assert!(code.contains("rootIds: roots.map")); + assert!(code.contains("getStyledTextSegments(textSegmentManifest)")); + assert!(code.contains("devupFastSnapshotDescriptor")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); +} + +#[test] +fn style_consumers_use_async_compact_range_projection() { + let call = ReadToolCall::resource_batch( + "file-key", + "1:2", + ResourceBatch { + variable_ids: Vec::new(), + styles: vec![ResourceStyleRef { + id: "s1".to_owned(), + style_type: "TEXT".to_owned(), + consumer_start: Some(320), + consumer_end: Some(640), + }], + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert!(code.contains("getStyleConsumersAsync")); + assert!(code.contains("$consumerEntries")); + assert!(code.contains("[\"parent\", \"children\", \"consumers\"]")); + assert!(code.contains("\"consumerStart\":320")); + assert!(code.contains("\"consumerEnd\":640")); +} + +#[test] +fn used_resources_use_exact_ids_without_file_catalog_or_consumers() { + let call = ReadToolCall::used_resources( + "file-key", + "1:2", + ResourceBatch { + variable_ids: vec!["VariableID:1:2".to_owned()], + styles: vec![ResourceStyleRef { + id: "S:text".to_owned(), + style_type: "TEXT".to_owned(), + consumer_start: None, + consumer_end: None, + }], + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("getVariableByIdAsync")); + assert!(code.contains("getVariableCollectionByIdAsync")); + assert!(code.contains("getStyleByIdAsync")); + assert!(code.contains("usedVariableIds")); + assert!(code.contains("usedStyleIds")); + assert!(!code.contains("getLocalVariableCollectionsAsync")); + assert!(!code.contains("getStyleConsumersAsync")); +} + +#[test] +fn fast_snapshot_is_lossless_bounded_and_read_only() { + let call = ReadToolCall::fast_snapshot("file-key", "1:2"); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert_eq!(call.tool_name(), "use_figma"); + assert!(code.contains("figma.getNodeByIdAsync")); + assert!(code.contains("if (name in value) names.add(name)")); + assert!(code.contains("getStyledTextSegments(textSegmentManifest)")); + for field in [ + "strokeTopWeight", + "strokeRightWeight", + "strokeBottomWeight", + "strokeLeftWeight", + ] { + assert!(code.contains(&format!("\"{field}\"")), "missing {field}"); + } + assert!(code.contains("getVariableByIdAsync")); + assert!(code.contains("getVariableCollectionByIdAsync")); + assert!(code.contains("getStyleByIdAsync")); + assert!(code.contains("Promise.all([...variableJobs, ...styleJobs])")); + assert!(code.contains("usedVariableIds")); + assert!(code.contains("usedStyleIds")); + assert!(code.contains("duVp")); + assert!(code.contains("figma.io.write")); + assert!(code.contains("devup-fast-snapshot-${sequence + 1}-of-${chunkCount}.png")); + assert!(code.contains("devupFastSnapshotDescriptor")); + assert!(code.contains("MAX_ENVELOPE_BYTES")); + assert!(code.contains("0xfffd")); + assert!(!code.contains("maxPayloadBytes")); + assert!(!code.contains("maxFieldBytes")); + assert!(!code.contains("DEVUP_FIELD_VALUE_TRUNCATED")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); + assert_eq!(code.matches("figma.io.write(").count(), 1); +} + +#[test] +fn fast_theme_collects_complete_local_theme_and_used_remote_resources_read_only() { + let call = ReadToolCall::fast_theme("file-key"); + let arguments = call.arguments(); + let code = arguments["code"].as_str().unwrap(); + + assert_eq!(call.tool_name(), "use_figma"); + assert_eq!(arguments["fileKey"], "file-key"); + assert!(arguments.get("nodeId").is_none()); + for read in [ + "getLocalVariableCollectionsAsync", + "getLocalVariablesAsync", + "getLocalPaintStylesAsync", + "getLocalTextStylesAsync", + "getLocalEffectStylesAsync", + "getLocalGridStylesAsync", + "getVariableByIdAsync", + "getVariableCollectionByIdAsync", + ] { + assert!(code.contains(read), "missing theme read {read}"); + } + assert!(code.contains("usedRemoteVariables")); + assert!(code.contains("devupFastThemeDescriptor")); + assert!(code.contains("devup-fast-theme-${sequence + 1}-of-${chunkCount}.png")); + assert!(code.contains("duVp")); + assert!(code.contains("MAX_ENVELOPE_BYTES")); + assert!(!code.contains("eval(")); + assert!(!code.contains("Function(")); + for mutation in [ + "figma.create", + ".setPluginData(", + ".setSharedPluginData(", + ".remove(", + ".appendChild(", + ".insertChild(", + "deleteAsync(", + ] { + assert!(!code.contains(mutation), "theme script exposed {mutation}"); + } +} + +#[test] +fn built_in_scripts_expose_only_read_operations() { + for script in [ + BuiltinScript::NodeSnapshot, + BuiltinScript::PageCatalog, + BuiltinScript::SearchSnapshot, + BuiltinScript::VariableCatalog, + BuiltinScript::LocalVariables, + BuiltinScript::UsedResources, + BuiltinScript::ExploreSnapshot, + BuiltinScript::SectionIndex, + BuiltinScript::FastSnapshotEnvelope, + BuiltinScript::MultiRootSnapshotEnvelope, + BuiltinScript::FastThemeEnvelope, + ] { + let call = ReadToolCall::snapshot("file-key", "1:2", script); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + for write_operation in [ + "figma.create", + ".setPluginData(", + ".setSharedPluginData(", + ".remove(", + ".appendChild(", + ".insertChild(", + "deleteAsync(", + ] { + assert!( + !code.contains(write_operation), + "built-in script exposed {write_operation}" + ); + } + } +} diff --git a/crates/devup-mcp-figma/tests/used_resources.rs b/crates/devup-mcp-figma/tests/used_resources.rs new file mode 100644 index 0000000..0afc285 --- /dev/null +++ b/crates/devup-mcp-figma/tests/used_resources.rs @@ -0,0 +1,181 @@ +use devup_mcp_figma::{ + RawNode, ReadToolCall, ResourceBatch, ResourceKind, ResourceScope, ResourceStyleRef, + SnapshotChunk, collect_used_resource_refs, +}; +use serde_json::{Map, json}; + +fn node(id: &str, fields: serde_json::Value) -> RawNode { + RawNode { + id: id.to_owned(), + node_type: "TEXT".to_owned(), + fields: fields.as_object().cloned().unwrap_or_else(Map::new), + extra: Map::new(), + field_errors: Default::default(), + } +} + +#[test] +fn exact_id_script_fetches_used_resources_without_style_consumers() { + let call = ReadToolCall::used_resources( + "FileKey123", + "3879:35518", + ResourceBatch { + variable_ids: vec!["VariableID:12:34".to_owned()], + styles: vec![ResourceStyleRef { + id: "S:text".to_owned(), + style_type: "TEXT".to_owned(), + consumer_start: None, + consumer_end: None, + }], + }, + ); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + + assert!(code.contains("getVariableByIdAsync")); + assert!(code.contains("getVariableCollectionByIdAsync")); + assert!(code.contains("getStyleByIdAsync")); + assert!(code.contains("unresolved")); + assert!(!code.contains("getLocalVariablesAsync")); + assert!(!code.contains("getStyleConsumersAsync")); +} + +#[test] +fn scanner_collects_bound_variables_and_every_supported_style_field() { + let chunks = vec![SnapshotChunk { + file_key: "FileKey123".to_owned(), + version: Some("v1".to_owned()), + root_ids: vec!["3879:35518".to_owned()], + nodes: vec![node( + "3879:35518", + json!({ + "id": "ordinary-node-id-must-not-be-collected", + "boundVariables": { + "fills": [ + {"type": "VARIABLE_ALIAS", "id": "VariableID:56:78"}, + {"type": "VARIABLE_ALIAS", "id": "VariableID:12:34"} + ], + "visible": {"type": "VARIABLE_ALIAS", "id": "VariableID:12:34"}, + "ignored": {"type": "SOMETHING_ELSE", "id": "VariableID:99:99"} + }, + "textStyleId": "S:text", + "fillStyleId": "S:fill", + "strokeStyleId": "S:stroke", + "effectStyleId": "S:effect", + "gridStyleId": "S:grid", + "backgroundStyleId": "S:background", + "styledTextSegments": [{ + "characters": "[1. 이름]", + "textStyleId": "S:text-emphasis", + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "VariableID:90:12"}] + } + }] + }), + )], + diagnostics: Vec::new(), + }]; + + let refs = collect_used_resource_refs(&chunks); + + assert_eq!( + refs.variable_ids, + vec![ + "VariableID:12:34".to_owned(), + "VariableID:56:78".to_owned(), + "VariableID:90:12".to_owned(), + ] + ); + assert_eq!( + refs.styles + .iter() + .map(|style| (style.id.as_str(), style.style_type.as_str())) + .collect::>(), + vec![ + ("S:background", "PAINT"), + ("S:effect", "EFFECT"), + ("S:fill", "PAINT"), + ("S:grid", "GRID"), + ("S:stroke", "PAINT"), + ("S:text", "TEXT"), + ("S:text-emphasis", "TEXT"), + ] + ); + assert!(refs.occurrences.iter().any(|occurrence| { + occurrence.node_id == "3879:35518" + && occurrence.field == "styledTextSegments[0].boundVariables.fills[0]" + && occurrence.resource_id == "VariableID:90:12" + && occurrence.resource_kind == ResourceKind::Variable + })); +} + +#[test] +fn scanner_is_deterministic_and_ignores_unbound_ids_and_mixed_sentinels() { + let chunks = vec![SnapshotChunk { + file_key: "FileKey123".to_owned(), + version: None, + root_ids: vec!["2:2".to_owned(), "1:1".to_owned()], + nodes: vec![ + node( + "2:2", + json!({ + "componentProperties": {"id": "VariableID:not-bound"}, + "textStyleId": "figma.mixed", + "fillStyleId": null, + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "VariableID:2:2"}] + } + }), + ), + node( + "1:1", + json!({ + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "VariableID:1:1"}] + }, + "textStyleId": "S:body" + }), + ), + ], + diagnostics: Vec::new(), + }]; + + let first = collect_used_resource_refs(&chunks); + let mut reversed = chunks; + reversed[0].nodes.reverse(); + let second = collect_used_resource_refs(&reversed); + + assert_eq!(first, second); + assert_eq!(first.variable_ids, ["VariableID:1:1", "VariableID:2:2"]); + assert_eq!(first.styles.len(), 1); + assert_eq!(ResourceScope::default(), ResourceScope::None); +} + +#[test] +fn variable_aliases_are_collected_from_any_lossless_snapshot_field() { + let chunks = [SnapshotChunk { + file_key: "file-key".to_owned(), + version: None, + root_ids: vec!["1:1".to_owned()], + nodes: vec![node( + "1:1", + json!({ + "styledTextSegments": [{ + "fontSize": { + "type": "VARIABLE_ALIAS", + "id": "VariableID:font-size" + } + }] + }), + )], + diagnostics: Vec::new(), + }]; + + let refs = collect_used_resource_refs(&chunks); + + assert_eq!(refs.variable_ids, ["VariableID:font-size"]); + assert!(refs.occurrences.iter().any(|occurrence| { + occurrence.field == "styledTextSegments[0].fontSize" + && occurrence.resource_id == "VariableID:font-size" + && occurrence.resource_kind == ResourceKind::Variable + })); +} diff --git a/crates/devup-mcp-visual/Cargo.toml b/crates/devup-mcp-visual/Cargo.toml new file mode 100644 index 0000000..bb43fa7 --- /dev/null +++ b/crates/devup-mcp-visual/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "devup-mcp-visual" +description = "Deterministic pure-Rust PNG comparison for devup-mcp consumers" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +image.workspace = true +serde.workspace = true +serde_json.workspace = true + +[dev-dependencies] +anyhow.workspace = true diff --git a/crates/devup-mcp-visual/src/lib.rs b/crates/devup-mcp-visual/src/lib.rs new file mode 100644 index 0000000..a806dbe --- /dev/null +++ b/crates/devup-mcp-visual/src/lib.rs @@ -0,0 +1,170 @@ +use std::path::{Path, PathBuf}; + +use image::{ImageBuffer, ImageError, Rgba}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq)] +pub struct CompareOptions { + pub channel_tolerance: u8, + pub max_changed_ratio: f64, + pub diff_path: Option, +} + +impl Default for CompareOptions { + fn default() -> Self { + Self { + channel_tolerance: 0, + max_changed_ratio: 0.005, + diff_path: None, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum VisualStatus { + Exact, + WithinThreshold, + Mismatch, + InvalidDimensions, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct VisualReport { + pub status: VisualStatus, + pub reference_dimensions: [u32; 2], + pub actual_dimensions: [u32; 2], + pub changed_pixels: u64, + pub total_pixels: u64, + pub changed_ratio: f64, + pub max_changed_ratio: f64, + pub channel_tolerance: u8, + pub max_channel_delta: u8, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub diff_path: Option, +} + +impl VisualReport { + pub fn passed(&self) -> bool { + matches!( + self.status, + VisualStatus::Exact | VisualStatus::WithinThreshold + ) + } +} + +#[derive(Debug)] +pub enum VisualError { + Image(ImageError), + InvalidThreshold, +} + +impl std::fmt::Display for VisualError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Image(error) => write!(formatter, "PNG를 읽거나 쓸 수 없습니다: {error}"), + Self::InvalidThreshold => { + formatter.write_str("max_changed_ratio는 0 이상 1 이하여야 합니다.") + } + } + } +} + +impl std::error::Error for VisualError {} + +impl From for VisualError { + fn from(value: ImageError) -> Self { + Self::Image(value) + } +} + +pub fn compare_png( + reference_path: impl AsRef, + actual_path: impl AsRef, + options: &CompareOptions, +) -> Result { + if !(0.0..=1.0).contains(&options.max_changed_ratio) { + return Err(VisualError::InvalidThreshold); + } + let reference = image::open(reference_path)?.into_rgba8(); + let actual = image::open(actual_path)?.into_rgba8(); + let reference_dimensions = [reference.width(), reference.height()]; + let actual_dimensions = [actual.width(), actual.height()]; + if reference_dimensions != actual_dimensions { + return Ok(VisualReport { + status: VisualStatus::InvalidDimensions, + reference_dimensions, + actual_dimensions, + changed_pixels: 0, + total_pixels: 0, + changed_ratio: 1.0, + max_changed_ratio: options.max_changed_ratio, + channel_tolerance: options.channel_tolerance, + max_channel_delta: 0, + diff_path: None, + }); + } + + let mut changed_pixels = 0_u64; + let mut max_channel_delta = 0_u8; + let mut diff = options.diff_path.as_ref().map(|_| { + ImageBuffer::from_pixel( + reference.width(), + reference.height(), + Rgba::([0, 0, 0, 0]), + ) + }); + for (index, (reference_pixel, actual_pixel)) in + reference.pixels().zip(actual.pixels()).enumerate() + { + let delta = reference_pixel + .0 + .iter() + .zip(actual_pixel.0) + .map(|(reference, actual)| reference.abs_diff(actual)) + .max() + .unwrap_or(0); + max_channel_delta = max_channel_delta.max(delta); + if delta <= options.channel_tolerance { + continue; + } + changed_pixels += 1; + if let Some(diff) = &mut diff { + let x = index as u32 % reference.width(); + let y = index as u32 / reference.width(); + diff.put_pixel(x, y, Rgba::([255, 0, 0, 255])); + } + } + let total_pixels = u64::from(reference.width()) * u64::from(reference.height()); + let changed_ratio = if total_pixels == 0 { + 0.0 + } else { + changed_pixels as f64 / total_pixels as f64 + }; + let status = if changed_pixels == 0 { + VisualStatus::Exact + } else if changed_ratio <= options.max_changed_ratio { + VisualStatus::WithinThreshold + } else { + VisualStatus::Mismatch + }; + let diff_path = if let (Some(path), Some(diff)) = (&options.diff_path, diff) { + diff.save_with_format(path, image::ImageFormat::Png)?; + Some(path.to_string_lossy().into_owned()) + } else { + None + }; + Ok(VisualReport { + status, + reference_dimensions, + actual_dimensions, + changed_pixels, + total_pixels, + changed_ratio, + max_changed_ratio: options.max_changed_ratio, + channel_tolerance: options.channel_tolerance, + max_channel_delta, + diff_path, + }) +} diff --git a/crates/devup-mcp-visual/src/main.rs b/crates/devup-mcp-visual/src/main.rs new file mode 100644 index 0000000..067a8b7 --- /dev/null +++ b/crates/devup-mcp-visual/src/main.rs @@ -0,0 +1,63 @@ +use std::{path::PathBuf, process::ExitCode}; + +use devup_mcp_visual::{CompareOptions, compare_png}; + +fn main() -> ExitCode { + match run(std::env::args().skip(1).collect()) { + Ok(passed) => { + if passed { + ExitCode::SUCCESS + } else { + ExitCode::FAILURE + } + } + Err(message) => { + eprintln!("{message}"); + ExitCode::from(2) + } + } +} + +fn run(arguments: Vec) -> Result { + if arguments.first().map(String::as_str) != Some("compare") { + return Err("usage: devup-mcp-visual compare --reference --actual [--diff ] [--channel-tolerance <0..255>] [--max-changed-ratio <0..1>]".to_owned()); + } + let mut reference = None; + let mut actual = None; + let mut options = CompareOptions::default(); + let mut index = 1; + while index < arguments.len() { + let option = arguments[index].as_str(); + let value = arguments + .get(index + 1) + .ok_or_else(|| format!("{option} 값이 필요합니다."))?; + match option { + "--reference" => reference = Some(PathBuf::from(value)), + "--actual" => actual = Some(PathBuf::from(value)), + "--diff" => options.diff_path = Some(PathBuf::from(value)), + "--channel-tolerance" => { + options.channel_tolerance = value + .parse() + .map_err(|_| "channel tolerance가 올바르지 않습니다.".to_owned())?; + } + "--max-changed-ratio" => { + options.max_changed_ratio = value + .parse() + .map_err(|_| "max changed ratio가 올바르지 않습니다.".to_owned())?; + } + _ => return Err(format!("알 수 없는 option입니다: {option}")), + } + index += 2; + } + let report = compare_png( + reference.ok_or_else(|| "--reference가 필요합니다.".to_owned())?, + actual.ok_or_else(|| "--actual이 필요합니다.".to_owned())?, + &options, + ) + .map_err(|error| error.to_string())?; + println!( + "{}", + serde_json::to_string(&report).map_err(|error| error.to_string())? + ); + Ok(report.passed()) +} diff --git a/crates/devup-mcp-visual/tests/compare.rs b/crates/devup-mcp-visual/tests/compare.rs new file mode 100644 index 0000000..ed6911f --- /dev/null +++ b/crates/devup-mcp-visual/tests/compare.rs @@ -0,0 +1,87 @@ +use std::{path::PathBuf, time::SystemTime}; + +use devup_mcp_visual::{CompareOptions, VisualStatus, compare_png}; +use image::{ImageBuffer, Rgba}; + +fn temp_dir() -> anyhow::Result { + let path = std::env::temp_dir().join(format!( + "devup-mcp-visual-{}-{}", + std::process::id(), + SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH)? + .as_nanos() + )); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +fn write_png(path: &std::path::Path, pixels: &[[u8; 4]], width: u32) -> anyhow::Result<()> { + let height = pixels.len() as u32 / width; + let image = ImageBuffer::, _>::from_raw( + width, + height, + pixels.iter().flatten().copied().collect::>(), + ) + .expect("fixture dimensions"); + image.save_with_format(path, image::ImageFormat::Png)?; + Ok(()) +} + +#[test] +fn exact_and_changed_pngs_report_deterministic_metrics_and_diff() -> anyhow::Result<()> { + let root = temp_dir()?; + let reference = root.join("reference.png"); + let actual = root.join("actual.png"); + let diff = root.join("diff.png"); + let white = [255, 255, 255, 255]; + write_png(&reference, &[white; 8], 4)?; + write_png(&actual, &[white; 8], 4)?; + let exact = compare_png(&reference, &actual, &CompareOptions::default())?; + assert_eq!(exact.status, VisualStatus::Exact); + assert_eq!(exact.changed_pixels, 0); + + let mut changed = [white; 8]; + changed[1] = [0, 0, 0, 255]; + changed[2] = [0, 0, 0, 255]; + write_png(&actual, &changed, 4)?; + let report = compare_png( + &reference, + &actual, + &CompareOptions { + diff_path: Some(diff.clone()), + ..CompareOptions::default() + }, + )?; + assert_eq!(report.status, VisualStatus::Mismatch); + assert_eq!(report.changed_pixels, 2); + assert_eq!(report.total_pixels, 8); + assert_eq!(report.changed_ratio, 0.25); + assert!(diff.exists()); + std::fs::remove_dir_all(root)?; + Ok(()) +} + +#[test] +fn tolerance_and_dimension_mismatch_are_explicit() -> anyhow::Result<()> { + let root = temp_dir()?; + let reference = root.join("reference.png"); + let actual = root.join("actual.png"); + write_png(&reference, &[[100, 100, 100, 255]; 4], 2)?; + write_png(&actual, &[[102, 100, 100, 255]; 4], 2)?; + let tolerated = compare_png( + &reference, + &actual, + &CompareOptions { + channel_tolerance: 2, + ..CompareOptions::default() + }, + )?; + assert_eq!(tolerated.status, VisualStatus::Exact); + + write_png(&actual, &[[100, 100, 100, 255]; 6], 3)?; + let mismatch = compare_png(&reference, &actual, &CompareOptions::default())?; + assert_eq!(mismatch.status, VisualStatus::InvalidDimensions); + assert!(!mismatch.passed()); + std::fs::remove_dir_all(root)?; + Ok(()) +} diff --git a/crates/devup-mcp/Cargo.toml b/crates/devup-mcp/Cargo.toml new file mode 100644 index 0000000..121b5af --- /dev/null +++ b/crates/devup-mcp/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "devup-mcp" +description = "Rust-native MCP server for Figma to DevupUI workflows" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +base64.workspace = true +cap-std.workspace = true +devup-mcp-devup-ui = { path = "../devup-mcp-devup-ui" } +devup-mcp-figma = { path = "../devup-mcp-figma" } +dunce.workspace = true +rmcp.workspace = true +rand.workspace = true +schemars.workspace = true +serde.workspace = true +serde_json.workspace = true +sha2.workspace = true +tokio.workspace = true +tracing-subscriber.workspace = true + +[dev-dependencies] +axum.workspace = true +reqwest.workspace = true diff --git a/crates/devup-mcp/src/lib.rs b/crates/devup-mcp/src/lib.rs new file mode 100644 index 0000000..a1b7aa5 --- /dev/null +++ b/crates/devup-mcp/src/lib.rs @@ -0,0 +1,65 @@ +pub mod server; + +use std::{ffi::OsString, path::PathBuf}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ServerConfig { + pub allowed_write_roots: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum CliAction { + Version, + Serve(ServerConfig), +} + +pub fn parse_cli_args(arguments: I) -> anyhow::Result +where + I: IntoIterator, + T: Into, +{ + let mut arguments = arguments.into_iter().map(Into::into).peekable(); + let mut roots = Vec::new(); + while let Some(argument) = arguments.next() { + match argument.to_str() { + Some("--version" | "-V") if roots.is_empty() && arguments.peek().is_none() => { + return Ok(CliAction::Version); + } + Some("--allow-write-root") => { + let root = arguments.next().ok_or_else(|| { + anyhow::anyhow!("--allow-write-root에는 폴더 경로가 필요합니다.") + })?; + let root = PathBuf::from(root); + if !root.is_dir() { + anyhow::bail!("--allow-write-root는 존재하는 폴더여야 합니다."); + } + roots.push(root); + } + Some(flag) => anyhow::bail!("지원하지 않는 devup-mcp 인자입니다: {flag}"), + None => anyhow::bail!("devup-mcp 인자는 UTF-8 flag여야 합니다."), + } + } + if roots.is_empty() { + roots.push(std::env::current_dir()?); + } + Ok(CliAction::Serve(ServerConfig { + allowed_write_roots: roots, + })) +} + +pub async fn run_stdio() -> anyhow::Result<()> { + let CliAction::Serve(config) = parse_cli_args(std::iter::empty::())? else { + unreachable!("empty arguments always start the server") + }; + run_stdio_with_config(config).await +} + +pub async fn run_stdio_with_config(config: ServerConfig) -> anyhow::Result<()> { + use rmcp::ServiceExt; + + let service = server::DevupServer::production_with_output_roots(config.allowed_write_roots)? + .serve((tokio::io::stdin(), tokio::io::stdout())) + .await?; + service.waiting().await?; + Ok(()) +} diff --git a/crates/devup-mcp/src/main.rs b/crates/devup-mcp/src/main.rs new file mode 100644 index 0000000..f760a42 --- /dev/null +++ b/crates/devup-mcp/src/main.rs @@ -0,0 +1,21 @@ +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let action = devup_mcp::parse_cli_args(std::env::args_os().skip(1))?; + if action == devup_mcp::CliAction::Version { + println!("devup-mcp {}", env!("CARGO_PKG_VERSION")); + return Ok(()); + } + let devup_mcp::CliAction::Serve(config) = action else { + unreachable!("version action returned above") + }; + + tracing_subscriber::fmt() + .with_env_filter( + tracing_subscriber::EnvFilter::try_from_default_env() + .unwrap_or_else(|_| "devup_mcp=info".into()), + ) + .with_writer(std::io::stderr) + .init(); + + devup_mcp::run_stdio_with_config(config).await +} diff --git a/crates/devup-mcp/src/server/artifacts.rs b/crates/devup-mcp/src/server/artifacts.rs new file mode 100644 index 0000000..c643efa --- /dev/null +++ b/crates/devup-mcp/src/server/artifacts.rs @@ -0,0 +1,873 @@ +use std::{ + collections::BTreeMap, + future::Future, + sync::Arc, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD}; +use devup_mcp_figma::{ + AssetSelection, CollectedPayload, CollectionRequest, CollectionScope, DevupError, ErrorCode, + ExploreReadOptions, ResourceScope, SearchReadOptions, SectionReadOptions, SourcePolicy, +}; +use rand::Rng; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use sha2::{Digest, Sha256}; +use tokio::sync::{Mutex, OwnedMutexGuard, watch}; + +use super::delivery::{ProjectedOutput, RESOURCE_CHUNK_BYTES}; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ArtifactRequestKey { + file_key: String, + node_id: Option, + branch_key: Option, + scope: CollectionScope, + resource_scope: ResourceScope, + include_context: bool, + metadata_only: bool, + variables_only: bool, + search: Option, + explore: Option, + section: Option, + asset_selections: Vec, + reference_png: bool, + source_policy: SourcePolicy, +} + +impl ArtifactRequestKey { + pub fn from_collection(request: &CollectionRequest, source_policy: SourcePolicy) -> Self { + let mut section = request.section.clone(); + if let Some(section) = &mut section { + section.frame_ids.sort(); + section.frame_ids.dedup(); + } + let mut asset_selections = request.asset_selections.clone(); + asset_selections.sort_by(|left, right| { + (&left.asset_id, left.format, left.scale).cmp(&( + &right.asset_id, + right.format, + right.scale, + )) + }); + asset_selections.dedup(); + Self { + file_key: request.target.file_key.clone(), + node_id: request.target.node_id.clone(), + branch_key: request.target.branch_key.clone(), + scope: request.scope, + resource_scope: request.resource_scope, + include_context: request.include_context, + metadata_only: request.metadata_only, + variables_only: request.variables_only, + search: request.search.clone(), + explore: request.explore.clone(), + section, + asset_selections, + reference_png: request.reference_png, + source_policy, + } + } + + fn digest(&self) -> String { + sha256_hex(&serde_json::to_vec(self).unwrap_or_default()) + } + + fn capabilities(&self) -> ArtifactCapabilities { + let kind = if self.search.is_some() { + ArtifactKind::Search + } else if self.explore.is_some() { + ArtifactKind::Explore + } else if self + .section + .as_ref() + .is_some_and(|section| section.frame_ids.is_empty() && !section.all_screens) + { + ArtifactKind::SectionIndex + } else if self.variables_only { + ArtifactKind::ThemeOnly + } else { + ArtifactKind::Design + }; + ArtifactCapabilities { + kind, + collection_scope: self.scope, + resource_scope: self.resource_scope, + asset_capture_count: self.asset_selections.len(), + asset_captures: self.asset_selections.clone(), + reference_png: self.reference_png, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ArtifactKind { + Design, + ThemeOnly, + Search, + Explore, + SectionIndex, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ArtifactCapabilities { + pub kind: ArtifactKind, + pub collection_scope: CollectionScope, + pub resource_scope: ResourceScope, + pub asset_capture_count: usize, + pub reference_png: bool, + #[serde(skip)] + asset_captures: Vec, +} + +impl ArtifactCapabilities { + pub fn supports_asset_captures(&self, requested: &[AssetSelection]) -> bool { + requested + .iter() + .all(|capture| self.asset_captures.contains(capture)) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct ArtifactLimits { + pub ttl: Duration, + pub max_entries: usize, + pub max_entry_bytes: usize, + pub max_total_bytes: usize, +} + +impl Default for ArtifactLimits { + fn default() -> Self { + Self { + ttl: Duration::from_secs(10 * 60), + max_entries: 8, + max_entry_bytes: 32 * 1024 * 1024, + max_total_bytes: 128 * 1024 * 1024, + } + } +} + +pub trait ArtifactClock: Send + Sync { + fn now_epoch_seconds(&self) -> u64; +} + +#[derive(Debug)] +struct SystemClock; + +impl ArtifactClock for SystemClock { + fn now_epoch_seconds(&self) -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() + } +} + +#[derive(Debug, Clone)] +pub struct ArtifactLookup { + pub artifact_id: String, + pub content_hash: String, + pub created_at_epoch_seconds: u64, + pub expires_at_epoch_seconds: u64, + pub size_bytes: usize, + pub cache_hit: bool, + pub capabilities: ArtifactCapabilities, + pub payload: Arc, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ArtifactStoreStats { + pub entry_count: usize, + pub total_bytes: usize, + pub max_entries: usize, + pub max_total_bytes: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AttachedOutputManifest { + pub artifact_id: String, + pub output_id: String, + pub name: String, + pub mime_type: String, + pub raw_bytes: usize, + pub sha256: String, + pub chunk_count: usize, + pub chunk_bytes: usize, + pub is_binary: bool, + pub manifest_uri: String, + pub expires_at_epoch_seconds: u64, +} + +#[derive(Debug)] +struct AttachedOutput { + manifest: AttachedOutputManifest, + bytes: Arc<[u8]>, + ranges: Vec<(usize, usize)>, + allocation_bytes: usize, +} + +#[derive(Debug)] +struct Entry { + key_digest: String, + content_hash: String, + created_at: u64, + expires_at: u64, + size_bytes: usize, + last_access: u64, + capabilities: ArtifactCapabilities, + payload: Arc, + outputs: BTreeMap, + projections: BTreeMap>, +} + +type AcquisitionResult = Result; + +#[derive(Default)] +struct StoreState { + entries: BTreeMap, + key_index: BTreeMap, + in_flight: BTreeMap>>, + total_bytes: usize, + access_sequence: u64, +} + +#[derive(Clone)] +pub struct ArtifactStore { + state: Arc>, + clock: Arc, + limits: ArtifactLimits, +} + +pub struct OutputReservation { + state: Option>, + artifact_id: String, + projection_key: String, + staged: Vec, + manifests: Vec, + allocation: usize, + created: bool, + max_total_bytes: usize, +} + +impl OutputReservation { + pub fn manifests(&self) -> &[AttachedOutputManifest] { + &self.manifests + } + + pub fn commit(mut self) -> Vec { + let Some(mut state) = self.state.take() else { + return self.manifests; + }; + if !self.created { + return self.manifests; + } + while state.total_bytes.saturating_add(self.allocation) > self.max_total_bytes { + let lru_id = state + .entries + .iter() + .filter(|(id, _)| id.as_str() != self.artifact_id) + .min_by_key(|(_, entry)| entry.last_access) + .map(|(id, _)| id.clone()) + .expect("output reservation validated enough evictable capacity"); + remove_entry(&mut state, &lru_id); + } + state.access_sequence = state.access_sequence.saturating_add(1); + let access = state.access_sequence; + let entry = state + .entries + .get_mut(&self.artifact_id) + .expect("reserved artifact remains pinned by the store lock"); + entry.last_access = access; + entry.size_bytes = entry.size_bytes.saturating_add(self.allocation); + let ids = self + .staged + .iter() + .map(|output| output.manifest.output_id.clone()) + .collect::>(); + for output in self.staged.drain(..) { + entry + .outputs + .insert(output.manifest.output_id.clone(), output); + } + entry.projections.insert(self.projection_key, ids); + state.total_bytes = state.total_bytes.saturating_add(self.allocation); + self.manifests + } + + pub fn rollback(self) {} +} + +impl Default for ArtifactStore { + fn default() -> Self { + Self::with_limits(ArtifactLimits::default()) + } +} + +impl ArtifactStore { + pub fn with_limits(limits: ArtifactLimits) -> Self { + Self::with_clock(Arc::new(SystemClock), limits) + } + + pub fn with_clock(clock: Arc, limits: ArtifactLimits) -> Self { + Self { + state: Arc::new(Mutex::new(StoreState::default())), + clock, + limits, + } + } + + pub async fn get_or_acquire( + &self, + key: ArtifactRequestKey, + refresh: bool, + acquire: F, + ) -> Result + where + F: FnOnce() -> Fut, + Fut: Future>, + { + let key_digest = key.digest(); + let capabilities = key.capabilities(); + let (owner, mut receiver, sender) = { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + if !refresh && let Some(hit) = lookup_by_key(&mut state, &key_digest, true) { + return Ok(hit); + } + if let Some(receiver) = state.in_flight.get(&key_digest) { + (false, receiver.clone(), None) + } else { + let (sender, receiver) = watch::channel(None); + state.in_flight.insert(key_digest.clone(), receiver.clone()); + (true, receiver, Some(sender)) + } + }; + + if !owner { + receiver + .wait_for(Option::is_some) + .await + .map_err(|_| acquisition_cancelled())?; + let mut result = receiver + .borrow() + .clone() + .ok_or_else(acquisition_cancelled)?; + if let Ok(hit) = &mut result { + hit.cache_hit = true; + } + return result; + } + + let result = match acquire().await { + Ok(payload) => { + self.insert_with_digest(key_digest.clone(), capabilities, payload) + .await + } + Err(error) => Err(error), + }; + { + let mut state = self.state.lock().await; + state.in_flight.remove(&key_digest); + } + if let Some(sender) = sender { + let _ = sender.send(Some(result.clone())); + } + result + } + + pub async fn insert( + &self, + key: ArtifactRequestKey, + payload: CollectedPayload, + ) -> Result { + self.insert_with_digest(key.digest(), key.capabilities(), payload) + .await + } + + pub async fn get(&self, artifact_id: &str) -> Option { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + touch_entry(&mut state, artifact_id, true) + } + + pub async fn lookup(&self, key: &ArtifactRequestKey) -> Option { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + lookup_by_key(&mut state, &key.digest(), true) + } + + pub async fn stats(&self) -> ArtifactStoreStats { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + ArtifactStoreStats { + entry_count: state.entries.len(), + total_bytes: state.total_bytes, + max_entries: self.limits.max_entries, + max_total_bytes: self.limits.max_total_bytes, + } + } + + pub async fn attach_outputs( + &self, + artifact_id: &str, + projection_key: &str, + outputs: Vec, + ) -> Result, DevupError> { + Ok(self + .reserve_outputs(artifact_id, projection_key, outputs) + .await? + .commit()) + } + + pub async fn reserve_outputs( + &self, + artifact_id: &str, + projection_key: &str, + outputs: Vec, + ) -> Result { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.clone().lock_owned().await; + self.prune_expired(&mut state, now); + if let Some(ids) = state + .entries + .get(artifact_id) + .and_then(|entry| entry.projections.get(projection_key)) + .cloned() + { + let entry = state + .entries + .get(artifact_id) + .ok_or_else(resource_expired)?; + let manifests = ids + .iter() + .map(|id| { + entry + .outputs + .get(id) + .map(|output| output.manifest.clone()) + .ok_or_else(resource_expired) + }) + .collect::, _>>()?; + return Ok(OutputReservation { + state: Some(state), + artifact_id: artifact_id.to_owned(), + projection_key: projection_key.to_owned(), + staged: Vec::new(), + manifests, + allocation: 0, + created: false, + max_total_bytes: self.limits.max_total_bytes, + }); + } + let expires_at = state + .entries + .get(artifact_id) + .map(|entry| entry.expires_at) + .ok_or_else(resource_expired)?; + let mut staged = Vec::with_capacity(outputs.len()); + let mut staged_ids = BTreeMap::new(); + for output in outputs { + if output.name.is_empty() + || !output + .name + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_' | b'.')) + || output.mime_type.is_empty() + { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "resource output 이름 또는 MIME 형식이 올바르지 않습니다.", + false, + )); + } + let output_id = output.resource_id; + if !valid_output_id(&output_id) + || staged_ids.contains_key(&output_id) + || state + .entries + .get(artifact_id) + .is_some_and(|entry| entry.outputs.contains_key(&output_id)) + { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "resource output ID가 중복되었거나 올바르지 않습니다.", + true, + )); + } + staged_ids.insert(output_id.clone(), ()); + let raw_bytes = output.bytes.len(); + let ranges = output_chunk_ranges(&output.bytes, output.is_binary)?; + let encoded_bytes = if output.is_binary { + raw_bytes.div_ceil(3).saturating_mul(4) + } else { + 0 + }; + let allocation_bytes = raw_bytes.saturating_add(encoded_bytes); + let manifest_uri = + format!("devup://artifact/{artifact_id}/outputs/{output_id}/manifest"); + staged.push(AttachedOutput { + manifest: AttachedOutputManifest { + artifact_id: artifact_id.to_owned(), + output_id, + name: output.name, + mime_type: output.mime_type, + raw_bytes, + sha256: sha256_hex(&output.bytes), + chunk_count: ranges.len(), + chunk_bytes: RESOURCE_CHUNK_BYTES, + is_binary: output.is_binary, + manifest_uri, + expires_at_epoch_seconds: expires_at, + }, + bytes: Arc::from(output.bytes), + ranges, + allocation_bytes, + }); + } + let allocation = staged + .iter() + .try_fold(0_usize, |sum, output| { + sum.checked_add(output.allocation_bytes) + }) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "resource allocation 크기가 안전한 범위를 초과했습니다.", + false, + ) + })?; + let entry_size = state + .entries + .get(artifact_id) + .map(|entry| entry.size_bytes) + .ok_or_else(resource_expired)?; + if entry_size.saturating_add(allocation) > self.limits.max_entry_bytes + || allocation > self.limits.max_total_bytes + { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "resource output이 artifact 메모리 한도를 초과했습니다.", + false, + )); + } + let retained_bytes = state + .entries + .get(artifact_id) + .map(|entry| entry.size_bytes) + .ok_or_else(resource_expired)?; + if retained_bytes.saturating_add(allocation) > self.limits.max_total_bytes { + return Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "resource output이 전체 메모리 한도를 초과했습니다.", + false, + )); + } + let manifests = staged + .iter() + .map(|output| output.manifest.clone()) + .collect::>(); + Ok(OutputReservation { + state: Some(state), + artifact_id: artifact_id.to_owned(), + projection_key: projection_key.to_owned(), + staged, + manifests, + allocation, + created: true, + max_total_bytes: self.limits.max_total_bytes, + }) + } + + pub async fn detach_projection(&self, artifact_id: &str, projection_key: &str) -> bool { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + let removed_allocation = { + let Some(entry) = state.entries.get_mut(artifact_id) else { + return false; + }; + let Some(ids) = entry.projections.remove(projection_key) else { + return false; + }; + let allocation = ids + .into_iter() + .filter_map(|id| entry.outputs.remove(&id)) + .map(|output| output.allocation_bytes) + .sum::(); + entry.size_bytes = entry.size_bytes.saturating_sub(allocation); + allocation + }; + state.total_bytes = state.total_bytes.saturating_sub(removed_allocation); + true + } + + pub async fn read_output_chunk( + &self, + artifact_id: &str, + output_id: &str, + index: usize, + ) -> Option> { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + state.access_sequence = state.access_sequence.saturating_add(1); + let access = state.access_sequence; + let entry = state.entries.get_mut(artifact_id)?; + entry.last_access = access; + let output = entry.outputs.get(output_id)?; + let (start, end) = *output.ranges.get(index)?; + Some(output.bytes[start..end].to_vec()) + } + + pub async fn output_manifest( + &self, + artifact_id: &str, + output_id: &str, + ) -> Option { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + state.access_sequence = state.access_sequence.saturating_add(1); + let access = state.access_sequence; + let entry = state.entries.get_mut(artifact_id)?; + entry.last_access = access; + entry + .outputs + .get(output_id) + .map(|output| output.manifest.clone()) + } + + pub async fn output_manifests(&self) -> Vec { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + state + .entries + .values() + .flat_map(|entry| entry.outputs.values()) + .map(|output| output.manifest.clone()) + .collect() + } + + async fn insert_with_digest( + &self, + key_digest: String, + mut capabilities: ArtifactCapabilities, + payload: CollectedPayload, + ) -> Result { + if payload.metadata.get("sectionIndex").is_some() + && payload.metadata.get("selectedRootIds").is_none() + { + capabilities.kind = ArtifactKind::SectionIndex; + } + let bytes = serde_json::to_vec(&payload).map_err(|error| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("Figma artifact를 직렬화할 수 없습니다: {error}"), + false, + ) + })?; + if bytes.len() > self.limits.max_entry_bytes + || bytes.len() > self.limits.max_total_bytes + || self.limits.max_entries == 0 + { + return Err(DevupError::with_details( + ErrorCode::DevupFigmaResponseTooLarge, + "Figma artifact가 메모리 캐시 한도를 초과했습니다.", + false, + json!({"artifactBytes": bytes.len()}), + )); + } + let now = self.clock.now_epoch_seconds(); + let content_hash = sha256_hex(&bytes); + let payload = Arc::new(payload); + let mut state = self.state.lock().await; + self.prune_expired(&mut state, now); + if let Some(previous_id) = state.key_index.remove(&key_digest) { + remove_entry(&mut state, &previous_id); + } + while state.entries.len() >= self.limits.max_entries + || state.total_bytes.saturating_add(bytes.len()) > self.limits.max_total_bytes + { + let Some(lru_id) = state + .entries + .iter() + .min_by_key(|(_, entry)| entry.last_access) + .map(|(id, _)| id.clone()) + else { + break; + }; + remove_entry(&mut state, &lru_id); + } + state.access_sequence = state.access_sequence.saturating_add(1); + let last_access = state.access_sequence; + let artifact_id = unique_id(&state.entries); + let expires_at = now.saturating_add(self.limits.ttl.as_secs()); + state.total_bytes = state.total_bytes.saturating_add(bytes.len()); + state + .key_index + .insert(key_digest.clone(), artifact_id.clone()); + state.entries.insert( + artifact_id.clone(), + Entry { + key_digest, + content_hash: content_hash.clone(), + created_at: now, + expires_at, + size_bytes: bytes.len(), + last_access, + capabilities: capabilities.clone(), + payload: payload.clone(), + outputs: BTreeMap::new(), + projections: BTreeMap::new(), + }, + ); + Ok(ArtifactLookup { + artifact_id, + content_hash, + created_at_epoch_seconds: now, + expires_at_epoch_seconds: expires_at, + size_bytes: bytes.len(), + cache_hit: false, + capabilities, + payload, + }) + } + + fn prune_expired(&self, state: &mut StoreState, now: u64) { + let ids = state + .entries + .iter() + .filter_map(|(id, entry)| (entry.expires_at <= now).then_some(id.clone())) + .collect::>(); + for id in ids { + remove_entry(state, &id); + } + } +} + +fn lookup_by_key( + state: &mut StoreState, + key_digest: &str, + cache_hit: bool, +) -> Option { + let artifact_id = state.key_index.get(key_digest)?.clone(); + touch_entry(state, &artifact_id, cache_hit) +} + +fn touch_entry( + state: &mut StoreState, + artifact_id: &str, + cache_hit: bool, +) -> Option { + state.access_sequence = state.access_sequence.saturating_add(1); + let last_access = state.access_sequence; + let entry = state.entries.get_mut(artifact_id)?; + entry.last_access = last_access; + Some(ArtifactLookup { + artifact_id: artifact_id.to_owned(), + content_hash: entry.content_hash.clone(), + created_at_epoch_seconds: entry.created_at, + expires_at_epoch_seconds: entry.expires_at, + size_bytes: entry.size_bytes, + cache_hit, + capabilities: entry.capabilities.clone(), + payload: entry.payload.clone(), + }) +} + +fn remove_entry(state: &mut StoreState, artifact_id: &str) { + if let Some(entry) = state.entries.remove(artifact_id) { + state.total_bytes = state.total_bytes.saturating_sub(entry.size_bytes); + if state.key_index.get(&entry.key_digest) == Some(&artifact_id.to_owned()) { + state.key_index.remove(&entry.key_digest); + } + } +} + +fn unique_id(entries: &BTreeMap) -> String { + loop { + let mut bytes = [0_u8; 32]; + rand::rng().fill_bytes(&mut bytes); + let id = URL_SAFE_NO_PAD.encode(bytes); + if !entries.contains_key(&id) { + return id; + } + } +} + +fn valid_output_id(value: &str) -> bool { + value.len() == 22 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_')) +} + +fn output_chunk_ranges(bytes: &[u8], is_binary: bool) -> Result, DevupError> { + let text = (!is_binary) + .then(|| std::str::from_utf8(bytes)) + .transpose() + .map_err(|_| { + DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "text resource output은 UTF-8이어야 합니다.", + false, + ) + })?; + if bytes.is_empty() { + return Ok(vec![(0, 0)]); + } + let mut ranges = Vec::new(); + let mut start = 0; + while start < bytes.len() { + let mut end = start.saturating_add(RESOURCE_CHUNK_BYTES).min(bytes.len()); + if let Some(text) = text { + while end > start && !text.is_char_boundary(end) { + end -= 1; + } + if end == start { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "text resource chunk 경계를 계산할 수 없습니다.", + false, + )); + } + } + ranges.push((start, end)); + start = end; + } + Ok(ranges) +} + +fn sha256_hex(bytes: &[u8]) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +fn acquisition_cancelled() -> DevupError { + DevupError::new( + ErrorCode::DevupFigmaDirectUnavailable, + "동일 Figma artifact 수집이 완료되기 전에 취소되었습니다.", + true, + ) +} + +fn resource_expired() -> DevupError { + DevupError::new( + ErrorCode::DevupFigmaHandoffExpired, + "resource artifact가 없거나 만료되었습니다.", + true, + ) +} diff --git a/crates/devup-mcp/src/server/delivery.rs b/crates/devup-mcp/src/server/delivery.rs new file mode 100644 index 0000000..3e89ba8 --- /dev/null +++ b/crates/devup-mcp/src/server/delivery.rs @@ -0,0 +1,236 @@ +use std::str::FromStr; + +use base64::{ + Engine as _, + engine::general_purpose::{STANDARD, URL_SAFE_NO_PAD}, +}; +use devup_mcp_figma::{DevupError, ErrorCode}; +use rand::Rng; +use rmcp::model::{CallToolResult, ContentBlock, MetaObject, Resource}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +pub const MAX_INLINE_OUTPUT_BYTES: usize = 256 * 1024; +pub const MAX_INLINE_TOTAL_BYTES: usize = 1024 * 1024; +pub const RESOURCE_CHUNK_BYTES: usize = 256 * 1024; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +pub enum DeliveryMode { + #[default] + Auto, + Inline, + Resource, +} + +impl FromStr for DeliveryMode { + type Err = DevupError; + + fn from_str(value: &str) -> Result { + match value { + "auto" => Ok(Self::Auto), + "inline" => Ok(Self::Inline), + "resource" => Ok(Self::Resource), + _ => Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "delivery는 auto, inline 또는 resource여야 합니다.", + false, + )), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ProjectedOutput { + pub name: String, + pub mime_type: String, + pub bytes: Vec, + pub is_binary: bool, + pub(crate) resource_id: String, + pub(crate) asset_id: Option, +} + +impl ProjectedOutput { + pub fn text(name: impl Into, mime_type: impl Into, bytes: Vec) -> Self { + Self { + name: name.into(), + mime_type: mime_type.into(), + bytes, + is_binary: false, + resource_id: random_resource_id(), + asset_id: None, + } + } + + pub fn binary(name: impl Into, mime_type: impl Into, bytes: Vec) -> Self { + Self { + name: name.into(), + mime_type: mime_type.into(), + bytes, + is_binary: true, + resource_id: random_resource_id(), + asset_id: None, + } + } + + pub(crate) fn asset( + name: impl Into, + mime_type: impl Into, + bytes: Vec, + asset_id: impl Into, + ) -> Self { + Self { + name: name.into(), + mime_type: mime_type.into(), + bytes, + is_binary: true, + resource_id: random_resource_id(), + asset_id: Some(asset_id.into()), + } + } + + pub(crate) fn manifest_uri(&self, artifact_id: &str) -> String { + format!( + "devup://artifact/{artifact_id}/outputs/{}/manifest", + self.resource_id + ) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct DeliveryDecision { + pub inline: bool, +} + +pub fn choose_delivery( + mode: DeliveryMode, + outputs: &[ProjectedOutput], +) -> Result { + let total_bytes = outputs.iter().try_fold(0_usize, |total, output| { + total.checked_add(output.bytes.len()).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "생성 output 크기가 안전한 범위를 초과했습니다.", + false, + ) + }) + })?; + let every_output_inline = outputs.iter().try_fold(true, |within_limit, output| { + let wire_bytes = projected_output_wire_bytes(output)?; + Ok::<_, DevupError>(within_limit && wire_bytes <= MAX_INLINE_OUTPUT_BYTES) + })?; + match mode { + DeliveryMode::Auto => Ok(DeliveryDecision { + inline: every_output_inline && total_bytes <= MAX_INLINE_TOTAL_BYTES, + }), + DeliveryMode::Inline if total_bytes > MAX_INLINE_TOTAL_BYTES => Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "inline output이 1 MiB 상한을 초과했습니다. delivery=auto 또는 resource를 사용하세요.", + false, + )), + DeliveryMode::Inline => Ok(DeliveryDecision { inline: true }), + DeliveryMode::Resource => Ok(DeliveryDecision { inline: false }), + } +} + +fn projected_output_wire_bytes(output: &ProjectedOutput) -> Result { + let value = if output.is_binary { + serde_json::json!({ + "output": { + "mimeType": output.mime_type, + "dataBase64": STANDARD.encode(&output.bytes) + } + }) + } else { + let text = std::str::from_utf8(&output.bytes).map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "inline text output은 UTF-8이어야 합니다.", + false, + ) + })?; + serde_json::json!({"output": text}) + }; + serde_json::to_vec(&CallToolResult::structured(value)) + .map(|bytes| bytes.len()) + .map_err(|error| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("MCP output 크기를 계산할 수 없습니다: {error}"), + false, + ) + }) +} + +pub fn choose_delivery_for_result( + mode: DeliveryMode, + result: &Value, + outputs: &[ProjectedOutput], +) -> Result { + let projected = choose_delivery(mode, outputs)?; + let wire_bytes = serde_json::to_vec(&CallToolResult::structured(result.clone())) + .map_err(|error| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("MCP tool response 크기를 계산할 수 없습니다: {error}"), + false, + ) + })? + .len(); + match mode { + DeliveryMode::Auto => Ok(DeliveryDecision { + inline: projected.inline && wire_bytes <= MAX_INLINE_TOTAL_BYTES, + }), + DeliveryMode::Inline if wire_bytes > MAX_INLINE_TOTAL_BYTES => Err(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "직렬화된 inline MCP response가 1 MiB 상한을 초과했습니다. delivery=auto 또는 resource를 사용하세요.", + false, + )), + DeliveryMode::Inline => Ok(DeliveryDecision { inline: true }), + DeliveryMode::Resource => Ok(DeliveryDecision { inline: false }), + } +} + +pub fn tool_result(value: Value) -> CallToolResult { + let links = value + .get("resources") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(|summary| { + let uri = summary.get("uri")?.as_str()?; + let name = summary.get("name")?.as_str()?; + let mime_type = summary.get("mimeType")?.as_str()?; + let size = summary.get("size")?.as_u64()?; + let mut meta = MetaObject::new(); + if let Some(hash) = summary.get("contentHash").and_then(Value::as_str) { + meta.0.insert("payloadSha256".to_owned(), Value::from(hash)); + } + meta.0 + .insert("payloadMimeType".to_owned(), Value::from(mime_type)); + meta.0.insert("payloadBytes".to_owned(), Value::from(size)); + if let Some(expires_at) = summary.get("expiresAt").and_then(Value::as_str) { + meta.0 + .insert("expiresAt".to_owned(), Value::from(expires_at)); + } + Some(ContentBlock::resource_link( + Resource::new(uri, name) + .with_title(format!("Devup {name} output")) + .with_description( + "Generated Devup output; read the linked manifest for bounded chunks", + ) + .with_mime_type("application/json") + .with_meta(meta), + )) + }) + .collect::>(); + let mut result = CallToolResult::structured(value); + result.content.extend(links); + result +} + +fn random_resource_id() -> String { + let mut bytes = [0_u8; 16]; + rand::rng().fill_bytes(&mut bytes); + URL_SAFE_NO_PAD.encode(bytes) +} diff --git a/crates/devup-mcp/src/server/handoff.rs b/crates/devup-mcp/src/server/handoff.rs new file mode 100644 index 0000000..11deb85 --- /dev/null +++ b/crates/devup-mcp/src/server/handoff.rs @@ -0,0 +1,367 @@ +use std::{ + collections::BTreeMap, + sync::Arc, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD}; +use devup_mcp_devup_ui::codegen::RootLayout; +use devup_mcp_figma::{ + CollectedParts, CollectorSession, CollectorStep, DevupError, ErrorCode, UpstreamResult, +}; +use rand::Rng; +use serde::Serialize; +use serde_json::{Value, json}; +use tokio::sync::Mutex; + +use super::{artifacts::ArtifactRequestKey, delivery::DeliveryMode}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PendingOperation { + Collect, + Artifact { + operation: Box, + artifact_key: ArtifactRequestKey, + }, + ToUi { + component_name: Option, + include_diagnostics: bool, + root_layout: RootLayout, + output_path: Option, + delivery: DeliveryMode, + }, + ToJson { + scope: String, + include_diagnostics: bool, + output_path: Option, + delivery: DeliveryMode, + }, + Export { + outputs: Vec, + component_name: Option, + include_diagnostics: bool, + root_layout: RootLayout, + scope: String, + strict: bool, + output_paths: BTreeMap, + frame_ids: Vec, + all_screens: bool, + asset_captures: Vec, + asset_output_paths: BTreeMap, + delivery: DeliveryMode, + }, + Search { + query: String, + node_types: Vec, + match_kind: String, + limit: usize, + }, + Explore { + limit: usize, + }, +} + +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HandoffCall { + pub call_id: String, + pub server: &'static str, + pub tool: &'static str, + pub arguments: Value, +} + +#[derive(Debug)] +pub enum HandoffStep { + NeedsFigma { + session_id: String, + expires_at_epoch_seconds: u64, + calls: Vec, + }, + Complete { + operation: PendingOperation, + parts: Box, + }, +} + +#[derive(Debug, Clone, Copy)] +pub struct HandoffLimits { + pub ttl: Duration, + pub max_sessions: usize, + pub max_result_bytes: usize, + pub max_total_bytes: usize, +} + +impl Default for HandoffLimits { + fn default() -> Self { + Self { + ttl: Duration::from_secs(10 * 60), + max_sessions: 8, + max_result_bytes: 16 * 1024 * 1024, + max_total_bytes: 64 * 1024 * 1024, + } + } +} + +pub trait Clock: Send + Sync { + fn now_epoch_seconds(&self) -> u64; +} + +#[derive(Debug)] +struct SystemClock; + +impl Clock for SystemClock { + fn now_epoch_seconds(&self) -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() + } +} + +struct Session { + operation: PendingOperation, + collector: CollectorSession, + expires_at: u64, + result_bytes: usize, + pending: BTreeMap, +} + +#[derive(Default)] +struct StoreState { + sessions: BTreeMap, + total_result_bytes: usize, +} + +#[derive(Clone)] +pub struct HandoffStore { + state: Arc>, + clock: Arc, + limits: HandoffLimits, +} + +impl Default for HandoffStore { + fn default() -> Self { + Self::with_limits(HandoffLimits::default()) + } +} + +impl HandoffStore { + pub fn with_limits(limits: HandoffLimits) -> Self { + Self::with_clock(Arc::new(SystemClock), limits) + } + + pub fn with_clock(clock: Arc, limits: HandoffLimits) -> Self { + Self { + state: Arc::new(Mutex::new(StoreState::default())), + clock, + limits, + } + } + + pub async fn begin( + &self, + operation: PendingOperation, + collector: CollectorSession, + ) -> Result { + self.begin_with_artifact(operation, collector, None).await + } + + pub async fn begin_with_artifact( + &self, + operation: PendingOperation, + collector: CollectorSession, + artifact_key: Option, + ) -> Result { + let operation = artifact_key.map_or(operation.clone(), |artifact_key| { + PendingOperation::Artifact { + operation: Box::new(operation), + artifact_key, + } + }); + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + prune_expired(&mut state, now); + if state.sessions.len() >= self.limits.max_sessions { + return Err(too_large( + "동시에 유지할 수 있는 Figma handoff session 수를 초과했습니다.", + )); + } + let session_id = unique_id(&state.sessions); + state.sessions.insert( + session_id.clone(), + Session { + operation, + collector, + expires_at: now.saturating_add(self.limits.ttl.as_secs()), + result_bytes: 0, + pending: BTreeMap::new(), + }, + ); + Ok(session_id) + } + + pub async fn next(&self, session_id: &str) -> Result { + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + let mut session = take_session(&mut state, session_id, now)?; + + loop { + match session.collector.advance() { + Ok(CollectorStep::Call(planned)) => { + let call_id = random_id(); + let handoff_call = HandoffCall { + call_id: call_id.clone(), + server: "figma", + tool: planned.call.tool_name(), + arguments: Value::Object(planned.call.arguments()), + }; + session.pending.insert(call_id, (planned.id, handoff_call)); + } + Ok(CollectorStep::AwaitingResults) => { + let calls = session + .pending + .values() + .map(|(_, call)| call.clone()) + .collect(); + let expires_at_epoch_seconds = session.expires_at; + put_session(&mut state, session_id.to_owned(), session); + return Ok(HandoffStep::NeedsFigma { + session_id: session_id.to_owned(), + expires_at_epoch_seconds, + calls, + }); + } + Ok(CollectorStep::Complete(parts)) => { + return Ok(HandoffStep::Complete { + operation: session.operation, + parts, + }); + } + Err(error) => return Err(error), + } + } + } + + pub async fn accept( + &self, + session_id: &str, + call_id: &str, + result: Value, + ) -> Result<(), DevupError> { + let encoded_len = serde_json::to_vec(&result) + .map_err(|_| invalid("Figma handoff result를 JSON으로 읽을 수 없습니다."))? + .len(); + if encoded_len > self.limits.max_result_bytes { + self.remove(session_id).await; + return Err(too_large( + "Figma handoff result의 허용 크기를 초과했습니다.", + )); + } + + let now = self.clock.now_epoch_seconds(); + let mut state = self.state.lock().await; + if state.total_result_bytes.saturating_add(encoded_len) > self.limits.max_total_bytes { + if let Some(session) = state.sessions.remove(session_id) { + state.total_result_bytes = state + .total_result_bytes + .saturating_sub(session.result_bytes); + } + return Err(too_large( + "Figma handoff result의 전체 메모리 한도를 초과했습니다.", + )); + } + let mut session = take_session(&mut state, session_id, now)?; + let Some((collector_call_id, _)) = session.pending.remove(call_id) else { + return Err(invalid( + "알 수 없거나 이미 처리한 Figma handoff call ID입니다.", + )); + }; + session + .collector + .accept(&collector_call_id, UpstreamResult { raw: result })?; + session.result_bytes = session.result_bytes.saturating_add(encoded_len); + put_session(&mut state, session_id.to_owned(), session); + Ok(()) + } + + pub async fn remove(&self, session_id: &str) { + let mut state = self.state.lock().await; + if let Some(session) = state.sessions.remove(session_id) { + state.total_result_bytes = state + .total_result_bytes + .saturating_sub(session.result_bytes); + } + } +} + +fn take_session(state: &mut StoreState, session_id: &str, now: u64) -> Result { + let Some(session) = state.sessions.remove(session_id) else { + return Err(invalid("존재하지 않는 Figma handoff session입니다.")); + }; + state.total_result_bytes = state + .total_result_bytes + .saturating_sub(session.result_bytes); + if session.expires_at <= now { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffExpired, + "Figma handoff session이 만료되었습니다.", + true, + )); + } + Ok(session) +} + +fn put_session(state: &mut StoreState, session_id: String, session: Session) { + state.total_result_bytes = state + .total_result_bytes + .saturating_add(session.result_bytes); + state.sessions.insert(session_id, session); +} + +fn prune_expired(state: &mut StoreState, now: u64) { + let expired = state + .sessions + .iter() + .filter_map(|(id, session)| (session.expires_at <= now).then_some(id.clone())) + .collect::>(); + for id in expired { + if let Some(session) = state.sessions.remove(&id) { + state.total_result_bytes = state + .total_result_bytes + .saturating_sub(session.result_bytes); + } + } +} + +fn unique_id(sessions: &BTreeMap) -> String { + loop { + let id = random_id(); + if !sessions.contains_key(&id) { + return id; + } + } +} + +fn random_id() -> String { + let mut bytes = [0_u8; 32]; + rand::rng().fill_bytes(&mut bytes); + URL_SAFE_NO_PAD.encode(bytes) +} + +fn invalid(message: &str) -> DevupError { + DevupError::with_details( + ErrorCode::DevupFigmaHandoffInvalid, + message, + false, + json!({"source": "host"}), + ) +} + +fn too_large(message: &str) -> DevupError { + DevupError::with_details( + ErrorCode::DevupFigmaResponseTooLarge, + message, + false, + json!({"source": "host"}), + ) +} diff --git a/crates/devup-mcp/src/server/mod.rs b/crates/devup-mcp/src/server/mod.rs new file mode 100644 index 0000000..5e2804b --- /dev/null +++ b/crates/devup-mcp/src/server/mod.rs @@ -0,0 +1,823 @@ +pub mod artifacts; +pub mod delivery; +pub mod handoff; +pub mod output; +mod projection; +mod quality; +pub mod resources; +mod tools; +mod validation; + +use std::sync::Arc; + +use async_trait::async_trait; +use rmcp::{ + ErrorData, RoleServer, ServerHandler, + handler::server::{router::tool::ToolRouter, wrapper::Parameters}, + model::{ + CallToolResult, ErrorCode as McpErrorCode, JsonObject, ServerCapabilities, ServerInfo, + }, + service::RequestContext, + tool, tool_handler, tool_router, +}; +use serde_json::{Value, json}; + +use devup_mcp_devup_ui::theme::ThemeScope; +use devup_mcp_figma::{ + AuthStatus, CollectedParts, CollectedPayload, CollectionRequest, CollectionScope, + CollectorSession, CollectorStep, CredentialStore, DevupError, ErrorCode, ExploreCandidate, + ExploreKind, ExploreNode, ExploreReadOptions, FigmaTarget, FigmaUpstream, + KeyringCredentialStore, OAuthManager, RemoteFigmaClient, ResourceScope, SearchReadOptions, + SectionCandidate, SectionIndex, SectionReadOptions, SourcePolicy, SystemBrowser, + fallback_allowed_for_error, +}; + +use artifacts::{ArtifactKind, ArtifactRequestKey, ArtifactStore}; +use delivery::{DeliveryMode, tool_result}; +use handoff::{HandoffStep, HandoffStore, PendingOperation}; +use output::OutputPolicy; +use projection::complete_operation; +use validation::{ + parse_asset_requests, parse_collection_scope, parse_root_layout, parse_source_policy, + validate_artifact_projection, validate_outputs, +}; + +pub use tools::{ + AuthInput, ContinueInput, FigmaAssetRequestInput, FigmaExploreInput, FigmaExportInput, + FigmaSearchInput, FigmaToJsonInput, FigmaToUiInput, +}; + +const FIGMA_ENDPOINT: &str = "https://mcp.figma.com/mcp"; + +#[async_trait] +pub trait DevupAuth: Send + Sync { + async fn status(&self) -> Result; + async fn login(&self) -> Result; + async fn logout(&self) -> Result; +} + +#[async_trait] +impl DevupAuth for OAuthManager { + async fn status(&self) -> Result { + OAuthManager::status(self).await + } + + async fn login(&self) -> Result { + OAuthManager::login(self, &SystemBrowser).await?; + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + OAuthManager::logout(self).await?; + Ok(AuthStatus::Disconnected) + } +} + +#[derive(Clone)] +pub struct Services { + auth: Arc, + upstream: Arc, +} + +impl Services { + pub fn new(auth: Arc, upstream: Arc) -> Self { + Self { auth, upstream } + } + + fn production() -> Self { + let oauth = OAuthManager::with_endpoint(FIGMA_ENDPOINT, KeyringCredentialStore); + let upstream = RemoteFigmaClient::new(oauth.clone()); + Self::new(Arc::new(oauth), Arc::new(upstream)) + } +} + +#[derive(Clone)] +pub struct DevupServer { + tool_router: ToolRouter, + services: Services, + handoffs: HandoffStore, + artifacts: ArtifactStore, + output_policy: OutputPolicy, +} + +impl DevupServer { + pub fn new(services: Services) -> Self { + Self::with_output_roots( + services, + vec![std::env::current_dir().expect("devup-mcp current directory")], + ) + .expect("devup-mcp output root") + } + + pub fn with_output_roots( + services: Services, + roots: Vec, + ) -> Result { + Ok(Self { + tool_router: Self::tool_router(), + services, + handoffs: HandoffStore::default(), + artifacts: ArtifactStore::default(), + output_policy: OutputPolicy::from_roots(roots)?, + }) + } + + pub fn production_with_output_roots( + roots: Vec, + ) -> Result { + Self::with_output_roots(Services::production(), roots) + } +} + +impl Default for DevupServer { + fn default() -> Self { + Self::new(Services::production()) + } +} + +impl DevupServer { + async fn start_operation( + &self, + operation: PendingOperation, + request: CollectionRequest, + policy: SourcePolicy, + refresh: bool, + ) -> Result { + let artifact_key = ArtifactRequestKey::from_collection(&request, policy); + if !refresh && let Some(artifact) = self.artifacts.lookup(&artifact_key).await { + return complete_operation( + operation, + &artifact.payload, + "artifact", + &artifact, + &self.output_policy, + &self.artifacts, + ) + .await; + } + if policy == SourcePolicy::Host { + return self.begin_handoff(operation, request, artifact_key).await; + } + + let auth_status = self.services.auth.status().await?; + if auth_status == AuthStatus::Disconnected { + if policy == SourcePolicy::Auto { + return self.begin_handoff(operation, request, artifact_key).await; + } + return Err(DevupError::with_details( + ErrorCode::DevupAuthRequired, + "Figma direct 연결을 사용하려면 devup_figma_auth login이 필요합니다.", + false, + json!({"source": "direct"}), + )); + } + + match self + .artifacts + .get_or_acquire(artifact_key.clone(), refresh, || async { + CollectedPayload::try_from(self.run_direct(request.clone()).await?) + }) + .await + { + Ok(artifact) => { + complete_operation( + operation, + &artifact.payload, + "direct", + &artifact, + &self.output_policy, + &self.artifacts, + ) + .await + } + Err(error) if fallback_allowed_for_error(policy, &error) => { + self.begin_handoff(operation, request, artifact_key).await + } + Err(error) => Err(error), + } + } + + async fn run_direct(&self, request: CollectionRequest) -> Result { + let mut collector = CollectorSession::new(request); + loop { + match collector.advance()? { + CollectorStep::Call(planned) => { + let call_id = planned.id.clone(); + match self.services.upstream.call_read_tool(planned.call).await { + Ok(result) => collector.accept(&call_id, result)?, + Err(error) if collector.reject(&call_id, &error)? => continue, + Err(error) => return Err(error), + } + } + CollectorStep::AwaitingResults => continue, + CollectorStep::Complete(parts) => return Ok(*parts), + } + } + } + + async fn begin_handoff( + &self, + operation: PendingOperation, + request: CollectionRequest, + artifact_key: ArtifactRequestKey, + ) -> Result { + let session_id = self + .handoffs + .begin_with_artifact( + operation, + CollectorSession::new(request), + Some(artifact_key), + ) + .await?; + let step = self.handoffs.next(&session_id).await?; + self.handoff_step_to_value(step, "host").await + } + + async fn handoff_step_to_value( + &self, + step: HandoffStep, + source: &str, + ) -> Result { + match step { + HandoffStep::NeedsFigma { + session_id, + expires_at_epoch_seconds, + calls, + } => Ok(json!({ + "status": "needs_figma", + "sessionId": session_id, + "expiresAt": format_epoch_rfc3339(expires_at_epoch_seconds), + "calls": calls, + "resumeTool": "devup_figma_continue" + })), + HandoffStep::Complete { operation, parts } => { + let PendingOperation::Artifact { + operation, + artifact_key, + } = operation + else { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "Figma handoff artifact key가 없습니다.", + false, + )); + }; + let payload = CollectedPayload::try_from(*parts)?; + let artifact = self.artifacts.insert(artifact_key, payload).await?; + complete_operation( + *operation, + &artifact.payload, + source, + &artifact, + &self.output_policy, + &self.artifacts, + ) + .await + } + } + } +} + +/// Every `devup_figma_*` tool response is a JSON object whose exact shape +/// varies per operation, `status`, and `delivery` mode (see README). Rather +/// than pin a schema per branch that would need constant re-syncing, this +/// declares only what the MCP spec requires of `outputSchema` — root type +/// `object` (SEP-2106) — with no constraint on properties. +/// +/// This replaces `schema_for_output::()`, whose root +/// schema had no `type` field at all: schemars maps `Value` to the boolean +/// JSON Schema `true`, and `into_root_schema_for` normalizes that to the +/// empty object `{}` before `outputSchema` strips `title`/`description`, +/// leaving a schema that satisfies "is an object" as a JSON value but not +/// the MCP-mandated `"type": "object"` marker. +fn permissive_object_output_schema() -> Arc { + let mut schema = JsonObject::new(); + schema.insert("type".to_owned(), json!("object")); + Arc::new(schema) +} + +#[tool_router] +impl DevupServer { + #[tool( + description = "Check, start, or clear Figma Remote MCP OAuth", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_auth( + &self, + Parameters(input): Parameters, + ) -> Result { + let status = match input.action.as_str() { + "status" => self.services.auth.status().await, + "login" => self.services.auth.login().await, + "logout" => self.services.auth.logout().await, + _ => { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupAuthRequired, + "action은 status, login 또는 logout이어야 합니다.", + false, + ))); + } + } + .map_err(to_mcp_error)?; + Ok(tool_result(json!({ "status": status }))) + } + + #[tool( + description = "Convert a Figma design link to deterministic DevupUI TypeScript", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_to_ui( + &self, + Parameters(input): Parameters, + ) -> Result { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + target.node_id.as_ref().ok_or_else(|| { + to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "UI 변환 링크에는 node-id가 필요합니다.", + false, + )) + })?; + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let scope = parse_collection_scope(&input.scope).map_err(to_mcp_error)?; + let root_layout = parse_root_layout(&input.root_layout).map_err(to_mcp_error)?; + let delivery = input + .delivery + .parse::() + .map_err(to_mcp_error)?; + let mut request = CollectionRequest::new(target, scope); + request.resource_scope = ResourceScope::Used; + let result = self + .start_operation( + PendingOperation::ToUi { + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + root_layout, + output_path: input.output_path, + delivery, + }, + request, + policy, + false, + ) + .await + .map_err(to_mcp_error)?; + Ok(tool_result(result)) + } + + #[tool( + description = "Convert Figma variables and styles to deterministic devup.json", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_to_json( + &self, + Parameters(input): Parameters, + ) -> Result { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + parse_scope(&input.scope).map_err(to_mcp_error)?; + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let collection_scope = parse_collection_scope(&input.scope).map_err(to_mcp_error)?; + let delivery = input + .delivery + .parse::() + .map_err(to_mcp_error)?; + let mut request = CollectionRequest::new(target, collection_scope); + if collection_scope == CollectionScope::File { + request.resource_scope = ResourceScope::File; + request.variables_only = true; + } else { + request.resource_scope = ResourceScope::Used; + } + let result = self + .start_operation( + PendingOperation::ToJson { + scope: input.scope, + include_diagnostics: input.include_diagnostics, + output_path: input.output_path, + delivery, + }, + request, + policy, + false, + ) + .await + .map_err(to_mcp_error)?; + Ok(tool_result(result)) + } + + #[tool( + description = "Search Figma pages, sections, frames, and components by name", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_search( + &self, + Parameters(input): Parameters, + ) -> Result { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let mut request = CollectionRequest::new(target, CollectionScope::File); + request.search = Some(SearchReadOptions { + query: input.query.clone(), + node_types: input.node_types.clone(), + match_kind: input.match_kind.clone(), + limit: input.limit, + }); + let result = self + .start_operation( + PendingOperation::Search { + query: input.query, + node_types: input.node_types, + match_kind: input.match_kind, + limit: input.limit, + }, + request, + policy, + false, + ) + .await + .map_err(to_mcp_error)?; + Ok(tool_result(result)) + } + + #[tool( + description = "Explore screen candidates spatially related to a linked Figma node", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_explore( + &self, + Parameters(input): Parameters, + ) -> Result { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + target.node_id.as_ref().ok_or_else(|| { + to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma 주변 화면 탐색에는 node-id가 필요합니다.", + false, + )) + })?; + if !(1..=100).contains(&input.limit) { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaResponseTooLarge, + "탐색 limit은 1 이상 100 이하여야 합니다.", + false, + ))); + } + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let mut request = CollectionRequest::new(target, CollectionScope::Node); + request.resource_scope = ResourceScope::None; + request.explore = Some(ExploreReadOptions { + projection_limit: input.limit.saturating_mul(4).clamp(50, 400), + text_preview_limit: if input.include_text_preview { 160 } else { 0 }, + }); + let result = self + .start_operation( + PendingOperation::Explore { limit: input.limit }, + request, + policy, + false, + ) + .await + .map_err(to_mcp_error)?; + Ok(tool_result(result)) + } + + #[tool( + description = "Continue a read-only Figma host handoff with an official MCP result", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_continue( + &self, + Parameters(input): Parameters, + ) -> Result { + self.handoffs + .accept(&input.session_id, &input.call_id, input.result) + .await + .map_err(to_mcp_error)?; + let step = self + .handoffs + .next(&input.session_id) + .await + .map_err(to_mcp_error)?; + Ok(tool_result( + self.handoff_step_to_value(step, "host") + .await + .map_err(to_mcp_error)?, + )) + } + + #[tool( + description = "Acquire a Figma design once and project multiple DevupUI artifacts", + output_schema = permissive_object_output_schema() + )] + async fn devup_figma_export( + &self, + Parameters(input): Parameters, + ) -> Result { + validate_outputs(&input.outputs).map_err(to_mcp_error)?; + if !input.asset_requests.is_empty() + && !input.outputs.iter().any(|output| output == "assetManifest") + { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "assetRequests를 사용하려면 outputs에 assetManifest가 필요합니다.", + false, + ))); + } + let reference_png_requested = input.outputs.iter().any(|output| output == "referencePng"); + if reference_png_requested && (!input.frame_ids.is_empty() || input.all_screens) { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "referencePng는 단일 Figma 링크 대상에서만 수집할 수 있습니다.", + false, + ))); + } + let root_layout = parse_root_layout(&input.root_layout).map_err(to_mcp_error)?; + parse_scope(&input.scope).map_err(to_mcp_error)?; + let delivery = input + .delivery + .parse::() + .map_err(to_mcp_error)?; + + if let Some(artifact_id) = input.artifact_id.as_deref() { + if input.url.is_some() || input.refresh { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "artifactId는 url 또는 refresh와 함께 사용할 수 없습니다.", + false, + ))); + } + let artifact = self.artifacts.get(artifact_id).await.ok_or_else(|| { + to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaHandoffExpired, + "Figma artifact가 없거나 만료되었습니다.", + true, + )) + })?; + let (asset_selections, asset_output_paths) = + parse_asset_requests(&input.asset_requests).map_err(to_mcp_error)?; + if artifact.capabilities.kind == ArtifactKind::SectionIndex + && (!input.frame_ids.is_empty() || input.all_screens) + { + let index = section_index_from_payload(&artifact.payload).ok_or_else(|| { + to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "Section index artifact payload가 올바르지 않습니다.", + false, + )) + })?; + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let collection_scope = + parse_collection_scope(&input.scope).map_err(to_mcp_error)?; + if collection_scope != CollectionScope::Node { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Section Frame 수집 scope는 node여야 합니다.", + false, + ))); + } + let mut request = + CollectionRequest::new(artifact.payload.target.clone(), collection_scope); + request.resource_scope = ResourceScope::Used; + request.asset_selections = asset_selections.clone(); + request.reference_png = reference_png_requested; + request.section = Some(SectionReadOptions { + frame_ids: input.frame_ids.clone(), + all_screens: input.all_screens, + }); + request.cached_section_index = Some(index); + let result = self + .start_operation( + PendingOperation::Export { + outputs: input.outputs, + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + root_layout, + scope: input.scope, + strict: input.strict, + output_paths: input.output_paths, + frame_ids: input.frame_ids, + all_screens: input.all_screens, + asset_captures: asset_selections, + asset_output_paths, + delivery, + }, + request, + policy, + false, + ) + .await + .map_err(to_mcp_error)?; + return Ok(tool_result(result)); + } + validate_artifact_projection( + &artifact, + &input.outputs, + &input.scope, + &asset_selections, + ) + .map_err(to_mcp_error)?; + let result = complete_operation( + PendingOperation::Export { + outputs: input.outputs, + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + root_layout, + scope: input.scope, + strict: input.strict, + output_paths: input.output_paths, + frame_ids: input.frame_ids, + all_screens: input.all_screens, + asset_captures: asset_selections, + asset_output_paths, + delivery, + }, + &artifact.payload, + "artifact", + &artifact, + &self.output_policy, + &self.artifacts, + ) + .await + .map_err(to_mcp_error)?; + return Ok(tool_result(result)); + } + + let url = input.url.as_deref().ok_or_else(|| { + to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "url 또는 artifactId 중 하나가 필요합니다.", + false, + )) + })?; + let target = FigmaTarget::parse(url).map_err(to_mcp_error)?; + if input.outputs.iter().any(|output| output == "tsx") && target.node_id.is_none() { + return Err(to_mcp_error(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "TSX export 링크에는 node-id가 필요합니다.", + false, + ))); + } + let policy = parse_source_policy(&input.source_policy).map_err(to_mcp_error)?; + let collection_scope = parse_collection_scope(&input.scope).map_err(to_mcp_error)?; + let mut request = CollectionRequest::new(target, collection_scope); + let (asset_selections, asset_output_paths) = + parse_asset_requests(&input.asset_requests).map_err(to_mcp_error)?; + request.asset_selections = asset_selections.clone(); + request.reference_png = reference_png_requested; + request.resource_scope = if collection_scope == CollectionScope::File { + ResourceScope::File + } else { + ResourceScope::Used + }; + request.variables_only = collection_scope == CollectionScope::File + && input.outputs.iter().all(|output| output == "devupJson") + && request.asset_selections.is_empty(); + if !input.frame_ids.is_empty() || input.all_screens { + request.section = Some(SectionReadOptions { + frame_ids: input.frame_ids.clone(), + all_screens: input.all_screens, + }); + } + let result = self + .start_operation( + PendingOperation::Export { + outputs: input.outputs, + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + root_layout, + scope: input.scope, + strict: input.strict, + output_paths: input.output_paths, + frame_ids: input.frame_ids, + all_screens: input.all_screens, + asset_captures: asset_selections, + asset_output_paths, + delivery, + }, + request, + policy, + input.refresh, + ) + .await + .map_err(to_mcp_error)?; + Ok(tool_result(result)) + } +} + +fn section_index_from_payload(payload: &CollectedPayload) -> Option { + serde_json::from_value(payload.metadata.get("sectionIndex")?.clone()).ok() +} + +fn section_candidate_as_explore(candidate: &SectionCandidate) -> ExploreCandidate { + ExploreCandidate { + node: ExploreNode { + node_id: candidate.node_id.clone(), + name: candidate.name.clone(), + node_type: candidate.node_type.clone(), + bounds: candidate.bounds, + child_count: candidate.direct_child_count, + text_preview: String::new(), + parent_id: candidate.parent_id.clone(), + kind: ExploreKind::Screen, + visible: candidate.visible, + breadcrumb: candidate.breadcrumb.clone(), + page_child_index: None, + }, + canonical_url: candidate.canonical_url.clone(), + score: 900, + selection_reasons: candidate.selection_reasons.clone(), + } +} + +fn format_epoch_rfc3339(epoch_seconds: u64) -> String { + let days = (epoch_seconds / 86_400) as i64; + let seconds = epoch_seconds % 86_400; + let (year, month, day) = civil_from_days(days); + let hour = seconds / 3_600; + let minute = (seconds % 3_600) / 60; + let second = seconds % 60; + format!("{year:04}-{month:02}-{day:02}T{hour:02}:{minute:02}:{second:02}Z") +} + +fn civil_from_days(days_since_epoch: i64) -> (i64, i64, i64) { + let days = days_since_epoch + 719_468; + let era = if days >= 0 { days } else { days - 146_096 } / 146_097; + let day_of_era = days - era * 146_097; + let year_of_era = + (day_of_era - day_of_era / 1_460 + day_of_era / 36_524 - day_of_era / 146_096) / 365; + let mut year = year_of_era + era * 400; + let day_of_year = day_of_era - (365 * year_of_era + year_of_era / 4 - year_of_era / 100); + let month_prime = (5 * day_of_year + 2) / 153; + let day = day_of_year - (153 * month_prime + 2) / 5 + 1; + let month = month_prime + if month_prime < 10 { 3 } else { -9 }; + year += i64::from(month <= 2); + (year, month, day) +} + +fn parse_scope(scope: &str) -> Result { + match scope { + "node" => Ok(ThemeScope::Node), + "page" => Ok(ThemeScope::Page), + "file" => Ok(ThemeScope::File), + _ => Err(DevupError::new( + ErrorCode::DevupThemeConflict, + "scope는 node, page 또는 file이어야 합니다.", + false, + )), + } +} + +fn to_mcp_error(error: DevupError) -> ErrorData { + ErrorData::new( + McpErrorCode::INTERNAL_ERROR, + error.message, + Some(json!({ "code": error.code, "retryable": error.retryable, "details": error.details })), + ) +} + +#[tool_handler(router = self.tool_router)] +impl ServerHandler for DevupServer { + fn get_info(&self) -> ServerInfo { + ServerInfo::new( + ServerCapabilities::builder() + .enable_resources() + .enable_tools() + .build(), + ) + .with_instructions("Read Figma designs and generate DevupUI artifacts") + } + + async fn list_resources( + &self, + request: Option, + _context: RequestContext, + ) -> Result { + resources::list_output_resources( + &self.artifacts, + request + .as_ref() + .and_then(|request| request.cursor.as_deref()), + ) + .await + .map_err(to_mcp_error) + } + + async fn list_resource_templates( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + Ok(resources::resource_templates()) + } + + async fn read_resource( + &self, + request: rmcp::model::ReadResourceRequestParams, + _context: RequestContext, + ) -> Result { + resources::read_output_resource(&self.artifacts, &request.uri) + .await + .map(Into::into) + .map_err(|_| ErrorData::resource_not_found("resource not found", None)) + } +} diff --git a/crates/devup-mcp/src/server/output.rs b/crates/devup-mcp/src/server/output.rs new file mode 100644 index 0000000..537c128 --- /dev/null +++ b/crates/devup-mcp/src/server/output.rs @@ -0,0 +1,660 @@ +use std::{ + collections::{BTreeMap, BTreeSet}, + ffi::OsStr, + io::{Read, Write}, + path::{Component, Path, PathBuf}, + sync::Arc, +}; + +use cap_std::{ + ambient_authority, + fs::{Dir, OpenOptions}, +}; +use devup_mcp_figma::{DevupError, ErrorCode}; +use rand::Rng; +use serde_json::json; +use sha2::{Digest, Sha256}; + +#[derive(Clone)] +pub struct OutputPolicy { + roots: Arc>>, +} + +struct OutputRoot { + dir: Dir, + display_path: PathBuf, +} + +#[derive(Clone)] +pub struct OutputTarget { + root: Arc, + relative_path: PathBuf, + display_path: PathBuf, +} + +pub struct OutputTransaction { + staged: Vec, + targets: BTreeSet, +} + +struct StagedOutput { + name: String, + target: OutputTarget, + temp_path: PathBuf, + backup_path: Option, + backup_fingerprint: Option, + replaced: bool, +} + +#[derive(Clone)] +struct FileFingerprint { + bytes: u64, + sha256: [u8; 32], +} + +struct RollbackFailure { + target_path: String, + backup_path: Option, + operation: &'static str, + message: String, +} + +#[derive(Default)] +struct RollbackReport { + failures: Vec, + recovery_paths: Vec, +} + +trait CommitHook { + fn after_replacement(&mut self, _replaced: usize) -> std::io::Result<()> { + Ok(()) + } + + fn before_restore(&mut self, _backup: &Path) -> std::io::Result<()> { + Ok(()) + } +} + +struct NoopCommitHook; + +impl CommitHook for NoopCommitHook {} + +impl OutputPolicy { + pub fn from_roots(roots: Vec) -> Result { + if roots.is_empty() { + return Err(invalid_path("허용할 output root가 하나 이상 필요합니다.")); + } + let mut opened = Vec::with_capacity(roots.len()); + for root in roots { + let display_path = dunce::canonicalize(&root).map_err(|error| { + invalid_path(format!("output root를 확인할 수 없습니다: {error}")) + })?; + if !display_path.is_dir() { + return Err(invalid_path("output root는 존재하는 폴더여야 합니다.")); + } + let dir = Dir::open_ambient_dir(&display_path, ambient_authority()) + .map_err(|error| invalid_path(format!("output root를 열 수 없습니다: {error}")))?; + opened.push(Arc::new(OutputRoot { dir, display_path })); + } + Ok(Self { + roots: Arc::new(opened), + }) + } + + pub fn resolve(&self, requested: &str) -> Result { + let path = Path::new(requested); + if requested.trim().is_empty() { + return Err(invalid_path("outputPath는 파일 경로여야 합니다.")); + } + + let (root, relative_path) = if path.is_absolute() { + self.roots + .iter() + .find_map(|root| { + path.strip_prefix(&root.display_path) + .ok() + .map(|relative| (root.clone(), relative.to_path_buf())) + }) + .ok_or_else(|| invalid_path("outputPath가 허용된 root 밖에 있습니다."))? + } else { + (self.roots[0].clone(), path.to_path_buf()) + }; + let relative_path = normalize_relative_file(&relative_path)?; + reject_existing_symlink_ancestors(&root, &relative_path)?; + let display_path = root.display_path.join(&relative_path); + Ok(OutputTarget { + root, + relative_path, + display_path, + }) + } +} + +impl OutputTransaction { + pub fn new() -> Self { + Self { + staged: Vec::new(), + targets: BTreeSet::new(), + } + } + + pub fn stage( + &mut self, + name: impl Into, + target: OutputTarget, + contents: &[u8], + ) -> Result<(), DevupError> { + if !self.targets.insert(target.display_path.clone()) { + return Err(invalid_path( + "둘 이상의 output이 같은 파일 경로를 사용할 수 없습니다.", + )); + } + let parent = target + .relative_path + .parent() + .unwrap_or_else(|| Path::new("")); + target.root.dir.create_dir_all(parent).map_err(|error| { + transaction_error(format!("output 상위 폴더를 만들 수 없습니다: {error}")) + })?; + reject_existing_symlink_ancestors(&target.root, &target.relative_path)?; + let temp_path = unique_sibling(&target.relative_path, "tmp"); + let mut file = target + .root + .dir + .open_with(&temp_path, OpenOptions::new().write(true).create_new(true)) + .map_err(|error| { + transaction_error(format!("output staging 파일을 만들 수 없습니다: {error}")) + })?; + if let Err(error) = file.write_all(contents).and_then(|()| file.sync_all()) { + drop(file); + let _ = target.root.dir.remove_file(&temp_path); + return Err(transaction_error(format!( + "output staging 파일을 기록할 수 없습니다: {error}" + ))); + } + drop(file); + self.staged.push(StagedOutput { + name: name.into(), + target, + temp_path, + backup_path: None, + backup_fingerprint: None, + replaced: false, + }); + Ok(()) + } + + pub fn commit(mut self) -> Result, DevupError> { + self.commit_with_hook(&mut NoopCommitHook) + } + + fn commit_with_hook( + &mut self, + hook: &mut impl CommitHook, + ) -> Result, DevupError> { + for output in &self.staged { + reject_existing_symlink_ancestors(&output.target.root, &output.target.relative_path)?; + match output + .target + .root + .dir + .symlink_metadata(&output.target.relative_path) + { + Ok(metadata) if metadata.file_type().is_symlink() || !metadata.is_file() => { + return Err(transaction_error( + "output target은 일반 파일이거나 아직 존재하지 않아야 합니다.", + )); + } + Ok(_) => {} + Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} + Err(error) => { + return Err(transaction_error(format!( + "output target을 확인할 수 없습니다: {error}" + ))); + } + } + } + + let result = self.replace_all(hook); + if let Err(error) = result { + let rollback = self.rollback(hook); + return if rollback.failures.is_empty() { + Err(transaction_error(format!( + "output transaction commit에 실패했습니다: {error}" + ))) + } else { + Err(transaction_rollback_error(error, rollback)) + }; + } + + for output in &mut self.staged { + if let Some(backup) = output.backup_path.take() { + let _ = output.target.root.dir.remove_file(backup); + } + output.backup_fingerprint = None; + } + Ok(self + .staged + .iter() + .map(|output| { + ( + output.name.clone(), + output.target.display_path.to_string_lossy().into_owned(), + ) + }) + .collect()) + } + + fn replace_all(&mut self, hook: &mut impl CommitHook) -> std::io::Result<()> { + let mut replaced = 0; + for output in &mut self.staged { + if output + .target + .root + .dir + .symlink_metadata(&output.target.relative_path) + .is_ok() + { + let backup_path = unique_sibling(&output.target.relative_path, "bak"); + let fingerprint = fingerprint(&output.target.root, &output.target.relative_path)?; + output.target.root.dir.rename( + &output.target.relative_path, + &output.target.root.dir, + &backup_path, + )?; + output.backup_path = Some(backup_path); + output.backup_fingerprint = Some(fingerprint); + } + output.target.root.dir.rename( + &output.temp_path, + &output.target.root.dir, + &output.target.relative_path, + )?; + output.replaced = true; + replaced += 1; + hook.after_replacement(replaced)?; + } + Ok(()) + } + + fn rollback(&mut self, hook: &mut impl CommitHook) -> RollbackReport { + let mut report = RollbackReport::default(); + for output in self.staged.iter_mut().rev() { + let target_path = output.target.display_path.to_string_lossy().into_owned(); + let mut replacement_removed = true; + if output.replaced { + if let Err(error) = output + .target + .root + .dir + .remove_file(&output.target.relative_path) + && error.kind() != std::io::ErrorKind::NotFound + { + replacement_removed = false; + report.failures.push(RollbackFailure { + target_path: target_path.clone(), + backup_path: output.backup_path.as_ref().map(|backup| { + output + .target + .root + .display_path + .join(backup) + .to_string_lossy() + .into_owned() + }), + operation: "remove-replacement", + message: error.to_string(), + }); + } + output.replaced = false; + } + if let Some(backup) = output.backup_path.take() { + let backup_display = output.target.root.display_path.join(&backup); + let backup_path = backup_display.to_string_lossy().into_owned(); + let restore = if replacement_removed { + hook.before_restore(&backup).and_then(|()| { + if let Some(expected) = output.backup_fingerprint.as_ref() { + verify_fingerprint(&output.target.root, &backup, expected)?; + } + restore_backup( + &output.target.root, + &backup, + &output.target.relative_path, + output.backup_fingerprint.as_ref(), + ) + }) + } else { + Err(std::io::Error::other( + "replacement target를 제거하지 못해 backup을 복원하지 않았습니다.", + )) + }; + if let Err(error) = restore { + report.recovery_paths.push(backup_path.clone()); + report.failures.push(RollbackFailure { + target_path: target_path.clone(), + backup_path: Some(backup_path), + operation: "restore-backup", + message: error.to_string(), + }); + } + output.backup_fingerprint = None; + } + if let Err(error) = output.target.root.dir.remove_file(&output.temp_path) + && error.kind() != std::io::ErrorKind::NotFound + { + report.failures.push(RollbackFailure { + target_path, + backup_path: None, + operation: "remove-staging", + message: error.to_string(), + }); + } + } + report + } +} + +impl Default for OutputTransaction { + fn default() -> Self { + Self::new() + } +} + +impl Drop for OutputTransaction { + fn drop(&mut self) { + for output in &mut self.staged { + let _ = output.target.root.dir.remove_file(&output.temp_path); + if let Some(backup) = output.backup_path.take() { + let _ = output.target.root.dir.rename( + &backup, + &output.target.root.dir, + &output.target.relative_path, + ); + } + output.backup_fingerprint = None; + } + } +} + +impl OutputTarget { + pub fn display_path(&self) -> &Path { + &self.display_path + } +} + +fn normalize_relative_file(path: &Path) -> Result { + let mut normalized = PathBuf::new(); + for component in path.components() { + match component { + Component::Normal(value) if safe_component(value) => normalized.push(value), + Component::CurDir => {} + Component::Normal(_) => { + return Err(invalid_path( + "outputPath에 안전하지 않은 파일명이 있습니다.", + )); + } + Component::ParentDir | Component::RootDir | Component::Prefix(_) => { + return Err(invalid_path("outputPath는 허용 root를 벗어날 수 없습니다.")); + } + } + } + if normalized.as_os_str().is_empty() || normalized.file_name().is_none() { + return Err(invalid_path("outputPath는 파일 경로여야 합니다.")); + } + Ok(normalized) +} + +fn safe_component(component: &OsStr) -> bool { + let value = component.to_string_lossy(); + !value.is_empty() && !value.contains(':') && !value.contains('\0') +} + +fn reject_existing_symlink_ancestors( + root: &OutputRoot, + relative_path: &Path, +) -> Result<(), DevupError> { + let mut current = PathBuf::new(); + let parent = relative_path.parent().unwrap_or_else(|| Path::new("")); + for component in parent.components() { + current.push(component.as_os_str()); + match root.dir.symlink_metadata(¤t) { + Ok(metadata) if metadata.file_type().is_symlink() => { + return Err(invalid_path( + "outputPath 상위 경로의 symlink 또는 junction은 허용하지 않습니다.", + )); + } + Ok(metadata) if !metadata.is_dir() => { + return Err(invalid_path("outputPath 상위 경로가 폴더가 아닙니다.")); + } + Ok(_) => {} + Err(error) if error.kind() == std::io::ErrorKind::NotFound => break, + Err(error) => { + return Err(invalid_path(format!( + "outputPath 상위 경로를 확인할 수 없습니다: {error}" + ))); + } + } + } + Ok(()) +} + +fn invalid_path(message: impl Into) -> DevupError { + DevupError::new(ErrorCode::DevupCodegenFailed, message, false) +} + +fn transaction_error(message: impl Into) -> DevupError { + DevupError::new(ErrorCode::DevupCodegenFailed, message, false) +} + +fn transaction_rollback_error( + commit_error: std::io::Error, + rollback: RollbackReport, +) -> DevupError { + let failures = rollback + .failures + .into_iter() + .map(|failure| { + json!({ + "targetPath": failure.target_path, + "backupPath": failure.backup_path, + "operation": failure.operation, + "message": failure.message + }) + }) + .collect::>(); + DevupError::with_details( + ErrorCode::DevupCodegenFailed, + format!("output transaction commit과 rollback에 실패했습니다: {commit_error}"), + false, + json!({ + "phase": "rollback", + "commitError": commit_error.to_string(), + "rollback": { + "complete": false, + "failures": failures, + "recoveryPaths": rollback.recovery_paths + } + }), + ) +} + +fn fingerprint(root: &OutputRoot, relative_path: &Path) -> std::io::Result { + let mut file = root.dir.open(relative_path)?; + let bytes = file.metadata()?.len(); + let mut hasher = Sha256::new(); + let mut buffer = [0_u8; 64 * 1024]; + loop { + let read = file.read(&mut buffer)?; + if read == 0 { + break; + } + hasher.update(&buffer[..read]); + } + Ok(FileFingerprint { + bytes, + sha256: hasher.finalize().into(), + }) +} + +fn verify_fingerprint( + root: &OutputRoot, + relative_path: &Path, + expected: &FileFingerprint, +) -> std::io::Result<()> { + let observed = fingerprint(root, relative_path)?; + if observed.bytes == expected.bytes && observed.sha256 == expected.sha256 { + Ok(()) + } else { + Err(std::io::Error::other( + "복원된 output의 길이 또는 hash가 원본 backup과 일치하지 않습니다.", + )) + } +} + +fn restore_backup( + root: &OutputRoot, + backup: &Path, + target: &Path, + expected: Option<&FileFingerprint>, +) -> std::io::Result<()> { + let mut source = root.dir.open(backup)?; + let permissions = source.metadata()?.permissions(); + let mut restored = root + .dir + .open_with(target, OpenOptions::new().write(true).create_new(true))?; + let copy_result = std::io::copy(&mut source, &mut restored) + .and_then(|_| restored.sync_all()) + .and_then(|_| root.dir.set_permissions(target, permissions)); + drop(restored); + if let Err(error) = copy_result { + let _ = root.dir.remove_file(target); + return Err(error); + } + if let Some(expected) = expected + && let Err(error) = verify_fingerprint(root, target, expected) + { + let _ = root.dir.remove_file(target); + return Err(error); + } + root.dir.remove_file(backup) +} + +fn unique_sibling(target: &Path, kind: &str) -> PathBuf { + let mut random = [0_u8; 16]; + rand::rng().fill_bytes(&mut random); + let suffix = random + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + target + .parent() + .unwrap_or_else(|| Path::new("")) + .join(format!(".devup-{kind}-{suffix}")) +} + +#[cfg(test)] +mod tests { + use std::{ + fs, io, + path::PathBuf, + time::{SystemTime, UNIX_EPOCH}, + }; + + use super::{CommitHook, OutputPolicy, OutputTransaction}; + + struct FailAfterFirstReplacement; + + impl CommitHook for FailAfterFirstReplacement { + fn after_replacement(&mut self, replaced: usize) -> io::Result<()> { + if replaced == 1 { + Err(io::Error::other("injected replacement failure")) + } else { + Ok(()) + } + } + } + + struct FailCommitAndRestore; + + impl CommitHook for FailCommitAndRestore { + fn after_replacement(&mut self, replaced: usize) -> io::Result<()> { + if replaced == 1 { + Err(io::Error::other("injected commit failure")) + } else { + Ok(()) + } + } + + fn before_restore(&mut self, _backup: &std::path::Path) -> io::Result<()> { + Err(io::Error::other("injected restore failure")) + } + } + + fn unique_root() -> anyhow::Result { + let path = std::env::temp_dir().join(format!( + "devup-mcp-transaction-rollback-{}-{}", + std::process::id(), + SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + )); + fs::create_dir_all(&path)?; + Ok(path) + } + + #[test] + fn restores_every_original_after_a_runtime_commit_failure() -> anyhow::Result<()> { + let root = unique_root()?; + fs::write(root.join("first.txt"), b"old-first")?; + fs::write(root.join("second.txt"), b"old-second")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + transaction.stage("first", policy.resolve("first.txt")?, b"new-first")?; + transaction.stage("second", policy.resolve("second.txt")?, b"new-second")?; + + let error = transaction + .commit_with_hook(&mut FailAfterFirstReplacement) + .expect_err("the injected failure must abort the transaction"); + + assert!(error.message.contains("commit")); + assert_eq!(fs::read(root.join("first.txt"))?, b"old-first"); + assert_eq!(fs::read(root.join("second.txt"))?, b"old-second"); + let internal_files = fs::read_dir(&root)? + .filter_map(Result::ok) + .filter_map(|entry| entry.file_name().into_string().ok()) + .filter(|name| name.starts_with(".devup-")) + .collect::>(); + assert!(internal_files.is_empty(), "stale files: {internal_files:?}"); + + drop(transaction); + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) + } + + #[test] + fn reports_and_retains_a_backup_when_rollback_restoration_fails() -> anyhow::Result<()> { + let root = unique_root()?; + fs::write(root.join("first.txt"), b"old-first")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + transaction.stage("first", policy.resolve("first.txt")?, b"new-first")?; + + let error = transaction + .commit_with_hook(&mut FailCommitAndRestore) + .expect_err("the injected rollback failure must be reported"); + + assert_eq!(error.details["phase"], "rollback"); + assert_eq!(error.details["rollback"]["complete"], false); + let recovery_path = error.details["rollback"]["recoveryPaths"][0] + .as_str() + .expect("retained backup path"); + assert!(std::path::Path::new(recovery_path).exists()); + assert_eq!(fs::read(recovery_path)?, b"old-first"); + assert!(!root.join("first.txt").exists()); + + fs::remove_file(recovery_path)?; + drop(transaction); + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) + } +} diff --git a/crates/devup-mcp/src/server/projection.rs b/crates/devup-mcp/src/server/projection.rs new file mode 100644 index 0000000..9cf0b89 --- /dev/null +++ b/crates/devup-mcp/src/server/projection.rs @@ -0,0 +1,1127 @@ +use std::fmt::Write as _; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_devup_ui::{ + codegen::{CodegenOptions, generate_component}, + theme::{generate_devup_json, variable_snapshot_from_result}, +}; +use devup_mcp_figma::{ + AssetManifest, AssetStatus, CollectedPayload, DevupError, ErrorCode, ExploreOptions, + SearchOptions, TargetKind, classify_target, explore_snapshot, search_snapshot, +}; +use serde_json::{Map, Value, json}; +use sha2::{Digest, Sha256}; + +use super::{ + artifacts::{ArtifactLookup, ArtifactStore, OutputReservation}, + delivery::{DeliveryMode, ProjectedOutput, choose_delivery_for_result}, + format_epoch_rfc3339, + handoff::PendingOperation, + output::{OutputPolicy, OutputTransaction}, + parse_scope, + quality::{ + OutputQuality, acquisition_quality, assets_quality, projection_quality, theme_quality, + }, + section_candidate_as_explore, section_index_from_payload, +}; + +pub(super) fn projected_outputs_from_result( + result: &Map, +) -> Result, DevupError> { + let mut outputs = Vec::new(); + if let Some(tsx) = result.get("tsx").and_then(Value::as_str) { + outputs.push(ProjectedOutput::text( + "tsx", + "text/typescript", + tsx.as_bytes().to_vec(), + )); + } + if let Some(devup_json) = result.get("devupJson").and_then(Value::as_str) { + outputs.push(ProjectedOutput::text( + "devupJson", + "application/json", + devup_json.as_bytes().to_vec(), + )); + } + if let Some(reference) = result.get("referencePng") { + let data = reference + .get("dataBase64") + .and_then(Value::as_str) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "referencePng resource에 base64 data가 없습니다.", + false, + ) + })?; + let bytes = STANDARD.decode(data.as_bytes()).map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "referencePng resource의 base64가 올바르지 않습니다.", + false, + ) + })?; + outputs.push(ProjectedOutput::binary("reference.png", "image/png", bytes)); + } + for (field, name) in [ + ("rawSnapshot", "raw-snapshot.json"), + ("sourceMap", "source-map.json"), + ("assetManifest", "asset-manifest.json"), + ] { + if let Some(value) = result.get(field) { + outputs.push(ProjectedOutput::text( + name, + "application/json", + encode_projected_json(value)?, + )); + } + } + if let Some(frames) = result.get("frames").and_then(Value::as_array) { + for (index, frame) in frames.iter().enumerate() { + if let Some(tsx) = frame.get("tsx").and_then(Value::as_str) { + outputs.push(ProjectedOutput::text( + format!("frame-{}.tsx", index + 1), + "text/typescript", + tsx.as_bytes().to_vec(), + )); + } + if let Some(source_map) = frame.get("sourceMap") { + outputs.push(ProjectedOutput::text( + format!("frame-{}.source-map.json", index + 1), + "application/json", + encode_projected_json(source_map)?, + )); + } + } + } + Ok(outputs) +} + +fn encode_projected_json(value: &Value) -> Result, DevupError> { + serde_json::to_vec(value).map_err(|error| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("resource output을 JSON으로 직렬화할 수 없습니다: {error}"), + false, + ) + }) +} + +pub(super) struct DeliveryAttachment { + reservation: OutputReservation, +} + +pub(super) async fn apply_delivery( + result: &mut Value, + mode: DeliveryMode, + artifact_store: &ArtifactStore, + artifact: &ArtifactLookup, + mut outputs: Vec, +) -> Result, DevupError> { + if outputs.is_empty() || choose_delivery_for_result(mode, result, &outputs)?.inline { + return Ok(None); + } + let projection_key = projection_key(&outputs); + materialize_asset_resource_references(result, &mut outputs, &artifact.artifact_id)?; + let reservation = artifact_store + .reserve_outputs(&artifact.artifact_id, &projection_key, outputs) + .await?; + let manifests = reservation.manifests().to_vec(); + let result = result.as_object_mut().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "resource delivery 결과가 JSON object가 아닙니다.", + false, + ) + })?; + for field in [ + "tsx", + "devupJson", + "rawSnapshot", + "sourceMap", + "assetManifest", + "referencePng", + ] { + result.remove(field); + } + if let Some(frames) = result.get_mut("frames").and_then(Value::as_array_mut) { + for frame in frames { + if let Some(frame) = frame.as_object_mut() { + frame.remove("tsx"); + frame.remove("sourceMap"); + } + } + } + result.insert( + "resources".to_owned(), + Value::Array( + manifests + .into_iter() + .map(|manifest| { + json!({ + "type": "resource_link", + "uri": manifest.manifest_uri, + "name": manifest.name, + "mimeType": manifest.mime_type, + "size": manifest.raw_bytes, + "contentHash": manifest.sha256, + "expiresAt": format_epoch_rfc3339(manifest.expires_at_epoch_seconds) + }) + }) + .collect(), + ), + ); + Ok(Some(DeliveryAttachment { reservation })) +} + +pub(super) async fn rollback_delivery( + _artifact_store: &ArtifactStore, + _artifact: &ArtifactLookup, + attachment: Option, +) { + if let Some(attachment) = attachment { + attachment.reservation.rollback(); + } +} + +pub(super) fn commit_delivery(attachment: Option) { + if let Some(attachment) = attachment { + attachment.reservation.commit(); + } +} + +fn materialize_asset_resource_references( + result: &mut Value, + outputs: &mut [ProjectedOutput], + artifact_id: &str, +) -> Result<(), DevupError> { + let Some(assets) = result + .get_mut("assetManifest") + .and_then(|manifest| manifest.get_mut("assets")) + .and_then(Value::as_array_mut) + else { + return Ok(()); + }; + for output in outputs.iter().filter(|output| output.asset_id.is_some()) { + let asset_id = output.asset_id.as_deref().unwrap_or_default(); + let asset = assets + .iter_mut() + .find(|asset| asset.get("assetId").and_then(Value::as_str) == Some(asset_id)) + .and_then(Value::as_object_mut) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "asset resource에 대응하는 manifest 항목이 없습니다.", + false, + ) + })?; + asset.remove("dataBase64"); + asset.insert( + "resource".to_owned(), + json!({ + "uri": output.manifest_uri(artifact_id), + "mimeType": output.mime_type, + "byteLength": output.bytes.len(), + "sha256": sha256_hex(&output.bytes) + }), + ); + } + if let Some(manifest_output) = outputs + .iter_mut() + .find(|output| output.name == "asset-manifest.json") + { + manifest_output.bytes = + encode_projected_json(result.get("assetManifest").ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "asset manifest resource가 없습니다.", + false, + ) + })?)?; + } + Ok(()) +} + +fn projected_asset_outputs(manifest: &AssetManifest) -> Result, DevupError> { + let mut outputs = Vec::new(); + for (index, asset) in manifest.assets.iter().enumerate() { + if asset.status != AssetStatus::Exported { + continue; + } + let data = asset.data_base64.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset binary가 artifact에 없습니다.", + false, + ) + })?; + let bytes = STANDARD.decode(data.as_bytes()).map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset binary의 base64가 올바르지 않습니다.", + false, + ) + })?; + let mime_type = asset.mime_type.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset MIME 형식이 없습니다.", + false, + ) + })?; + let expected_hash = asset.sha256.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset hash가 없습니다.", + false, + ) + })?; + if asset.byte_length != Some(bytes.len()) || expected_hash != sha256_hex(&bytes) { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset 길이 또는 hash가 일치하지 않습니다.", + false, + )); + } + let extension = asset + .format + .map_or("bin", devup_mcp_figma::AssetFormat::extension); + outputs.push(ProjectedOutput::asset( + format!("asset-{}.{extension}", index + 1), + mime_type, + bytes, + &asset.asset_id, + )); + } + Ok(outputs) +} + +fn sha256_hex(bytes: &[u8]) -> String { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +fn projection_key(outputs: &[ProjectedOutput]) -> String { + let mut hasher = Sha256::new(); + for output in outputs { + hasher.update(output.name.as_bytes()); + hasher.update([0]); + hasher.update(output.mime_type.as_bytes()); + hasher.update([u8::from(output.is_binary)]); + hasher.update((output.bytes.len() as u64).to_le_bytes()); + hasher.update(&output.bytes); + } + let digest = hasher.finalize(); + let mut encoded = String::with_capacity(digest.len() * 2); + for byte in digest { + let _ = write!(&mut encoded, "{byte:02x}"); + } + encoded +} + +pub(super) fn artifact_metadata(artifact: &ArtifactLookup) -> Value { + json!({ + "artifactId": artifact.artifact_id, + "contentHash": artifact.content_hash, + "cacheHit": artifact.cache_hit, + "capabilities": artifact.capabilities, + "sizeBytes": artifact.size_bytes, + "acquiredAt": format_epoch_rfc3339(artifact.created_at_epoch_seconds), + "expiresAt": format_epoch_rfc3339(artifact.expires_at_epoch_seconds) + }) +} + +pub(super) fn commit_single_output( + policy: &OutputPolicy, + path: Option<&str>, + name: &str, + contents: &[u8], +) -> Result, DevupError> { + let Some(path) = path else { + return Ok(None); + }; + let mut transaction = OutputTransaction::new(); + transaction.stage(name, policy.resolve(path)?, contents)?; + Ok(transaction.commit()?.remove(name)) +} + +pub(super) async fn complete_operation( + operation: PendingOperation, + payload: &CollectedPayload, + source_kind: &str, + artifact: &ArtifactLookup, + output_policy: &OutputPolicy, + artifact_store: &ArtifactStore, +) -> Result { + let collection = payload.stats.clone(); + let completeness_report = payload.completeness_report(); + match operation { + PendingOperation::ToUi { + component_name, + include_diagnostics, + root_layout, + output_path, + delivery, + } => { + let node_id = payload.target.node_id.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "UI 변환 payload에는 node ID가 필요합니다.", + false, + ) + })?; + let output = generate_component( + &payload.snapshot, + node_id, + &CodegenOptions { + component_name, + include_diagnostics, + inline_instances: true, + root_layout, + ..CodegenOptions::default() + } + .with_payload_tokens(payload), + )?; + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, false), + projection: projection_quality(true, &output.diagnostics), + theme: theme_quality(false, 0, 0), + assets: assets_quality(false, &[], &[]), + }; + let status = quality.status(); + let diagnostics = if include_diagnostics { + output.diagnostics.clone() + } else { + Vec::new() + }; + let projected_outputs = vec![ProjectedOutput::text( + "tsx", + "text/typescript", + output.tsx.as_bytes().to_vec(), + )]; + let mut result = json!({ + "status": status, + "quality": quality, + "tsx": output.tsx, + "imports": output.imports, + "usedTokens": output.used_tokens, + "fidelity": output.fidelity_report, + "diagnostics": diagnostics, + "outputPath": null, + "completeness": payload.completeness, + "completenessReport": &completeness_report, + "rootLayout": root_layout, + "collection": collection, + "cache": artifact_metadata(artifact), + "source": { + "kind": source_kind, + "fileKey": payload.target.file_key, + "nodeId": node_id, + "version": payload.snapshot.version + }, + "snapshot": { + "preservedNodeCount": payload.snapshot.nodes.len(), + "fieldErrorCount": payload.snapshot.nodes.values() + .map(|node| node.field_errors.len()).sum::() + } + }); + let attachment = apply_delivery( + &mut result, + delivery, + artifact_store, + artifact, + projected_outputs, + ) + .await?; + let written_path = match commit_single_output( + output_policy, + output_path.as_deref(), + "tsx", + output.tsx.as_bytes(), + ) { + Ok(path) => path, + Err(error) => { + rollback_delivery(artifact_store, artifact, attachment).await; + return Err(error); + } + }; + commit_delivery(attachment); + result["outputPath"] = json!(written_path); + Ok(result) + } + PendingOperation::ToJson { + scope, + include_diagnostics, + output_path, + delivery, + } => { + let result = payload.variables.as_ref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma 변수/style 수집 결과가 없습니다.", + false, + ) + })?; + let variables = variable_snapshot_from_result(result)?; + let output = generate_devup_json(&variables, parse_scope(&scope)?)?; + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, false), + projection: projection_quality(false, &[]), + theme: theme_quality( + true, + output.conflicts.len(), + output.unresolved_variables.len(), + ), + assets: assets_quality(false, &[], &[]), + }; + let status = quality.status(); + let diagnostics = if include_diagnostics { + output.diagnostics.clone() + } else { + Vec::new() + }; + let projected_outputs = vec![ProjectedOutput::text( + "devupJson", + "application/json", + output.json.as_bytes().to_vec(), + )]; + let mut result = json!({ + "status": status, + "quality": quality, + "devupJson": output.json, + "counts": output.counts, + "completeness": output.completeness, + "completenessReport": &completeness_report, + "conflicts": output.conflicts, + "unresolvedVariables": output.unresolved_variables, + "diagnostics": diagnostics, + "outputPath": null, + "collection": collection, + "cache": artifact_metadata(artifact), + "source": { + "kind": source_kind, + "fileKey": payload.target.file_key, + "nodeId": payload.target.node_id, + "version": payload.snapshot.version + } + }); + let attachment = apply_delivery( + &mut result, + delivery, + artifact_store, + artifact, + projected_outputs, + ) + .await?; + let written_path = match commit_single_output( + output_policy, + output_path.as_deref(), + "devupJson", + output.json.as_bytes(), + ) { + Ok(path) => path, + Err(error) => { + rollback_delivery(artifact_store, artifact, attachment).await; + return Err(error); + } + }; + commit_delivery(attachment); + result["outputPath"] = json!(written_path); + Ok(result) + } + PendingOperation::Search { + query, + node_types, + match_kind, + limit, + } => { + let matches = search_snapshot( + &payload.snapshot, + &payload.target, + &SearchOptions { + query: query.clone(), + node_types, + match_kind, + limit, + }, + )?; + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, true), + projection: projection_quality(false, &[]), + theme: theme_quality(false, 0, 0), + assets: assets_quality(false, &[], &[]), + }; + Ok(json!({ + "status": quality.status(), + "quality": quality, + "query": query, + "count": matches.len(), + "matches": matches, + "completeness": payload.completeness, + "completenessReport": &completeness_report, + "collection": collection, + "cache": artifact_metadata(artifact), + "source": { + "kind": source_kind, + "fileKey": payload.target.file_key, + "version": payload.snapshot.version + } + })) + } + PendingOperation::Explore { limit } => { + let result = explore_snapshot( + &payload.snapshot, + &payload.target, + &ExploreOptions { limit }, + )?; + let count = result.candidates.len(); + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, true), + projection: projection_quality(false, &[]), + theme: theme_quality(false, 0, 0), + assets: assets_quality(false, &[], &[]), + }; + Ok(json!({ + "status": quality.status(), + "quality": quality, + "targetKind": result.target_kind, + "anchor": result.anchor, + "group": result.group, + "count": count, + "candidates": result.candidates, + "truncated": result.truncated, + "diagnostics": payload.snapshot.diagnostics, + "completeness": payload.completeness, + "completenessReport": &completeness_report, + "collection": collection, + "cache": artifact_metadata(artifact), + "source": { + "kind": source_kind, + "fileKey": payload.target.file_key, + "nodeId": payload.target.node_id, + "version": payload.snapshot.version + } + })) + } + PendingOperation::Export { + outputs, + component_name, + include_diagnostics, + root_layout, + scope, + strict, + output_paths, + frame_ids, + all_screens, + asset_captures, + asset_output_paths, + delivery, + } => { + let mut result = Map::new(); + result.insert("completeness".to_owned(), json!(payload.completeness)); + result.insert("completenessReport".to_owned(), json!(&completeness_report)); + result.insert("collection".to_owned(), json!(collection)); + result.insert("cache".to_owned(), artifact_metadata(artifact)); + result.insert( + "source".to_owned(), + json!({ + "kind": source_kind, + "fileKey": payload.target.file_key, + "nodeId": payload.target.node_id, + "version": payload.snapshot.version + }), + ); + let payload_section_index = section_index_from_payload(payload); + let target_kind = if payload_section_index.is_some() { + TargetKind::Section + } else { + classify_target(&payload.snapshot, &payload.target) + }; + result.insert("targetKind".to_owned(), json!(target_kind)); + + if !frame_ids.is_empty() && all_screens { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "frameIds와 allScreens는 동시에 사용할 수 없습니다.", + false, + )); + } + if target_kind != TargetKind::Section && (!frame_ids.is_empty() || all_screens) { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "frameIds와 allScreens는 Section artifact에서만 사용할 수 있습니다.", + false, + )); + } + + let section_candidates = if target_kind == TargetKind::Section + && outputs.iter().any(|output| output == "tsx") + { + Some(if let Some(index) = &payload_section_index { + index + .candidates + .iter() + .map(section_candidate_as_explore) + .collect() + } else { + explore_snapshot( + &payload.snapshot, + &payload.target, + &ExploreOptions { limit: 100 }, + )? + .candidates + }) + } else { + None + }; + if let Some(candidates) = §ion_candidates + && frame_ids.is_empty() + && !all_screens + { + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, false), + projection: projection_quality(false, &[]), + theme: theme_quality(false, 0, 0), + assets: assets_quality(false, &[], &[]), + }; + result.insert("status".to_owned(), json!("selection_required")); + result.insert("quality".to_owned(), json!(quality)); + result.insert( + "selection".to_owned(), + json!({ + "kind": "screen-frame", + "candidates": candidates, + "truncated": candidates.len() == 100 + }), + ); + return Ok(Value::Object(result)); + } + + let mut written_paths = Map::new(); + let mut section_tsx_projected = false; + let mut tsx_source_map = None; + let mut devup_json_source_map = None; + let mut projection_diagnostics = Vec::new(); + let mut fidelity_reports = Vec::new(); + let mut theme_conflict_count = 0; + let mut theme_unresolved_count = 0; + let mut pending_text_outputs = std::collections::BTreeMap::new(); + let mut pending_binary_outputs = std::collections::BTreeMap::new(); + let mut pending_asset_manifest = None; + let mut asset_resource_outputs = Vec::new(); + if let Some(candidates) = section_candidates { + let by_id = candidates + .iter() + .map(|candidate| (candidate.node.node_id.as_str(), candidate)) + .collect::>(); + let selected = if all_screens { + candidates.iter().collect::>() + } else { + let requested = frame_ids + .iter() + .map(String::as_str) + .collect::>(); + if requested.len() != frame_ids.len() { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "frameIds에 중복 node가 있습니다.", + false, + )); + } + if let Some(node_id) = requested + .iter() + .find(|node_id| !by_id.contains_key(**node_id)) + { + return Err(DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + format!( + "Section 내부 screen frame이 아니거나 존재하지 않습니다: {node_id}" + ), + false, + )); + } + candidates + .iter() + .filter(|candidate| requested.contains(candidate.node.node_id.as_str())) + .collect::>() + }; + let mut frames = Vec::with_capacity(selected.len()); + for (index, candidate) in selected.into_iter().enumerate() { + let frame_component_name = component_name.as_ref().map(|name| { + if frame_ids.len() <= 1 && !all_screens { + name.clone() + } else { + format!("{name}{}", index + 1) + } + }); + let output = generate_component( + &payload.snapshot, + &candidate.node.node_id, + &CodegenOptions { + component_name: frame_component_name, + include_diagnostics, + inline_instances: true, + root_layout, + ..CodegenOptions::default() + } + .with_payload_tokens(payload), + )?; + projection_diagnostics.extend(output.diagnostics.iter().cloned()); + fidelity_reports.push(output.fidelity_report.clone()); + let frame_quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, false), + projection: projection_quality(true, &output.diagnostics), + theme: theme_quality(false, 0, 0), + assets: assets_quality(false, &[], &[]), + }; + let source_map = json!({ + "version": output.source_map.version, + "entries": output.source_map.entries, + "source": { + "fileKey": payload.target.file_key, + "rootNodeId": candidate.node.node_id, + "sourceVersion": payload.source_version + } + }); + let mut frame = json!({ + "nodeId": candidate.node.node_id, + "name": candidate.node.name, + "canonicalUrl": candidate.canonical_url, + "status": frame_quality.status(), + "quality": frame_quality, + "tsx": output.tsx, + "imports": output.imports, + "usedTokens": output.used_tokens, + "fidelity": output.fidelity_report, + "completenessReport": &completeness_report + }); + if outputs.iter().any(|output| output == "sourceMap") { + frame["sourceMap"] = source_map; + } + if include_diagnostics { + frame["diagnostics"] = json!(output.diagnostics); + } + frames.push(frame); + } + result.insert("frames".to_owned(), Value::Array(frames)); + section_tsx_projected = true; + } + + if outputs.iter().any(|output| output == "tsx") && !section_tsx_projected { + let node_id = payload.target.node_id.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "TSX export payload에는 node ID가 필요합니다.", + false, + ) + })?; + let output = generate_component( + &payload.snapshot, + node_id, + &CodegenOptions { + component_name, + include_diagnostics, + inline_instances: true, + root_layout, + ..CodegenOptions::default() + } + .with_payload_tokens(payload), + )?; + projection_diagnostics.extend(output.diagnostics.iter().cloned()); + fidelity_reports.push(output.fidelity_report.clone()); + tsx_source_map = Some(output.source_map.clone()); + if output_paths.contains_key("tsx") { + pending_text_outputs.insert("tsx".to_owned(), output.tsx.clone()); + } + result.insert("tsx".to_owned(), json!(output.tsx)); + result.insert("imports".to_owned(), json!(output.imports)); + result.insert("usedTokens".to_owned(), json!(output.used_tokens)); + result.insert("fidelity".to_owned(), json!(output.fidelity_report)); + if include_diagnostics { + result.insert("diagnostics".to_owned(), json!(&output.diagnostics)); + } + } + + if outputs.iter().any(|output| output == "devupJson") { + let variables = payload.variables.as_ref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma 변수/style 수집 결과가 없습니다.", + false, + ) + })?; + let variables = variable_snapshot_from_result(variables)?; + let output = generate_devup_json(&variables, parse_scope(&scope)?)?; + theme_conflict_count = output.conflicts.len(); + theme_unresolved_count = output.unresolved_variables.len(); + devup_json_source_map = Some(output.source_map.clone()); + if output_paths.contains_key("devupJson") { + pending_text_outputs.insert("devupJson".to_owned(), output.json.clone()); + } + result.insert("devupJson".to_owned(), json!(output.json)); + result.insert("themeCounts".to_owned(), json!(output.counts)); + result.insert("themeCompleteness".to_owned(), json!(output.completeness)); + result.insert("conflicts".to_owned(), json!(output.conflicts)); + result.insert( + "unresolvedVariables".to_owned(), + json!(output.unresolved_variables), + ); + if include_diagnostics && !result.contains_key("diagnostics") { + result.insert("diagnostics".to_owned(), json!(output.diagnostics)); + } + } + + if outputs.iter().any(|output| output == "rawSnapshot") { + let raw = serde_json::to_value(&payload.snapshot).map_err(|error| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("raw snapshot을 직렬화할 수 없습니다: {error}"), + false, + ) + })?; + if output_paths.contains_key("rawSnapshot") { + pending_text_outputs.insert( + "rawSnapshot".to_owned(), + serde_json::to_string_pretty(&raw).unwrap_or_default(), + ); + } + result.insert("rawSnapshot".to_owned(), raw); + } + + if outputs.iter().any(|output| output == "sourceMap") && !section_tsx_projected { + let source_map = json!({ + "version": 1, + "tsx": tsx_source_map.map(|source_map| source_map.entries).unwrap_or_default(), + "devupJson": devup_json_source_map + .map(|source_map| source_map.entries) + .unwrap_or_default(), + "source": { + "fileKey": payload.target.file_key, + "rootNodeId": payload.target.node_id, + "sourceVersion": payload.source_version + } + }); + if output_paths.contains_key("sourceMap") { + pending_text_outputs.insert( + "sourceMap".to_owned(), + serde_json::to_string_pretty(&source_map).unwrap_or_default(), + ); + } + result.insert("sourceMap".to_owned(), source_map); + } + + if outputs.iter().any(|output| output == "referencePng") { + let reference = payload.reference_png.as_ref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "artifact에 요청한 reference PNG가 없습니다. URL로 다시 수집하세요.", + false, + ) + })?; + let bytes = STANDARD + .decode(reference.data_base64.as_bytes()) + .map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "artifact reference PNG의 base64가 올바르지 않습니다.", + false, + ) + })?; + if bytes.len() != reference.byte_length + || Sha256::digest(&bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::() + != reference.sha256 + { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "artifact reference PNG의 길이 또는 hash가 일치하지 않습니다.", + false, + )); + } + if output_paths.contains_key("referencePng") { + pending_binary_outputs.insert("referencePng".to_owned(), bytes); + } + result.insert("referencePng".to_owned(), json!(reference)); + } + + if outputs.iter().any(|output| output == "assetManifest") { + let mut manifest = devup_mcp_figma::discover_asset_manifest(&payload.snapshot); + for exported in &payload.assets { + if let Some(existing) = manifest + .assets + .iter_mut() + .find(|asset| asset.asset_id == exported.asset_id) + { + *existing = exported.clone(); + } else { + manifest.assets.push(exported.clone()); + } + } + manifest + .assets + .sort_by(|left, right| left.asset_id.cmp(&right.asset_id)); + for capture in &asset_captures { + if !payload.assets.iter().any(|asset| { + asset.asset_id == capture.asset_id + && asset.format == Some(capture.format) + && asset.scale == Some(capture.scale) + && asset.status == AssetStatus::Exported + }) { + return Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + format!( + "artifact에 요청한 정확한 asset export가 없습니다. URL로 다시 수집하세요: {}", + capture.asset_id + ), + false, + )); + } + } + manifest.diagnostics = payload + .snapshot + .diagnostics + .iter() + .filter(|diagnostic| diagnostic.resource_kind.as_deref() == Some("asset")) + .cloned() + .collect(); + pending_asset_manifest = Some(manifest); + } + let quality = OutputQuality { + acquisition: acquisition_quality(&completeness_report, false), + projection: projection_quality( + outputs.iter().any(|output| output == "tsx"), + &projection_diagnostics, + ), + theme: theme_quality( + outputs.iter().any(|output| output == "devupJson"), + theme_conflict_count, + theme_unresolved_count, + ), + assets: assets_quality( + outputs.iter().any(|output| output == "assetManifest"), + &asset_captures + .iter() + .map(|capture| capture.asset_id.clone()) + .collect::>(), + &payload.assets, + ), + }; + let fidelity_violation = fidelity_reports + .iter() + .any(|report| !report.strict_compatible()); + if strict && (quality.strict_violation() || fidelity_violation) { + return Err(DevupError::with_details( + ErrorCode::DevupSnapshotUnsupported, + format!( + "strict export는 exact/complete output만 허용합니다: status={}, quality={}", + quality.status(), + serde_json::to_string(&quality).unwrap_or_default() + ), + false, + json!({ + "quality": quality, + "fidelity": fidelity_reports, + "completenessReport": completeness_report + }), + )); + } + result.insert("status".to_owned(), json!(quality.status())); + result.insert("quality".to_owned(), json!(quality)); + let mut planned_outputs = Vec::new(); + for (output, contents) in pending_text_outputs { + if let Some(path) = output_paths.get(&output) { + planned_outputs.push(( + output, + output_policy.resolve(path)?, + contents.into_bytes(), + )); + } + } + for (output, bytes) in pending_binary_outputs { + if let Some(path) = output_paths.get(&output) { + planned_outputs.push((output, output_policy.resolve(path)?, bytes)); + } + } + if let Some(manifest) = pending_asset_manifest.as_ref() { + for asset in &manifest.assets { + if asset.status != AssetStatus::Exported { + continue; + } + let Some(path) = asset_output_paths.get(&asset.asset_id) else { + continue; + }; + let data = asset.data_base64.as_deref().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset binary가 artifact에 없습니다.", + false, + ) + })?; + let bytes = STANDARD.decode(data.as_bytes()).map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "export된 asset binary의 base64가 올바르지 않습니다.", + false, + ) + })?; + planned_outputs.push(( + format!("asset:{}", asset.asset_id), + output_policy.resolve(path)?, + bytes, + )); + } + } + let mut transaction = OutputTransaction::new(); + for (name, target, bytes) in planned_outputs { + written_paths.insert( + name.clone(), + json!(target.display_path().to_string_lossy().into_owned()), + ); + transaction.stage(name, target, &bytes)?; + } + if let Some(mut manifest) = pending_asset_manifest { + asset_resource_outputs = projected_asset_outputs(&manifest)?; + for asset in &mut manifest.assets { + if asset.status != AssetStatus::Exported { + continue; + } + let output_name = format!("asset:{}", asset.asset_id); + let Some(path) = written_paths.get(&output_name).and_then(Value::as_str) else { + continue; + }; + asset.output_path = Some(path.to_owned()); + asset.data_base64 = None; + } + result.insert("assetManifest".to_owned(), json!(manifest)); + } + result.insert("outputPaths".to_owned(), Value::Object(written_paths)); + let projected_outputs = projected_outputs_from_result(&result)?; + let mut projected_outputs = projected_outputs; + projected_outputs.extend(asset_resource_outputs); + let mut result = Value::Object(result); + let attachment = apply_delivery( + &mut result, + delivery, + artifact_store, + artifact, + projected_outputs, + ) + .await?; + if let Err(error) = transaction.commit() { + rollback_delivery(artifact_store, artifact, attachment).await; + return Err(error); + } + commit_delivery(attachment); + Ok(result) + } + PendingOperation::Collect | PendingOperation::Artifact { .. } => Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "내부 수집 operation은 MCP artifact로 완료할 수 없습니다.", + false, + )), + } +} diff --git a/crates/devup-mcp/src/server/quality.rs b/crates/devup-mcp/src/server/quality.rs new file mode 100644 index 0000000..559d59a --- /dev/null +++ b/crates/devup-mcp/src/server/quality.rs @@ -0,0 +1,276 @@ +use devup_mcp_figma::{ + AssetManifestEntry, AssetStatus, CompletenessState, Diagnostic, FidelityImpact, + PayloadCompletenessReport, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum AcquisitionQuality { + Complete, + ExpectedProjection, + Partial, + Failed, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ProjectionQuality { + Exact, + Approximated, + Lossy, + Failed, + NotRequested, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ThemeQuality { + Complete, + Conflicted, + Unresolved, + NotRequested, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum AssetsQuality { + Complete, + Partial, + Failed, + NotRequested, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OutputQuality { + pub acquisition: AcquisitionQuality, + pub projection: ProjectionQuality, + pub theme: ThemeQuality, + pub assets: AssetsQuality, +} + +impl OutputQuality { + pub fn status(self) -> &'static str { + if self.acquisition == AcquisitionQuality::Failed + || self.projection == ProjectionQuality::Failed + { + "failed" + } else if matches!( + self.acquisition, + AcquisitionQuality::Complete | AcquisitionQuality::ExpectedProjection + ) && matches!( + self.projection, + ProjectionQuality::Exact | ProjectionQuality::NotRequested + ) && matches!( + self.theme, + ThemeQuality::Complete | ThemeQuality::NotRequested + ) && matches!( + self.assets, + AssetsQuality::Complete | AssetsQuality::NotRequested + ) { + "complete" + } else { + "partial" + } + } + + pub fn strict_violation(self) -> bool { + self.acquisition != AcquisitionQuality::Complete + || !matches!( + self.projection, + ProjectionQuality::Exact | ProjectionQuality::NotRequested + ) + || !matches!( + self.theme, + ThemeQuality::Complete | ThemeQuality::NotRequested + ) + || !matches!( + self.assets, + AssetsQuality::Complete | AssetsQuality::NotRequested + ) + } +} + +pub fn acquisition_quality( + report: &PayloadCompletenessReport, + expected_projection: bool, +) -> AcquisitionQuality { + if expected_projection { + if !report.snapshot.missing_root_ids.is_empty() { + AcquisitionQuality::Failed + } else if report.snapshot.field_error_count > 0 + || !report.snapshot.truncated_fields.is_empty() + { + AcquisitionQuality::Partial + } else { + AcquisitionQuality::ExpectedProjection + } + } else { + match report.state { + CompletenessState::Complete => AcquisitionQuality::Complete, + CompletenessState::Partial => AcquisitionQuality::Partial, + CompletenessState::Failed => AcquisitionQuality::Failed, + } + } +} + +pub fn projection_quality(requested: bool, diagnostics: &[Diagnostic]) -> ProjectionQuality { + if !requested { + return ProjectionQuality::NotRequested; + } + match diagnostics + .iter() + .map(Diagnostic::fidelity_impact) + .max() + .unwrap_or_default() + { + FidelityImpact::None => ProjectionQuality::Exact, + FidelityImpact::Approximated => ProjectionQuality::Approximated, + FidelityImpact::Lossy => ProjectionQuality::Lossy, + FidelityImpact::Failed => ProjectionQuality::Failed, + } +} + +pub fn theme_quality( + requested: bool, + conflict_count: usize, + unresolved_count: usize, +) -> ThemeQuality { + if !requested { + ThemeQuality::NotRequested + } else if unresolved_count > 0 { + ThemeQuality::Unresolved + } else if conflict_count > 0 { + ThemeQuality::Conflicted + } else { + ThemeQuality::Complete + } +} + +pub fn assets_quality( + requested: bool, + requested_asset_ids: &[String], + assets: &[AssetManifestEntry], +) -> AssetsQuality { + if !requested { + return AssetsQuality::NotRequested; + } + if requested_asset_ids.is_empty() { + return AssetsQuality::Complete; + } + + let requested = requested_asset_ids + .iter() + .filter_map(|asset_id| assets.iter().find(|asset| &asset.asset_id == asset_id)) + .collect::>(); + if requested + .iter() + .any(|asset| asset.status == AssetStatus::Failed) + { + AssetsQuality::Failed + } else if requested.len() != requested_asset_ids.len() + || requested + .iter() + .any(|asset| asset.status != AssetStatus::Exported) + { + AssetsQuality::Partial + } else { + AssetsQuality::Complete + } +} + +#[cfg(test)] +mod tests { + use devup_mcp_figma::{Diagnostic, DiagnosticSeverity, FidelityImpact}; + + use super::{ProjectionQuality, projection_quality}; + + fn diagnostic( + code: &str, + severity: DiagnosticSeverity, + fidelity_impact: Option, + ) -> Diagnostic { + Diagnostic { + code: code.to_owned(), + message: "redacted fixture".to_owned(), + severity: Some(severity), + fidelity_impact, + ..Diagnostic::default() + } + } + + #[test] + fn projection_quality_uses_structured_fidelity_impact() { + assert_eq!( + projection_quality( + true, + &[diagnostic( + "IGNORED_CODE", + DiagnosticSeverity::Warning, + Some(FidelityImpact::Approximated), + )], + ), + ProjectionQuality::Approximated + ); + assert_eq!( + projection_quality( + true, + &[diagnostic( + "IGNORED_CODE", + DiagnosticSeverity::Warning, + Some(FidelityImpact::Lossy), + )], + ), + ProjectionQuality::Lossy + ); + assert_eq!( + projection_quality( + true, + &[diagnostic( + "IGNORED_CODE", + DiagnosticSeverity::Error, + Some(FidelityImpact::Failed), + )], + ), + ProjectionQuality::Failed + ); + } + + #[test] + fn unknown_codegen_diagnostics_fail_closed_but_collector_warnings_do_not() { + assert_eq!( + projection_quality( + true, + &[diagnostic( + "DEVUP_CODEGEN_FUTURE_WARNING", + DiagnosticSeverity::Warning, + None, + )], + ), + ProjectionQuality::Approximated + ); + assert_eq!( + projection_quality( + true, + &[diagnostic( + "DEVUP_CODEGEN_FUTURE_ERROR", + DiagnosticSeverity::Error, + None, + )], + ), + ProjectionQuality::Failed + ); + assert_eq!( + projection_quality( + true, + &[diagnostic( + "DEVUP_RESOURCE_UNRESOLVED", + DiagnosticSeverity::Warning, + None, + )], + ), + ProjectionQuality::Exact + ); + } +} diff --git a/crates/devup-mcp/src/server/resources.rs b/crates/devup-mcp/src/server/resources.rs new file mode 100644 index 0000000..f13389b --- /dev/null +++ b/crates/devup-mcp/src/server/resources.rs @@ -0,0 +1,175 @@ +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{DevupError, ErrorCode}; +use rmcp::model::{ + ListResourceTemplatesResult, ListResourcesResult, MetaObject, ReadResourceResult, Resource, + ResourceContents, ResourceTemplate, +}; +use serde_json::Value; + +use super::artifacts::{ArtifactStore, AttachedOutputManifest}; + +const LIST_PAGE_SIZE: usize = 50; + +#[derive(Debug, Clone, PartialEq, Eq)] +enum ResourceAddress { + Manifest { + artifact_id: String, + output_id: String, + }, + Chunk { + artifact_id: String, + output_id: String, + index: usize, + }, +} + +impl ResourceAddress { + fn parse(uri: &str) -> Result { + let path = uri + .strip_prefix("devup://artifact/") + .ok_or_else(not_found)?; + let parts = path.split('/').collect::>(); + if parts.len() < 4 + || parts[1] != "outputs" + || !valid_opaque(parts[0], 43) + || !valid_opaque(parts[2], 22) + { + return Err(not_found()); + } + match parts.as_slice() { + [artifact_id, "outputs", output_id, "manifest"] => Ok(Self::Manifest { + artifact_id: (*artifact_id).to_owned(), + output_id: (*output_id).to_owned(), + }), + [artifact_id, "outputs", output_id, "chunks", index] => { + let index = index.parse::().map_err(|_| not_found())?; + Ok(Self::Chunk { + artifact_id: (*artifact_id).to_owned(), + output_id: (*output_id).to_owned(), + index, + }) + } + _ => Err(not_found()), + } + } +} + +pub async fn list_output_resources( + store: &ArtifactStore, + cursor: Option<&str>, +) -> Result { + let offset = cursor + .map(str::parse::) + .transpose() + .map_err(|_| not_found())? + .unwrap_or(0); + let manifests = store.output_manifests().await; + if offset > manifests.len() { + return Err(not_found()); + } + let end = offset.saturating_add(LIST_PAGE_SIZE).min(manifests.len()); + let resources = manifests[offset..end] + .iter() + .map(manifest_resource) + .collect(); + let mut result = ListResourcesResult::with_all_items(resources); + result.next_cursor = (end < manifests.len()).then(|| end.to_string()); + Ok(result) +} + +pub fn resource_templates() -> ListResourceTemplatesResult { + ListResourceTemplatesResult::with_all_items(vec![ + ResourceTemplate::new( + "devup://artifact/{artifactId}/outputs/{outputId}/manifest", + "devup-output-manifest", + ) + .with_title("Devup output manifest") + .with_description("Bounded metadata for a generated Devup output") + .with_mime_type("application/json"), + ResourceTemplate::new( + "devup://artifact/{artifactId}/outputs/{outputId}/chunks/{index}", + "devup-output-chunk", + ) + .with_title("Devup output chunk") + .with_description("A bounded text or base64 binary chunk of a generated output"), + ]) +} + +pub async fn read_output_resource( + store: &ArtifactStore, + uri: &str, +) -> Result { + match ResourceAddress::parse(uri)? { + ResourceAddress::Manifest { + artifact_id, + output_id, + } => { + let manifest = store + .output_manifest(&artifact_id, &output_id) + .await + .ok_or_else(not_found)?; + let text = serde_json::to_string(&manifest).map_err(|_| not_found())?; + Ok(ReadResourceResult::new(vec![ + ResourceContents::text(text, uri).with_mime_type("application/json"), + ])) + } + ResourceAddress::Chunk { + artifact_id, + output_id, + index, + } => { + let manifest = store + .output_manifest(&artifact_id, &output_id) + .await + .ok_or_else(not_found)?; + let bytes = store + .read_output_chunk(&artifact_id, &output_id, index) + .await + .ok_or_else(not_found)?; + let contents = if manifest.is_binary { + ResourceContents::blob(STANDARD.encode(bytes), uri) + .with_mime_type(manifest.mime_type) + } else { + let text = String::from_utf8(bytes).map_err(|_| not_found())?; + ResourceContents::text(text, uri).with_mime_type(manifest.mime_type) + }; + Ok(ReadResourceResult::new(vec![contents])) + } + } +} + +fn manifest_resource(manifest: &AttachedOutputManifest) -> Resource { + let mut meta = MetaObject::new(); + meta.0.insert( + "payloadMimeType".to_owned(), + Value::from(manifest.mime_type.clone()), + ); + meta.0.insert( + "payloadBytes".to_owned(), + Value::from(manifest.raw_bytes as u64), + ); + meta.0.insert( + "payloadSha256".to_owned(), + Value::from(manifest.sha256.clone()), + ); + Resource::new(&manifest.manifest_uri, format!("devup-{}", manifest.name)) + .with_title(format!("Devup {} output", manifest.name)) + .with_description("Generated Devup output manifest") + .with_mime_type("application/json") + .with_meta(meta) +} + +fn valid_opaque(value: &str, length: usize) -> bool { + value.len() == length + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_')) +} + +fn not_found() -> DevupError { + DevupError::new( + ErrorCode::DevupFigmaHandoffExpired, + "resource not found", + true, + ) +} diff --git a/crates/devup-mcp/src/server/tools.rs b/crates/devup-mcp/src/server/tools.rs new file mode 100644 index 0000000..0d808c2 --- /dev/null +++ b/crates/devup-mcp/src/server/tools.rs @@ -0,0 +1,199 @@ +use rmcp::schemars::JsonSchema; +use schemars::{Schema, SchemaGenerator, json_schema}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct AuthInput { + pub action: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaToUiInput { + pub url: String, + #[serde(default)] + pub component_name: Option, + #[serde(default)] + pub include_diagnostics: bool, + #[serde(default = "default_source_policy")] + pub source_policy: String, + #[serde(default = "default_scope")] + pub scope: String, + #[serde(default = "default_root_layout")] + pub root_layout: String, + #[serde(default)] + pub output_path: Option, + #[serde(default = "default_delivery")] + pub delivery: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaToJsonInput { + pub url: String, + #[serde(default = "default_scope")] + pub scope: String, + #[serde(default)] + pub include_diagnostics: bool, + #[serde(default = "default_source_policy")] + pub source_policy: String, + #[serde(default)] + pub output_path: Option, + #[serde(default = "default_delivery")] + pub delivery: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaExportInput { + #[serde(default)] + pub url: Option, + #[serde(default)] + pub artifact_id: Option, + #[serde(default = "default_outputs")] + pub outputs: Vec, + #[serde(default)] + pub component_name: Option, + #[serde(default)] + pub include_diagnostics: bool, + #[serde(default = "default_source_policy")] + pub source_policy: String, + #[serde(default = "default_scope")] + pub scope: String, + #[serde(default = "default_root_layout")] + pub root_layout: String, + #[serde(default)] + pub strict: bool, + #[serde(default)] + pub refresh: bool, + #[serde(default)] + pub output_paths: BTreeMap, + #[serde(default)] + pub frame_ids: Vec, + #[serde(default)] + pub all_screens: bool, + #[serde(default)] + pub asset_requests: Vec, + #[serde(default = "default_delivery")] + pub delivery: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaAssetRequestInput { + pub asset_id: String, + #[serde(default = "default_asset_format")] + pub format: String, + #[serde(default = "default_asset_scale")] + pub scale: u8, + #[serde(default)] + pub output_path: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct ContinueInput { + pub session_id: String, + pub call_id: String, + // The verbatim result of a host-executed official Figma MCP read call. + // Its shape is dictated by that upstream tool (text, image content + // blocks, nested objects, ...), so the runtime type must stay + // `serde_json::Value` and accept anything. + // + // schemars' blanket `JsonSchema` impl for `Value` maps this to the + // JSON Schema 2020-12 boolean schema `true` ("accept anything"). That + // is spec-legal, but several MCP clients' schema converters assume + // every `properties` entry is a JSON object and reject a boolean value + // outright, which discards the *entire* `tools/list` response, not + // just this tool. `any_json_value_schema` overrides the generated + // schema to keep the identical "accept any JSON" semantics while + // expressing it as the empty object schema `{}`, which every JSON + // Schema 2020-12 consumer can parse. + // + // NOTE: intentionally a plain `//` comment, not `///`: a doc comment + // here would be captured by schemars as this field's schema + // "description" and shipped over the wire on every tools/list call. + #[schemars(schema_with = "any_json_value_schema")] + pub result: serde_json::Value, +} + +// See `ContinueInput::result` above for why this exists instead of relying +// on `serde_json::Value`'s default (boolean) schema. Plain comment for the +// same reason: schemars would otherwise turn `///` into this function's +// stand-in schema "description". +fn any_json_value_schema(_generator: &mut SchemaGenerator) -> Schema { + json_schema!({}) +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaSearchInput { + pub url: String, + pub query: String, + #[serde(default)] + pub node_types: Vec, + #[serde(default = "default_match", rename = "match")] + pub match_kind: String, + #[serde(default = "default_limit")] + pub limit: usize, + #[serde(default = "default_source_policy")] + pub source_policy: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct FigmaExploreInput { + pub url: String, + #[serde(default = "default_explore_limit")] + pub limit: usize, + #[serde(default = "default_true")] + pub include_text_preview: bool, + #[serde(default = "default_source_policy")] + pub source_policy: String, +} + +fn default_scope() -> String { + "node".to_owned() +} + +fn default_root_layout() -> String { + "standalone".to_owned() +} + +fn default_source_policy() -> String { + "auto".to_owned() +} + +fn default_delivery() -> String { + "auto".to_owned() +} + +fn default_match() -> String { + "normalized".to_owned() +} + +fn default_limit() -> usize { + 20 +} + +fn default_explore_limit() -> usize { + 50 +} + +fn default_true() -> bool { + true +} + +fn default_outputs() -> Vec { + vec!["tsx".to_owned(), "devupJson".to_owned()] +} + +fn default_asset_format() -> String { + "png".to_owned() +} + +fn default_asset_scale() -> u8 { + 1 +} diff --git a/crates/devup-mcp/src/server/validation.rs b/crates/devup-mcp/src/server/validation.rs new file mode 100644 index 0000000..48eeb0d --- /dev/null +++ b/crates/devup-mcp/src/server/validation.rs @@ -0,0 +1,194 @@ +use devup_mcp_devup_ui::codegen::RootLayout; +use devup_mcp_figma::{ + AssetFormat, AssetSelection, CollectionScope, DevupError, ErrorCode, ResourceScope, + SourcePolicy, +}; +use serde_json::json; + +use super::{ + artifacts::{ArtifactKind, ArtifactLookup}, + tools::FigmaAssetRequestInput, +}; + +pub(super) fn validate_artifact_projection( + artifact: &ArtifactLookup, + outputs: &[String], + requested_scope: &str, + requested_assets: &[AssetSelection], +) -> Result<(), DevupError> { + let requested_scope = parse_collection_scope(requested_scope)?; + let capabilities = &artifact.capabilities; + let design_output_requested = outputs.iter().any(|output| { + matches!( + output.as_str(), + "tsx" | "rawSnapshot" | "sourceMap" | "assetManifest" | "referencePng" + ) + }); + let theme_requested = outputs.iter().any(|output| output == "devupJson"); + let kind_compatible = match capabilities.kind { + ArtifactKind::Design => true, + ArtifactKind::ThemeOnly => theme_requested && !design_output_requested, + ArtifactKind::SectionIndex => outputs.iter().any(|output| output == "tsx"), + ArtifactKind::Search | ArtifactKind::Explore => false, + }; + let collection_compatible = collection_scope_rank(requested_scope) + <= collection_scope_rank(capabilities.collection_scope); + let resources_compatible = !theme_requested + || match requested_scope { + CollectionScope::File => capabilities.resource_scope == ResourceScope::File, + CollectionScope::Node | CollectionScope::Page => { + capabilities.resource_scope != ResourceScope::None + } + }; + let assets_compatible = capabilities.supports_asset_captures(requested_assets); + let reference_png_compatible = + !outputs.iter().any(|output| output == "referencePng") || capabilities.reference_png; + + if kind_compatible + && collection_compatible + && resources_compatible + && assets_compatible + && reference_png_compatible + { + return Ok(()); + } + + Err(DevupError::with_details( + ErrorCode::DevupFigmaHandoffInvalid, + "artifact capture capability가 요청한 export 범위를 충족하지 않습니다.", + false, + json!({ + "capabilities": capabilities, + "requested": { + "outputs": outputs, + "collectionScope": requested_scope, + "assetCaptureCount": requested_assets.len() + } + }), + )) +} + +fn collection_scope_rank(scope: CollectionScope) -> u8 { + match scope { + CollectionScope::Node => 0, + CollectionScope::Page => 1, + CollectionScope::File => 2, + } +} + +pub(super) fn validate_outputs(outputs: &[String]) -> Result<(), DevupError> { + if outputs.is_empty() { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "outputs는 하나 이상이어야 합니다.", + false, + )); + } + for output in outputs { + if !matches!( + output.as_str(), + "tsx" | "devupJson" | "rawSnapshot" | "sourceMap" | "assetManifest" | "referencePng" + ) { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + format!("지원하지 않는 export output입니다: {output}"), + false, + )); + } + } + Ok(()) +} + +pub(super) fn parse_source_policy(policy: &str) -> Result { + match policy { + "auto" => Ok(SourcePolicy::Auto), + "direct" => Ok(SourcePolicy::Direct), + "host" => Ok(SourcePolicy::Host), + _ => Err(DevupError::new( + ErrorCode::DevupFigmaHostRequired, + "sourcePolicy는 auto, direct 또는 host여야 합니다.", + false, + )), + } +} + +pub(super) fn parse_asset_requests( + requests: &[FigmaAssetRequestInput], +) -> Result< + ( + Vec, + std::collections::BTreeMap, + ), + DevupError, +> { + if requests.len() > 16 { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "한 번에 export할 asset은 16개 이하여야 합니다.", + false, + )); + } + let mut seen = std::collections::BTreeSet::new(); + let mut selections = Vec::with_capacity(requests.len()); + let mut output_paths = std::collections::BTreeMap::new(); + for request in requests { + if request.asset_id.trim().is_empty() + || request.scale == 0 + || request.scale > 4 + || !seen.insert(request.asset_id.as_str()) + { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "assetRequests의 ID, scale 또는 중복 값이 올바르지 않습니다.", + false, + )); + } + let format = match request.format.as_str() { + "png" => AssetFormat::Png, + "jpg" | "jpeg" => AssetFormat::Jpg, + "svg" => AssetFormat::Svg, + "pdf" => AssetFormat::Pdf, + _ => { + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "asset format은 png, jpg, svg 또는 pdf여야 합니다.", + false, + )); + } + }; + selections.push(AssetSelection { + asset_id: request.asset_id.clone(), + format, + scale: request.scale, + }); + if let Some(path) = &request.output_path { + output_paths.insert(request.asset_id.clone(), path.clone()); + } + } + Ok((selections, output_paths)) +} + +pub(super) fn parse_collection_scope(scope: &str) -> Result { + match scope { + "node" => Ok(CollectionScope::Node), + "page" => Ok(CollectionScope::Page), + "file" => Ok(CollectionScope::File), + _ => Err(DevupError::new( + ErrorCode::DevupThemeConflict, + "scope는 node, page 또는 file이어야 합니다.", + false, + )), + } +} + +pub(super) fn parse_root_layout(root_layout: &str) -> Result { + match root_layout { + "standalone" => Ok(RootLayout::Standalone), + "embedded" => Ok(RootLayout::Embedded), + _ => Err(DevupError::new( + ErrorCode::DevupThemeConflict, + "rootLayout은 standalone 또는 embedded여야 합니다.", + false, + )), + } +} diff --git a/crates/devup-mcp/tests/artifact_cache.rs b/crates/devup-mcp/tests/artifact_cache.rs new file mode 100644 index 0000000..fdf2531 --- /dev/null +++ b/crates/devup-mcp/tests/artifact_cache.rs @@ -0,0 +1,341 @@ +use std::{ + collections::BTreeMap, + sync::{ + Arc, + atomic::{AtomicU64, AtomicUsize, Ordering}, + }, + time::Duration, +}; + +use devup_mcp::server::artifacts::{ + ArtifactClock, ArtifactKind, ArtifactLimits, ArtifactRequestKey, ArtifactStore, +}; +use devup_mcp_figma::{ + AssetFormat, AssetSelection, CollectedPayload, CollectionRequest, CollectionScope, + CollectionStats, ExploreReadOptions, FigmaTarget, PayloadCompleteness, ResourceScope, + SearchReadOptions, SectionReadOptions, Snapshot, SourcePolicy, +}; +use serde_json::json; + +#[derive(Debug, Default)] +struct FakeClock(AtomicU64); + +impl FakeClock { + fn set(&self, seconds: u64) { + self.0.store(seconds, Ordering::SeqCst); + } +} + +impl ArtifactClock for FakeClock { + fn now_epoch_seconds(&self) -> u64 { + self.0.load(Ordering::SeqCst) + } +} + +fn limits() -> ArtifactLimits { + ArtifactLimits { + ttl: Duration::from_secs(10), + max_entries: 2, + max_entry_bytes: 64 * 1024, + max_total_bytes: 64 * 1024, + } +} + +fn request(file_key: &str, node_id: &str) -> CollectionRequest { + let mut request = CollectionRequest::new( + FigmaTarget { + file_key: file_key.to_owned(), + node_id: Some(node_id.to_owned()), + branch_key: None, + }, + CollectionScope::Node, + ); + request.resource_scope = ResourceScope::Used; + request +} + +fn payload(file_key: &str, node_id: &str, marker: &str) -> CollectedPayload { + CollectedPayload { + target: FigmaTarget { + file_key: file_key.to_owned(), + node_id: Some(node_id.to_owned()), + branch_key: None, + }, + scope: CollectionScope::Node, + metadata: json!({"marker": marker}), + snapshot: Snapshot { + file_key: file_key.to_owned(), + version: Some("1".to_owned()), + roots: vec![node_id.to_owned()], + nodes: BTreeMap::new(), + diagnostics: Vec::new(), + }, + variables: None, + styles: None, + completeness: PayloadCompleteness::ResolvedValuesOnly, + source_version: Some("1".to_owned()), + stats: CollectionStats::default(), + assets: Vec::new(), + reference_png: None, + } +} + +#[tokio::test] +async fn artifact_lookup_preserves_capture_capabilities() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(limits()); + + let design_request = request("design-file", "1:1"); + let design = store + .insert( + ArtifactRequestKey::from_collection(&design_request, SourcePolicy::Direct), + payload("design-file", "1:1", "design"), + ) + .await?; + assert_eq!(design.capabilities.kind, ArtifactKind::Design); + assert_eq!(design.capabilities.collection_scope, CollectionScope::Node); + assert_eq!(design.capabilities.resource_scope, ResourceScope::Used); + + let mut theme_request = request("theme-file", "2:2"); + theme_request.scope = CollectionScope::File; + theme_request.resource_scope = ResourceScope::File; + theme_request.variables_only = true; + let theme = store + .insert( + ArtifactRequestKey::from_collection(&theme_request, SourcePolicy::Direct), + payload("theme-file", "2:2", "theme"), + ) + .await?; + assert_eq!(theme.capabilities.kind, ArtifactKind::ThemeOnly); + assert_eq!(theme.capabilities.collection_scope, CollectionScope::File); + assert_eq!(theme.capabilities.resource_scope, ResourceScope::File); + + let mut search_request = request("search-file", "3:3"); + search_request.scope = CollectionScope::File; + search_request.search = Some(SearchReadOptions { + query: "screen".to_owned(), + node_types: Vec::new(), + match_kind: "contains".to_owned(), + limit: 10, + }); + let search = store + .insert( + ArtifactRequestKey::from_collection(&search_request, SourcePolicy::Direct), + payload("search-file", "3:3", "search"), + ) + .await?; + assert_eq!(search.capabilities.kind, ArtifactKind::Search); + + let mut explore_request = request("explore-file", "4:4"); + explore_request.resource_scope = ResourceScope::None; + explore_request.explore = Some(ExploreReadOptions::default()); + let explore = store + .insert( + ArtifactRequestKey::from_collection(&explore_request, SourcePolicy::Direct), + payload("explore-file", "4:4", "explore"), + ) + .await?; + assert_eq!(explore.capabilities.kind, ArtifactKind::Explore); + Ok(()) +} + +#[tokio::test] +async fn reuses_same_request_until_expiry_and_refresh_bypasses_it() -> anyhow::Result<()> { + let clock = Arc::new(FakeClock::default()); + clock.set(100); + let store = ArtifactStore::with_clock(clock.clone(), limits()); + let key = + ArtifactRequestKey::from_collection(&request("file-one", "1:2"), SourcePolicy::Direct); + let calls = AtomicUsize::new(0); + + let first = store + .get_or_acquire(key.clone(), false, || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "first")) + }) + .await?; + let hit = store + .get_or_acquire(key.clone(), false, || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "unexpected")) + }) + .await?; + + assert_eq!(first.artifact_id, hit.artifact_id); + assert!(!first.cache_hit); + assert!(hit.cache_hit); + assert_eq!(calls.load(Ordering::SeqCst), 1); + + let refreshed = store + .get_or_acquire(key.clone(), true, || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "refresh")) + }) + .await?; + assert_ne!(refreshed.artifact_id, first.artifact_id); + assert_eq!(calls.load(Ordering::SeqCst), 2); + + clock.set(111); + let expired = store + .get_or_acquire(key, false, || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "expired")) + }) + .await?; + assert_ne!(expired.artifact_id, refreshed.artifact_id); + assert_eq!(calls.load(Ordering::SeqCst), 3); + Ok(()) +} + +#[tokio::test] +async fn evicts_lru_entries_by_count_and_aggregate_bytes() -> anyhow::Result<()> { + let clock = Arc::new(FakeClock::default()); + clock.set(100); + let mut bounded = limits(); + let sample_bytes = serde_json::to_vec(&payload("file-one", "1:1", "a"))?.len(); + bounded.max_total_bytes = sample_bytes * 2 + 16; + let store = ArtifactStore::with_clock(clock, bounded); + + let one = store + .insert( + ArtifactRequestKey::from_collection(&request("file-one", "1:1"), SourcePolicy::Direct), + payload("file-one", "1:1", "a"), + ) + .await?; + let two = store + .insert( + ArtifactRequestKey::from_collection(&request("file-two", "2:2"), SourcePolicy::Direct), + payload("file-two", "2:2", "b"), + ) + .await?; + store.get(&one.artifact_id).await.expect("touch first"); + let three = store + .insert( + ArtifactRequestKey::from_collection( + &request("file-three", "3:3"), + SourcePolicy::Direct, + ), + payload("file-three", "3:3", "c"), + ) + .await?; + + assert!(store.get(&one.artifact_id).await.is_some()); + assert!(store.get(&two.artifact_id).await.is_none()); + assert!(store.get(&three.artifact_id).await.is_some()); + let stats = store.stats().await; + assert_eq!(stats.entry_count, 2); + assert!(stats.total_bytes <= bounded.max_total_bytes); + Ok(()) +} + +#[tokio::test] +async fn concurrent_same_key_requests_share_one_acquisition() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(limits()); + let key = + ArtifactRequestKey::from_collection(&request("file-one", "1:2"), SourcePolicy::Direct); + let calls = Arc::new(AtomicUsize::new(0)); + let barrier = Arc::new(tokio::sync::Barrier::new(3)); + + let spawn = |store: ArtifactStore| { + let key = key.clone(); + let calls = calls.clone(); + let barrier = barrier.clone(); + tokio::spawn(async move { + barrier.wait().await; + store + .get_or_acquire(key, false, || async { + calls.fetch_add(1, Ordering::SeqCst); + tokio::task::yield_now().await; + Ok(payload("file-one", "1:2", "shared")) + }) + .await + }) + }; + let left = spawn(store.clone()); + let right = spawn(store); + barrier.wait().await; + let (left, right) = tokio::try_join!(left, right)?; + let left = left?; + let right = right?; + + assert_eq!(left.artifact_id, right.artifact_id); + assert_eq!(calls.load(Ordering::SeqCst), 1); + assert!(left.cache_hit ^ right.cache_hit); + Ok(()) +} + +#[tokio::test] +async fn set_like_capture_and_section_inputs_share_one_cache_key() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(limits()); + let png = AssetSelection { + asset_id: "1:2:fills:1".to_owned(), + format: AssetFormat::Png, + scale: 2, + }; + let svg = AssetSelection { + asset_id: "1:3:fills:1".to_owned(), + format: AssetFormat::Svg, + scale: 1, + }; + let mut left = request("file-one", "1:2"); + left.asset_selections = vec![svg.clone(), png.clone(), png.clone()]; + left.section = Some(SectionReadOptions { + frame_ids: vec!["10:3".to_owned(), "10:2".to_owned(), "10:3".to_owned()], + all_screens: false, + }); + let mut right = request("file-one", "1:2"); + right.asset_selections = vec![png, svg]; + right.section = Some(SectionReadOptions { + frame_ids: vec!["10:2".to_owned(), "10:3".to_owned()], + all_screens: false, + }); + let calls = AtomicUsize::new(0); + + let first = store + .get_or_acquire( + ArtifactRequestKey::from_collection(&left, SourcePolicy::Direct), + false, + || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "canonical")) + }, + ) + .await?; + let second = store + .get_or_acquire( + ArtifactRequestKey::from_collection(&right, SourcePolicy::Direct), + false, + || async { + calls.fetch_add(1, Ordering::SeqCst); + Ok(payload("file-one", "1:2", "duplicate")) + }, + ) + .await?; + + assert_eq!(first.artifact_id, second.artifact_id); + assert_eq!(second.capabilities.asset_capture_count, 2); + assert_eq!(calls.load(Ordering::SeqCst), 1); + Ok(()) +} + +#[tokio::test] +async fn safe_keys_and_stats_never_serialize_url_credentials_or_payloads() -> anyhow::Result<()> { + let target = FigmaTarget::parse( + "https://www.figma.com/design/file-one/Example?node-id=1-2&access_token=super-secret", + )?; + let key = ArtifactRequestKey::from_collection( + &CollectionRequest::new(target, CollectionScope::Node), + SourcePolicy::Auto, + ); + let key_json = serde_json::to_string(&key)?; + assert!(!key_json.contains("super-secret")); + assert!(!key_json.contains("access_token")); + + let store = ArtifactStore::with_limits(limits()); + store + .insert(key, payload("file-one", "1:2", "private payload value")) + .await?; + let stats_json = serde_json::to_string(&store.stats().await)?; + assert!(!stats_json.contains("private payload value")); + assert!(!stats_json.contains("super-secret")); + Ok(()) +} diff --git a/crates/devup-mcp/tests/cli.rs b/crates/devup-mcp/tests/cli.rs new file mode 100644 index 0000000..9cb6e5d --- /dev/null +++ b/crates/devup-mcp/tests/cli.rs @@ -0,0 +1,71 @@ +use std::{ffi::OsString, fs, process::Command}; + +use devup_mcp::{CliAction, parse_cli_args}; + +#[test] +fn version_flag_reports_the_installed_binary_version() { + let output = Command::new(env!("CARGO_BIN_EXE_devup-mcp")) + .arg("--version") + .output() + .expect("run devup-mcp --version"); + + assert!(output.status.success()); + assert_eq!( + String::from_utf8(output.stdout).expect("UTF-8 version output"), + format!("devup-mcp {}\n", env!("CARGO_PKG_VERSION")) + ); + assert!(output.stderr.is_empty()); +} + +#[test] +fn repeated_allowed_write_roots_are_validated_before_stdio() -> anyhow::Result<()> { + let base = std::env::temp_dir().join(format!("devup-mcp-cli-roots-{}", std::process::id())); + let first = base.join("first"); + let second = base.join("second"); + fs::create_dir_all(&first)?; + fs::create_dir_all(&second)?; + + let action = parse_cli_args([ + OsString::from("--allow-write-root"), + first.clone().into_os_string(), + OsString::from("--allow-write-root"), + second.clone().into_os_string(), + ])?; + + let CliAction::Serve(config) = action else { + panic!("write roots must start the server") + }; + assert_eq!(config.allowed_write_roots, vec![first, second]); + + fs::remove_dir_all(base)?; + Ok(()) +} + +#[test] +fn invalid_cli_arguments_fail_without_starting_stdio() -> anyhow::Result<()> { + let file = std::env::temp_dir().join(format!("devup-mcp-cli-file-{}", std::process::id())); + fs::write(&file, b"not a directory")?; + + assert!(parse_cli_args([OsString::from("--unknown")]).is_err()); + assert!(parse_cli_args([OsString::from("--allow-write-root")]).is_err()); + assert!( + parse_cli_args([ + OsString::from("--allow-write-root"), + file.clone().into_os_string() + ]) + .is_err() + ); + + fs::remove_file(file)?; + Ok(()) +} + +#[test] +fn no_arguments_use_the_startup_current_directory() -> anyhow::Result<()> { + let action = parse_cli_args(std::iter::empty::())?; + let CliAction::Serve(config) = action else { + panic!("no arguments must start the server") + }; + assert_eq!(config.allowed_write_roots, vec![std::env::current_dir()?]); + Ok(()) +} diff --git a/crates/devup-mcp/tests/composite_export.rs b/crates/devup-mcp/tests/composite_export.rs new file mode 100644 index 0000000..2d24883 --- /dev/null +++ b/crates/devup-mcp/tests/composite_export.rs @@ -0,0 +1,906 @@ +use std::{ + fs, + path::PathBuf, + sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, + }, + time::{SystemTime, UNIX_EPOCH}, +}; + +use async_trait::async_trait; +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp::server::{DevupAuth, DevupServer, Services}; +use devup_mcp_figma::{ + AuthStatus, BuiltinScript, DevupError, ErrorCode, FigmaUpstream, ReadToolCall, UpstreamResult, +}; +use rmcp::{ + ServiceExt, + model::{ + CallToolRequestParams, CallToolResult, ContentBlock, ReadResourceRequestParams, + ResourceContents, + }, +}; +use serde_json::{Map, Value, json}; + +#[derive(Debug)] +struct ConnectedAuth; + +#[async_trait] +impl DevupAuth for ConnectedAuth { + async fn status(&self) -> Result { + Ok(AuthStatus::Connected) + } + + async fn login(&self) -> Result { + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +#[derive(Debug)] +struct FastFixtureUpstream { + calls: AtomicUsize, + partial: bool, + lossy: bool, +} + +impl FastFixtureUpstream { + fn complete() -> Self { + Self { + calls: AtomicUsize::new(0), + partial: false, + lossy: false, + } + } + + fn partial() -> Self { + Self { + calls: AtomicUsize::new(0), + partial: true, + lossy: false, + } + } + + fn lossy() -> Self { + Self { + calls: AtomicUsize::new(0), + partial: false, + lossy: true, + } + } +} + +#[async_trait] +impl FigmaUpstream for FastFixtureUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["get_screenshot".to_owned(), "use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + self.calls.fetch_add(1, Ordering::SeqCst); + match call { + ReadToolCall::Snapshot { + script: BuiltinScript::FastSnapshotEnvelope, + .. + } => Ok(fast_envelope_result(self.partial, self.lossy)), + ReadToolCall::AssetExport { + version, request, .. + } => Ok(asset_export_result(version.as_deref(), &request)), + ReadToolCall::Screenshot { .. } => Ok(UpstreamResult { + raw: json!({ + "content": [{ + "type": "image", + "mimeType": "image/png", + "data": reference_png_base64() + }] + }), + }), + _ => Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "composite export must stay on the one-call fast path", + false, + )), + } + } +} + +#[tokio::test] +async fn reference_png_is_acquired_once_and_delivered_as_a_binary_resource() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::complete()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let acquired = call( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["referencePng"], + "sourcePolicy": "direct" + }), + ) + .await?; + + assert_eq!(acquired["collection"]["figmaToolCalls"], 2); + assert_eq!(acquired["referencePng"]["mimeType"], "image/png"); + assert_eq!( + acquired["referencePng"]["dataBase64"], + reference_png_base64() + ); + assert_eq!(acquired["cache"]["capabilities"]["referencePng"], true); + let artifact_id = acquired["cache"]["artifactId"].as_str().unwrap(); + + let delivered_result = call_result( + &client, + "devup_figma_export", + json!({ + "artifactId": artifact_id, + "outputs": ["referencePng"], + "delivery": "resource" + }), + ) + .await?; + let delivered = delivered_result + .structured_content + .as_ref() + .expect("structured compatibility summary"); + assert!(delivered.get("referencePng").is_none()); + assert_eq!(delivered["resources"][0]["mimeType"], "image/png"); + let manifest_uri = delivered["resources"][0]["uri"].as_str().unwrap(); + let link = delivered_result + .content + .iter() + .filter_map(ContentBlock::as_resource_link) + .find(|link| link.uri == manifest_uri) + .expect("native manifest resource link"); + assert_eq!(link.mime_type.as_deref(), Some("application/json")); + assert_eq!(link.size, None); + assert_eq!( + link.meta + .as_ref() + .and_then(|meta| meta.0.get("payloadMimeType")) + .and_then(Value::as_str), + Some("image/png") + ); + let wire = serde_json::to_value(&delivered_result)?; + assert!(wire["content"].as_array().is_some_and(|content| { + content + .iter() + .any(|block| block["type"] == "resource_link" && block["uri"] == manifest_uri) + })); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + + client.cancel().await?; + task.await??; + Ok(()) +} + +async fn call( + client: &rmcp::service::RunningService, + name: &str, + arguments: Value, +) -> anyhow::Result { + Ok(call_result(client, name, arguments) + .await? + .structured_content + .expect("structured tool output")) +} + +async fn call_result( + client: &rmcp::service::RunningService, + name: &str, + arguments: Value, +) -> anyhow::Result { + let arguments: Map = arguments.as_object().cloned().unwrap(); + Ok(client + .call_tool(CallToolRequestParams::new(name.to_owned()).with_arguments(arguments)) + .await?) +} + +#[tokio::test] +async fn one_acquisition_projects_all_outputs_and_artifact_reuse_is_zero_call() -> anyhow::Result<()> +{ + let upstream = Arc::new(FastFixtureUpstream::complete()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let url = "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2"; + + let first = call( + &client, + "devup_figma_export", + json!({ + "url": url, + "outputs": ["tsx", "devupJson", "rawSnapshot", "sourceMap", "assetManifest"], + "scope": "node", + "sourcePolicy": "direct", + "includeDiagnostics": true + }), + ) + .await?; + + assert_eq!(first["status"], "complete"); + assert_eq!(first["collection"]["figmaToolCalls"], 1); + assert_eq!(first["cache"]["cacheHit"], false); + assert!(first["cache"]["artifactId"].as_str().is_some()); + assert!(first["tsx"].as_str().unwrap().contains("$primary")); + assert!(first["devupJson"].as_str().unwrap().contains("\"primary\"")); + assert_eq!(first["rawSnapshot"]["roots"], json!(["1:2"])); + assert_eq!(first["sourceMap"]["version"], 1); + assert_eq!( + first["assetManifest"]["assets"][0]["assetId"], + "1:2:fills:1" + ); + assert_eq!(first["assetManifest"]["assets"][0]["status"], "available"); + assert!(first["sourceMap"]["tsx"].as_array().is_some_and(|entries| { + entries.iter().any(|entry| { + entry["nodeId"] == "1:2" && entry["property"] == "fills" && entry["variableId"] == "v" + }) + })); + assert!( + first["sourceMap"]["devupJson"] + .as_array() + .is_some_and(|entries| entries.iter().any(|entry| { + entry["jsonPointer"] == "/theme/colors/default/primary" + && entry["variableId"] == "v" + })) + ); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + let artifact_id = first["cache"]["artifactId"].as_str().unwrap(); + let projected = call( + &client, + "devup_figma_export", + json!({ + "artifactId": artifact_id, + "outputs": ["tsx"], + "rootLayout": "embedded" + }), + ) + .await?; + assert_eq!(projected["cache"]["cacheHit"], true); + assert_eq!(projected["cache"]["artifactId"], artifact_id); + assert!(projected.get("devupJson").is_none()); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + let resource = call( + &client, + "devup_figma_export", + json!({ + "artifactId": artifact_id, + "outputs": ["tsx"], + "delivery": "resource" + }), + ) + .await?; + assert!(resource.get("tsx").is_none()); + let manifest_uri = resource["resources"][0]["uri"].as_str().unwrap(); + let manifest = client + .read_resource(ReadResourceRequestParams::new(manifest_uri)) + .await?; + let ResourceContents::TextResourceContents { text, .. } = &manifest.contents[0] else { + panic!("resource manifest must be text") + }; + let manifest: Value = serde_json::from_str(text)?; + assert_eq!(manifest["name"], "tsx"); + assert_eq!(manifest["mimeType"], "text/typescript"); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + let ui_wrapper = call( + &client, + "devup_figma_to_ui", + json!({"url": url, "sourcePolicy": "direct"}), + ) + .await?; + let json_wrapper = call( + &client, + "devup_figma_to_json", + json!({"url": url, "scope": "node", "sourcePolicy": "direct"}), + ) + .await?; + assert_eq!(ui_wrapper["cache"]["cacheHit"], true); + assert_eq!(json_wrapper["cache"]["cacheHit"], true); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + let refreshed = call( + &client, + "devup_figma_export", + json!({ + "url": url, + "outputs": ["rawSnapshot"], + "scope": "node", + "sourcePolicy": "direct", + "refresh": true + }), + ) + .await?; + assert_eq!(refreshed["cache"]["cacheHit"], false); + assert_ne!(refreshed["cache"]["artifactId"], artifact_id); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn artifact_reuse_rejects_file_theme_beyond_captured_scope() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::complete()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(128 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let acquired = call( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["tsx"], + "scope": "node", + "sourcePolicy": "direct" + }), + ) + .await?; + let artifact_id = acquired["cache"]["artifactId"].as_str().unwrap(); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + let incompatible = client + .call_tool( + CallToolRequestParams::new("devup_figma_export").with_arguments( + json!({ + "artifactId": artifact_id, + "outputs": ["devupJson"], + "scope": "file" + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + + let error = incompatible.expect_err("node artifact must not impersonate file theme capture"); + assert!( + error.to_string().contains("DEVUP_FIGMA_HANDOFF_INVALID"), + "unexpected capability error: {error}" + ); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 1); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn explicit_asset_request_exports_once_and_returns_validated_binary() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::complete()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let result = call( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["tsx", "assetManifest"], + "sourcePolicy": "direct", + "assetRequests": [{"assetId":"1:2:fills:1","format":"png","scale":2}] + }), + ) + .await?; + + assert_eq!(result["status"], "complete"); + assert_eq!(result["collection"]["figmaToolCalls"], 2); + assert_eq!(result["assetManifest"]["assets"][0]["status"], "exported"); + assert_eq!( + result["assetManifest"]["assets"][0]["dataBase64"], + STANDARD.encode(b"synthetic-png") + ); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn resource_asset_manifest_reconstructs_the_exact_independent_binary() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::complete()); + let root = unique_temp_dir("asset-resource")?; + let output_path = root.join("asset.png"); + let server = DevupServer::with_output_roots( + Services::new(Arc::new(ConnectedAuth), upstream.clone()), + vec![root.clone()], + )?; + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let result = call_result( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["assetManifest"], + "sourcePolicy": "direct", + "delivery": "resource", + "assetRequests": [{ + "assetId":"1:2:fills:1", + "format":"png", + "scale":2, + "outputPath": output_path.to_string_lossy() + }] + }), + ) + .await?; + let structured = result + .structured_content + .as_ref() + .expect("structured compatibility summary"); + let summaries = structured["resources"].as_array().unwrap(); + assert_eq!(summaries.len(), 2, "manifest plus one binary asset"); + let manifest_uri = summaries + .iter() + .find(|item| item["name"] == "asset-manifest.json") + .and_then(|item| item["uri"].as_str()) + .unwrap(); + let manifest_bytes = read_resource_bytes(&client, manifest_uri).await?; + let manifest: Value = serde_json::from_slice(&manifest_bytes)?; + let resource = &manifest["assets"][0]["resource"]; + let asset_uri = resource["uri"].as_str().expect("asset resource URI"); + assert_eq!(resource["mimeType"], "image/png"); + assert_eq!(resource["byteLength"], b"synthetic-png".len()); + assert_eq!( + resource["sha256"], + "294ad7145322ec19f8250cca8480a933f1ce8c9e2ad1038e7ae8930d55a6598a" + ); + assert!(manifest["assets"][0].get("dataBase64").is_none()); + + let resource_bytes = read_resource_bytes(&client, asset_uri).await?; + assert_eq!(resource_bytes, b"synthetic-png"); + assert_eq!(fs::read(&output_path)?, resource_bytes); + let asset_links = result + .content + .iter() + .filter_map(ContentBlock::as_resource_link) + .filter(|link| { + link.meta + .as_ref() + .and_then(|meta| meta.0.get("payloadMimeType")) + .and_then(Value::as_str) + == Some("image/png") + }) + .collect::>(); + assert_eq!(asset_links.len(), 1); + assert_eq!(asset_links[0].uri, asset_uri); + assert_eq!( + asset_links[0].mime_type.as_deref(), + Some("application/json") + ); + assert_eq!(asset_links[0].size, None); + assert_eq!( + asset_links[0] + .meta + .as_ref() + .and_then(|meta| meta.0.get("payloadSha256")) + .and_then(Value::as_str), + Some("294ad7145322ec19f8250cca8480a933f1ce8c9e2ad1038e7ae8930d55a6598a") + ); + let calls_after_first_export = upstream.calls.load(Ordering::SeqCst); + + let reused = call_result( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["assetManifest"], + "sourcePolicy": "direct", + "delivery": "resource", + "assetRequests": [{ + "assetId":"1:2:fills:1", + "format":"png", + "scale":2, + "outputPath": output_path.to_string_lossy() + }] + }), + ) + .await?; + let reused_structured = reused + .structured_content + .as_ref() + .expect("reused structured compatibility summary"); + let reused_resources = reused_structured["resources"].as_array().unwrap(); + let reused_manifest_uri = reused_resources + .iter() + .find(|resource| resource["name"] == "asset-manifest.json") + .and_then(|resource| resource["uri"].as_str()) + .expect("reused asset manifest URI"); + let reused_manifest: Value = + serde_json::from_slice(&read_resource_bytes(&client, reused_manifest_uri).await?)?; + let reused_asset_uri = reused_manifest["assets"][0]["resource"]["uri"] + .as_str() + .expect("reused asset resource URI"); + assert!( + reused_resources + .iter() + .any(|resource| resource["uri"] == reused_asset_uri), + "the reused manifest must reference the actually reused resource" + ); + assert_eq!( + read_resource_bytes(&client, reused_asset_uri).await?, + resource_bytes + ); + assert_eq!( + upstream.calls.load(Ordering::SeqCst), + calls_after_first_export, + "resource projection reuse must not reacquire the Figma payload" + ); + + client.cancel().await?; + task.await??; + fs::remove_dir_all(root)?; + Ok(()) +} + +async fn read_resource_bytes( + client: &rmcp::service::RunningService, + manifest_uri: &str, +) -> anyhow::Result> { + let manifest = client + .read_resource(ReadResourceRequestParams::new(manifest_uri)) + .await?; + let ResourceContents::TextResourceContents { text, .. } = &manifest.contents[0] else { + anyhow::bail!("resource manifest must be JSON text") + }; + let manifest: Value = serde_json::from_str(text)?; + let mut bytes = Vec::new(); + for index in 0..manifest["chunkCount"].as_u64().unwrap() { + let chunk_uri = format!( + "devup://artifact/{}/outputs/{}/chunks/{index}", + manifest["artifactId"].as_str().unwrap(), + manifest["outputId"].as_str().unwrap() + ); + let chunk = client + .read_resource(ReadResourceRequestParams::new(chunk_uri)) + .await?; + match &chunk.contents[0] { + ResourceContents::TextResourceContents { text, .. } => { + bytes.extend_from_slice(text.as_bytes()); + } + ResourceContents::BlobResourceContents { blob, .. } => { + bytes.extend_from_slice(&STANDARD.decode(blob.as_bytes())?); + } + _ => anyhow::bail!("unsupported resource content"), + } + } + Ok(bytes) +} + +fn unique_temp_dir(label: &str) -> anyhow::Result { + let path = std::env::temp_dir().join(format!( + "devup-mcp-{label}-{}-{}", + std::process::id(), + SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + )); + fs::create_dir_all(&path)?; + Ok(path) +} + +#[tokio::test] +async fn artifact_reuse_rejects_a_different_asset_format_or_scale() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::complete()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let acquired = call( + &client, + "devup_figma_export", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["assetManifest"], + "sourcePolicy": "direct", + "assetRequests": [{"assetId":"1:2:fills:1","format":"png","scale":2}] + }), + ) + .await?; + let artifact_id = acquired["cache"]["artifactId"].as_str().unwrap(); + assert_eq!(acquired["cache"]["capabilities"]["assetCaptureCount"], 1); + assert!(!serde_json::to_string(&acquired["cache"]["capabilities"])?.contains("1:2:fills:1")); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + + for request in [ + json!({"assetId":"1:2:fills:1","format":"svg","scale":2}), + json!({"assetId":"1:2:fills:1","format":"png","scale":1}), + ] { + let reused = client + .call_tool( + CallToolRequestParams::new("devup_figma_export").with_arguments( + json!({ + "artifactId": artifact_id, + "outputs": ["assetManifest"], + "assetRequests": [request] + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + let error = reused.expect_err("asset capture reuse requires the exact format and scale"); + assert!( + error.to_string().contains("DEVUP_FIGMA_HANDOFF_INVALID"), + "unexpected capture mismatch error: {error}" + ); + } + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn strict_export_rejects_partial_payload_before_projection() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::partial()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream)); + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + + let result = client + .call_tool( + CallToolRequestParams::new("devup_figma_export").with_arguments( + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["rawSnapshot"], + "sourcePolicy": "direct", + "strict": true + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + + let error = result.expect_err("strict partial export must fail"); + assert!( + error.to_string().contains("partial"), + "unexpected strict error: {error}" + ); + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn strict_tsx_export_rejects_lossy_projection() -> anyhow::Result<()> { + let upstream = Arc::new(FastFixtureUpstream::lossy()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream)); + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let output_path = std::env::temp_dir().join(format!( + "devup-mcp-strict-lossy-{}-{}.tsx", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH)? + .as_nanos() + )); + + let result = client + .call_tool( + CallToolRequestParams::new("devup_figma_export").with_arguments( + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "outputs": ["tsx"], + "sourcePolicy": "direct", + "strict": true, + "outputPaths": {"tsx": output_path.to_string_lossy()} + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + + let error = result.expect_err("strict lossy export must fail"); + assert!( + error.to_string().contains("lossy"), + "unexpected strict error: {error}" + ); + let wrote_rejected_output = output_path.exists(); + if wrote_rejected_output { + std::fs::remove_file(&output_path)?; + } + assert!( + !wrote_rejected_output, + "strict rejection must not write output files" + ); + client.cancel().await?; + task.await??; + Ok(()) +} + +fn fast_envelope_result(partial: bool, lossy: bool) -> UpstreamResult { + let mut envelope = json!({ + "schemaVersion": 1, + "source": {"fileKey": "FileKey123", "rootId": "1:2"}, + "snapshot": { + "fileKey": "FileKey123", + "version": "v1", + "rootIds": ["1:2"], + "nodes": [{ + "id": "1:2", + "type": "FRAME", + "fields": { + "name": "Synthetic", + "childrenIds": [], + "layoutMode": "VERTICAL", + "width": 320, + "height": 240, + "fills": [{ + "type": "SOLID", + "color": {"r": 0, "g": 0.4, "b": 1, "a": 1}, + "boundVariables": {"color": {"type": "VARIABLE_ALIAS", "id": "v"}} + }, {"type":"IMAGE","imageHash":"image-hash-123","scaleMode":"FILL"}], + "boundVariables": {"fills": [{"type": "VARIABLE_ALIAS", "id": "v"}]} + }, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + }, + "resources": { + "collections": [{ + "id": "c", "name": "Theme", "defaultModeId": "m", + "modes": [{"modeId": "m", "name": "Default"}] + }], + "variables": [{ + "id": "v", "name": "primary", "resolvedType": "COLOR", + "variableCollectionId": "c", "codeSyntax": {"WEB": "primary"}, + "valuesByMode": {"m": {"r": 0, "g": 0.4, "b": 1, "a": 1}} + }], + "styles": [], + "usedVariableIds": ["v"], + "usedStyleIds": [], + "usedRemoteVariables": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "nodeCount": 1, + "variableRefCount": 1, + "styleRefCount": 0, + "utf8Bytes": 0 + } + }); + if partial { + envelope["resources"]["variables"] = json!([]); + envelope["resources"]["unresolved"] = json!([{ + "id": "v", "kind": "variable", "reason": "fixture-unresolved" + }]); + } + if lossy { + envelope["snapshot"]["nodes"][0]["fields"]["isMask"] = json!(true); + envelope["snapshot"]["nodes"][0]["fields"]["effects"] = + json!([{"type": "BACKGROUND_BLUR"}]); + } + let envelope_bytes = loop { + let bytes = serde_json::to_vec(&envelope).unwrap(); + if envelope["integrity"]["utf8Bytes"] == bytes.len() as u64 { + break bytes; + } + envelope["integrity"]["utf8Bytes"] = Value::from(bytes.len()); + }; + + let mut png = b"\x89PNG\r\n\x1a\n".to_vec(); + push_png_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut payload = Vec::with_capacity(envelope_bytes.len() + 8); + payload.extend_from_slice(&0_u32.to_be_bytes()); + payload.extend_from_slice(&1_u32.to_be_bytes()); + payload.extend_from_slice(&envelope_bytes); + push_png_chunk(&mut png, b"duVp", &payload); + push_png_chunk( + &mut png, + b"IDAT", + &[ + 0x78, 0x01, 0x01, 0x05, 0x00, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1, + ], + ); + push_png_chunk(&mut png, b"IEND", &[]); + let descriptor = json!({ + "kind": "devupFastSnapshotDescriptor", + "schemaVersion": 1, + "rootId": "1:2", + "nodeCount": 1, + "variableRefCount": 1, + "styleRefCount": 0, + "utf8Bytes": envelope_bytes.len(), + "chunkCount": 1 + }); + UpstreamResult { + raw: json!({"content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ]}), + } +} + +fn asset_export_result( + version: Option<&str>, + request: &devup_mcp_figma::AssetRequest, +) -> UpstreamResult { + let bytes = b"synthetic-png"; + let descriptor = json!({ + "kind":"devupAssetExport","fileKey":"FileKey123","version":version, + "assetId":request.asset_id,"nodeId":request.node_id,"field":request.field, + "imageHash":request.image_hash,"format":request.format,"scale":request.scale, + "status":"exported","byteLength":bytes.len(), + "sha256":"294ad7145322ec19f8250cca8480a933f1ce8c9e2ad1038e7ae8930d55a6598a" + }); + UpstreamResult { + raw: json!({"content":[ + {"type":"text","text":descriptor.to_string()}, + {"type":"image","data":STANDARD.encode(bytes),"mimeType":"image/png"} + ]}), + } +} + +fn reference_png_base64() -> &'static str { + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=" +} + +fn push_png_chunk(output: &mut Vec, chunk_type: &[u8; 4], data: &[u8]) { + output.extend_from_slice(&(data.len() as u32).to_be_bytes()); + output.extend_from_slice(chunk_type); + output.extend_from_slice(data); + let mut crc_input = Vec::with_capacity(4 + data.len()); + crc_input.extend_from_slice(chunk_type); + crc_input.extend_from_slice(data); + output.extend_from_slice(&crc32(&crc_input).to_be_bytes()); +} + +fn crc32(bytes: &[u8]) -> u32 { + let mut crc = u32::MAX; + for byte in bytes { + crc ^= u32::from(*byte); + for _ in 0..8 { + crc = (crc >> 1) ^ (0xedb8_8320 & 0_u32.wrapping_sub(crc & 1)); + } + } + !crc +} diff --git a/crates/devup-mcp/tests/downstream_integration.rs b/crates/devup-mcp/tests/downstream_integration.rs new file mode 100644 index 0000000..3a6e0ba --- /dev/null +++ b/crates/devup-mcp/tests/downstream_integration.rs @@ -0,0 +1,397 @@ +use std::sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, +}; + +use async_trait::async_trait; +use devup_mcp::server::{DevupAuth, DevupServer, Services}; +use devup_mcp_figma::{AuthStatus, DevupError, FigmaUpstream, ReadToolCall, UpstreamResult}; +use rmcp::{ServiceExt, model::CallToolRequestParams}; +use serde_json::{Map, Value, json}; + +#[derive(Debug)] +struct ConnectedAuth; + +#[async_trait] +impl DevupAuth for ConnectedAuth { + async fn status(&self) -> Result { + Ok(AuthStatus::Connected) + } + + async fn login(&self) -> Result { + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +#[derive(Debug)] +struct FixtureUpstream; + +#[async_trait] +impl FigmaUpstream for FixtureUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + let payload = match call { + ReadToolCall::Metadata { .. } => { + json!({ + "devupMetadata": { + "fileKey": "85CgSws3o5XsLv7aAwWJyS", + "version": "1", + "rootId": "3879:35481", + "nodes": [{ + "id": "3879:35481", + "type": "FRAME", + "childrenIds": [], + "descendantCount": 1 + }] + } + }) + } + ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::NodeSnapshot, + .. + } => { + json!({ + "fileKey": "85CgSws3o5XsLv7aAwWJyS", "version": "1", "rootIds": ["3879:35481"], + "nodes": [{ + "id": "3879:35481", "type": "FRAME", + "fields": { + "name": "Proofread", + "childrenIds": [], + "layoutMode": "VERTICAL", + "width": 320, + "height": 240, + "fills": [{ + "type": "SOLID", + "color": {"r": 0, "g": 0.4, "b": 1, "a": 1}, + "boundVariables": { + "color": {"type": "VARIABLE_ALIAS", "id": "v"} + } + }], + "boundVariables": { + "fills": [{"type": "VARIABLE_ALIAS", "id": "v"}] + } + }, + "extra": {"futureField": true}, "fieldErrors": {} + }], "diagnostics": [] + }) + } + ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::VariableCatalog, + .. + } => json!({ + "collections": [{ + "id": "c", "name": "Theme", "defaultModeId": "m", + "modes": [{"modeId": "m", "name": "Default"}] + }], + "variableIds": ["v", "unused", "v-alt"], "styles": [], + "localComplete": true, "usedRemoteComplete": false + }), + ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::LocalVariables, + .. + } => json!({ + "variables": [{ + "id": "v", "name": "Color/Primary", "resolvedType": "COLOR", "variableCollectionId": "c", + "codeSyntax": {"WEB": "primary"}, "valuesByMode": {"m": {"r": 0, "g": 0.4, "b": 1, "a": 1}} + }, { + "id": "unused", "name": "Color/Unused", "resolvedType": "COLOR", "variableCollectionId": "c", + "codeSyntax": {"WEB": "unused"}, "valuesByMode": {"m": {"r": 1, "g": 0, "b": 0, "a": 1}} + }, { + "id": "v-alt", "name": "Color/PrimaryAlt", "resolvedType": "COLOR", "variableCollectionId": "c", + "codeSyntax": {"WEB": "primary"}, "valuesByMode": {"m": {"r": 1, "g": 0, "b": 0, "a": 1}} + }], + "styles": [] + }), + ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::UsedResources, + .. + } => json!({ + "collections": [{ + "id": "c", "name": "Theme", "defaultModeId": "m", + "modes": [{"modeId": "m", "name": "Default"}] + }], + "variables": [{ + "id": "v", "name": "Color/Primary", "resolvedType": "COLOR", "variableCollectionId": "c", + "codeSyntax": {"WEB": "primary"}, "valuesByMode": {"m": {"r": 0, "g": 0.4, "b": 1, "a": 1}} + }], + "styles": [], + "unresolved": [] + }), + _ => { + return Err(devup_mcp_figma::DevupError::new( + devup_mcp_figma::ErrorCode::DevupSnapshotUnsupported, + "unexpected test call", + false, + )); + } + }; + Ok(UpstreamResult { + raw: json!({"structuredContent": {"result": payload}}), + }) + } +} + +async fn call_tool(name: &str, arguments: Value) -> anyhow::Result { + call_tool_with_auth(Arc::new(ConnectedAuth), name, arguments).await +} + +async fn call_tool_with_auth( + auth: Arc, + name: &str, + arguments: Value, +) -> anyhow::Result { + call_tool_with_services(auth, Arc::new(FixtureUpstream), name, arguments).await +} + +async fn call_tool_with_services( + auth: Arc, + upstream: Arc, + name: &str, + arguments: Value, +) -> anyhow::Result { + let server = DevupServer::new(Services::new(auth, upstream)); + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let arguments: Map = arguments.as_object().cloned().unwrap(); + let result = client + .call_tool(CallToolRequestParams::new(name.to_owned()).with_arguments(arguments)) + .await?; + client.cancel().await?; + task.await??; + Ok(result.structured_content.expect("structured tool output")) +} + +async fn call_tool_with_output_roots( + name: &str, + arguments: Value, + roots: Vec, +) -> anyhow::Result { + let server = DevupServer::with_output_roots( + Services::new(Arc::new(ConnectedAuth), Arc::new(FixtureUpstream)), + roots, + )?; + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let arguments: Map = arguments.as_object().cloned().unwrap(); + let result = client + .call_tool(CallToolRequestParams::new(name.to_owned()).with_arguments(arguments)) + .await?; + client.cancel().await?; + task.await??; + Ok(result.structured_content.expect("structured tool output")) +} + +#[derive(Debug)] +struct PartialFixtureUpstream; + +#[async_trait] +impl FigmaUpstream for PartialFixtureUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + if let ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::NodeSnapshot, + .. + } = call + { + return Ok(UpstreamResult { + raw: json!({"structuredContent": {"result": { + "fileKey": "85CgSws3o5XsLv7aAwWJyS", + "version": "1", + "rootIds": ["3879:35481"], + "nodes": [{ + "id": "3879:35481", + "type": "FRAME", + "fields": { + "name": "Proofread", + "childrenIds": ["3879:404"], + "layoutMode": "VERTICAL", + "width": 320, + "height": 240 + }, + "extra": {}, + "fieldErrors": {} + }], + "diagnostics": [] + }}}), + }); + } + FixtureUpstream.call_read_tool(call).await + } +} + +#[derive(Debug, Default)] +struct LoginAuth { + logins: AtomicUsize, +} + +#[async_trait] +impl DevupAuth for LoginAuth { + async fn status(&self) -> Result { + Ok(AuthStatus::Disconnected) + } + + async fn login(&self) -> Result { + self.logins.fetch_add(1, Ordering::SeqCst); + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +#[tokio::test] +async fn conversion_returns_host_handoff_without_starting_oauth() -> anyhow::Result<()> { + let auth = Arc::new(LoginAuth::default()); + let output = call_tool_with_auth( + auth.clone(), + "devup_figma_to_ui", + json!({"url": "https://figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481"}), + ) + .await?; + + assert_eq!(output["status"], "needs_figma"); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn converts_a_figma_link_to_structured_devup_ui() -> anyhow::Result<()> { + let result = call_tool( + "devup_figma_to_ui", + json!({ + "url": "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481", + "includeDiagnostics": true + }), + ) + .await?; + + assert_eq!(result["status"], "complete"); + assert_eq!(result["quality"]["acquisition"], "complete"); + assert_eq!(result["quality"]["projection"], "exact"); + assert_eq!(result["quality"]["theme"], "not-requested"); + assert_eq!(result["quality"]["assets"], "not-requested"); + assert!( + result["tsx"] + .as_str() + .unwrap() + .contains("export function Proofread") + ); + let tsx = result["tsx"].as_str().unwrap(); + assert!(tsx.contains("bg=\"$primary\"")); + assert!(!tsx.contains("$colorPrimary")); + assert_eq!(result["source"]["nodeId"], "3879:35481"); + assert_eq!(result["snapshot"]["preservedNodeCount"], 1); + Ok(()) +} + +#[tokio::test] +async fn reports_partial_instead_of_complete_when_a_child_is_missing() -> anyhow::Result<()> { + let result = call_tool_with_services( + Arc::new(ConnectedAuth), + Arc::new(PartialFixtureUpstream), + "devup_figma_to_ui", + json!({ + "url": "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481", + "includeDiagnostics": true + }), + ) + .await?; + + assert_eq!(result["status"], "partial"); + assert_eq!(result["completenessReport"]["state"], "partial"); + assert_eq!( + result["completenessReport"]["snapshot"]["missingChildren"][0]["childId"], + "3879:404" + ); + Ok(()) +} + +#[tokio::test] +async fn converts_figma_variables_to_structured_devup_json() -> anyhow::Result<()> { + let output_root = std::env::temp_dir().join(format!( + "devup-mcp-output-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH)? + .as_nanos() + )); + std::fs::create_dir_all(&output_root)?; + let output_path = output_root.join("devup.json"); + let result = call_tool_with_output_roots( + "devup_figma_to_json", + json!({ + "url": "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481", + "scope": "file", + "includeDiagnostics": true, + "outputPath": output_path + }), + vec![output_root.clone()], + ) + .await?; + + assert_eq!(result["status"], "partial"); + assert_eq!(result["quality"]["acquisition"], "complete"); + assert_eq!(result["quality"]["projection"], "not-requested"); + assert_eq!(result["quality"]["theme"], "conflicted"); + assert!( + result["devupJson"] + .as_str() + .unwrap() + .contains("\"primary\"") + ); + assert_eq!(result["completeness"], "used-tokens"); + assert_eq!(result["conflicts"][0]["token"], "primary"); + assert_eq!(result["conflicts"][0]["winnerVariableId"], "v"); + assert_eq!(result["unresolvedVariables"], json!([])); + assert_eq!( + std::fs::read_to_string(&output_path)?, + result["devupJson"].as_str().unwrap() + ); + assert!(result["outputPath"].as_str().is_some()); + std::fs::remove_file(output_path)?; + std::fs::remove_dir(output_root)?; + Ok(()) +} + +#[tokio::test] +async fn node_theme_scope_excludes_file_variables_not_used_by_the_node() -> anyhow::Result<()> { + let result = call_tool( + "devup_figma_to_json", + json!({ + "url": "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481", + "scope": "node", + "includeDiagnostics": true + }), + ) + .await?; + + assert_eq!(result["status"], "complete"); + assert!( + result["devupJson"] + .as_str() + .unwrap() + .contains("\"primary\"") + ); + assert!(!result["devupJson"].as_str().unwrap().contains("\"unused\"")); + assert_eq!(result["completeness"], "used-tokens"); + Ok(()) +} diff --git a/crates/devup-mcp/tests/figma_explore.rs b/crates/devup-mcp/tests/figma_explore.rs new file mode 100644 index 0000000..ea0a0c4 --- /dev/null +++ b/crates/devup-mcp/tests/figma_explore.rs @@ -0,0 +1,263 @@ +use std::sync::Arc; + +use async_trait::async_trait; +use devup_mcp::server::{DevupAuth, DevupServer, Services}; +use devup_mcp_figma::{ + AuthStatus, DevupError, ErrorCode, ExploreOptions, FigmaTarget, FigmaUpstream, ReadToolCall, + SnapshotChunk, UpstreamResult, explore_snapshot, merge_chunks, +}; +use rmcp::{ServiceExt, model::CallToolRequestParams}; +use serde_json::{Map, Value, json}; + +#[derive(Debug)] +struct Auth(AuthStatus); + +#[async_trait] +impl DevupAuth for Auth { + async fn status(&self) -> Result { + Ok(self.0) + } + + async fn login(&self) -> Result { + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +#[derive(Debug)] +struct ExploreUpstream; + +#[async_trait] +impl FigmaUpstream for ExploreUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + match call { + ReadToolCall::ExploreSnapshot { options, .. } => { + assert!(options.projection_limit >= 50); + assert_eq!(options.text_preview_limit, 160); + Ok(UpstreamResult { raw: projection() }) + } + _ => Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "unexpected test call", + false, + )), + } + } +} + +fn projection() -> Value { + json!({ + "fileKey": "FileKey123", + "version": null, + "rootIds": ["0:1"], + "nodes": [ + { + "id": "0:1", "type": "PAGE", + "fields": {"name": "Phase2", "parentId": null, "childrenIds": [], "x": 0, "y": 0, "width": 1400, "height": 1600, "childCount": 20, "textPreview": "", "projectionTruncated": false}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "1:1", "type": "FRAME", + "fields": {"name": "[FR-026] 본연체", "parentId": "0:1", "childrenIds": [], "x": 0, "y": 0, "width": 1200, "height": 80, "childCount": 1, "textPreview": "본연체"}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "1:2", "type": "FRAME", + "fields": {"name": "A : STORY-F-PROOFREAD", "parentId": "0:1", "childrenIds": [], "x": 0, "y": 120, "width": 360, "height": 740, "childCount": 12, "textPreview": "이야기가 글로 정리되었어요"}, + "extra": {}, "fieldErrors": {} + }, + { + "id": "1:3", "type": "FRAME", + "fields": {"name": "A : STORY-F-PROOFREAD", "parentId": "0:1", "childrenIds": [], "x": 400, "y": 120, "width": 360, "height": 740, "childCount": 13, "textPreview": "공개 설정 나만 보기"}, + "extra": {}, "fieldErrors": {} + } + ], + "diagnostics": [] + }) +} + +async fn start_client( + status: AuthStatus, +) -> anyhow::Result<( + rmcp::service::RunningService, + tokio::task::JoinHandle>, +)> { + let server = DevupServer::new(Services::new( + Arc::new(Auth(status)), + Arc::new(ExploreUpstream), + )); + let (server_transport, client_transport) = tokio::io::duplex(128 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + Ok((client, task)) +} + +fn input(source_policy: &str) -> Map { + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-1", + "limit": 50, + "includeTextPreview": true, + "sourcePolicy": source_policy + }) + .as_object() + .cloned() + .unwrap() +} + +#[tokio::test] +async fn direct_and_host_explore_return_identical_candidate_data() -> anyhow::Result<()> { + let (client, task) = start_client(AuthStatus::Connected).await?; + let direct = client + .call_tool( + CallToolRequestParams::new("devup_figma_explore").with_arguments(input("direct")), + ) + .await? + .structured_content + .unwrap(); + let start = client + .call_tool(CallToolRequestParams::new("devup_figma_explore").with_arguments(input("host"))) + .await? + .structured_content + .unwrap(); + assert_eq!(start["status"], "needs_figma"); + assert_eq!(start["calls"].as_array().unwrap().len(), 1); + assert_eq!(start["calls"][0]["tool"], "use_figma"); + let code = start["calls"][0]["arguments"]["code"].as_str().unwrap(); + assert!(code.contains("projectionTruncated")); + assert!(!code.contains("getVariableByIdAsync")); + + let complete = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": start["sessionId"], + "callId": start["calls"][0]["callId"], + "result": projection() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + + // Explore is an intentionally shallow spatial projection. Its candidate data is + // complete for the operation, while the preserved graph correctly reports that + // descendants represented by childCount were not included in the snapshot. + assert_eq!(direct["status"], "complete"); + assert_eq!(complete["status"], "complete"); + assert_eq!(direct["quality"]["acquisition"], "expected-projection"); + assert_eq!(complete["quality"]["acquisition"], "expected-projection"); + assert_eq!(direct["quality"]["projection"], "not-requested"); + assert!( + !direct["completenessReport"]["snapshot"]["childCountMismatches"] + .as_array() + .unwrap() + .is_empty() + ); + assert_eq!(direct["anchor"]["kind"], "heading"); + assert_eq!(direct["targetKind"], "other"); + assert_eq!(direct["count"], 2); + assert_eq!(direct["candidates"][0]["node"]["nodeId"], "1:2"); + for field in ["anchor", "group", "candidates", "truncated", "diagnostics"] { + assert_eq!(direct[field], complete[field], "source changed {field}"); + } + assert_eq!(direct["source"]["kind"], "direct"); + assert_eq!(complete["source"]["kind"], "host"); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn explore_rejects_missing_node_and_out_of_range_limit() -> anyhow::Result<()> { + let (client, task) = start_client(AuthStatus::Connected).await?; + let missing_node = client + .call_tool( + CallToolRequestParams::new("devup_figma_explore").with_arguments( + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture", + "sourcePolicy": "direct" + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + assert!(missing_node.is_err()); + let invalid_limit = client + .call_tool( + CallToolRequestParams::new("devup_figma_explore").with_arguments( + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-1", + "limit": 101, + "sourcePolicy": "direct" + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + assert!(invalid_limit.is_err()); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[test] +fn wquw_151_heading_discovers_the_actual_screen_group() { + let chunk: SnapshotChunk = + serde_json::from_str(include_str!("fixtures/wquw-151-neighborhood.json")).unwrap(); + let snapshot = merge_chunks(vec![chunk]).unwrap(); + let target = FigmaTarget::parse( + "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Girok?node-id=3879-35481", + ) + .unwrap(); + + let result = explore_snapshot(&snapshot, &target, &ExploreOptions { limit: 50 }).unwrap(); + let ids = result + .candidates + .iter() + .map(|candidate| candidate.node.node_id.as_str()) + .collect::>(); + + assert_eq!( + ids, + [ + "3879:36108", + "3879:36059", + "3879:35503", + "3879:35518", + "3879:35569", + "3879:36144", + "3879:35729", + "3879:35887", + "3879:35973", + "3879:35652", + ] + ); + assert_eq!(result.anchor.name, "[FR-026] 본연체"); + assert!( + result + .candidates + .iter() + .any(|candidate| candidate.node.node_id == "3879:35518") + ); + assert!(!result.truncated); +} diff --git a/crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json b/crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json new file mode 100644 index 0000000..cdb75b0 --- /dev/null +++ b/crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json @@ -0,0 +1,479 @@ +{ + "fileKey": "85CgSws3o5XsLv7aAwWJyS", + "version": null, + "rootIds": [ + "3686:1678" + ], + "nodes": [ + { + "id": "3686:1678", + "type": "PAGE", + "fields": { + "name": "Phase2 Hand-off", + "parentId": null, + "childrenIds": [], + "x": 6627, + "y": 9863, + "width": 4938, + "height": 7429, + "childCount": 407, + "textPreview": "", + "projectionTruncated": false + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35481", + "type": "FRAME", + "fields": { + "name": "[FR-026] 본연체", + "parentId": "3686:1678", + "childrenIds": [], + "x": 6947, + "y": 9863, + "width": 4323, + "height": 97, + "childCount": 1, + "textPreview": "[FR-026] 본연체", + "pageChildIndex": 84 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35483", + "type": "FRAME", + "fields": { + "name": "이야기 작성", + "parentId": "3686:1678", + "childrenIds": [], + "x": 6947, + "y": 9984, + "width": 4323, + "height": 97, + "childCount": 1, + "textPreview": "이야기 작성", + "pageChildIndex": 187 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35485", + "type": "FRAME", + "fields": { + "name": "Frame 1321315498", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8946, + "y": 10106, + "width": 730, + "height": 76, + "childCount": 1, + "textPreview": "첫 작성글", + "pageChildIndex": 188 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35489", + "type": "FRAME", + "fields": { + "name": "Frame 1321315499", + "parentId": "3686:1678", + "childrenIds": [], + "x": 9729, + "y": 10106, + "width": 730, + "height": 76, + "childCount": 1, + "textPreview": "첫 글 이후 (문체변경불가)", + "pageChildIndex": 190 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35491", + "type": "FRAME", + "fields": { + "name": "Frame 1321315485", + "parentId": "3686:1678", + "childrenIds": [], + "x": 10521, + "y": 10106, + "width": 360, + "height": 76, + "childCount": 1, + "textPreview": "교정 변경 선택", + "pageChildIndex": 191 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35493", + "type": "FRAME", + "fields": { + "name": "Frame 1321315486", + "parentId": "3686:1678", + "childrenIds": [], + "x": 10910, + "y": 10106, + "width": 360, + "height": 76, + "childCount": 1, + "textPreview": "문체 변경 선택 (설명 추가)", + "pageChildIndex": 192 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35495", + "type": "FRAME", + "fields": { + "name": "Frame 1321315461", + "parentId": "3686:1678", + "childrenIds": [], + "x": 6947, + "y": 10200, + "width": 540, + "height": 158, + "childCount": 1, + "textPreview": "문체는 기존 설정 (담담체, 서정체, 강건체 3개) 유지. ‘본연체’는 문체가 아닌, AI가 교정에 얼마나 개입하는 지에 대한 옵션으로 변경", + "pageChildIndex": 193 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:36108", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-RECORD #recording", + "parentId": "3686:1678", + "childrenIds": [], + "x": 7513, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 2, + "textPreview": "주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요 그건 어느 추운 겨울날이었어. 바깥에는 첫눈이 내려 온", + "pageChildIndex": 205 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:36059", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-RECORD #recording", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8037, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 3, + "textPreview": "주말 아침, 늦잠을 자는 편인지 부지런히 움직이는 편인지 주말 풍경에 대해 이야기해주세요 그건 어느 추운 겨울날이었어. 바깥에는 첫눈이 내려 온", + "pageChildIndex": 204 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35503", + "type": "FRAME", + "fields": { + "name": "Loading", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8560, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 2, + "textPreview": "기록해주신 이야기를 정리하고 있어요 잠시만 기다려주세요 기억을 더듬어 기록하는 시간은 그 자체로 훌륭한 여행이랍니다.", + "pageChildIndex": 197 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35518", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8946, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 3, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 198 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35569", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 9316, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 4, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 199 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:36144", + "type": "FRAME", + "fields": { + "name": "A : STORY-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 9729, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 3, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 206 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35729", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 10099, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 4, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 201 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35887", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 10521, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 5, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 202 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35973", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 10910, + "y": 10200, + "width": 360, + "height": 740, + "childCount": 5, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 203 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35497", + "type": "FRAME", + "fields": { + "name": "Frame 1321315487", + "parentId": "3686:1678", + "childrenIds": [], + "x": 6947, + "y": 10409, + "width": 539, + "height": 124, + "childCount": 1, + "textPreview": "‘인터뷰형 기록하기’는 특성상 구어체를 사용하여 단답형으로 대답할 확률이 높으므로, 교정 옵션 제공 X", + "pageChildIndex": 194 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:36191", + "type": "VECTOR", + "fields": { + "name": "Frame 1321314908 --> A : STORY-F-RECORD #recording", + "parentId": "3686:1678", + "childrenIds": [], + "x": 7818.5, + "y": 10570, + "width": 218.5, + "height": 252.5, + "childCount": 0, + "textPreview": "", + "pageChildIndex": 207 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:36192", + "type": "VECTOR", + "fields": { + "name": "Alert --> Loading", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8372.5, + "y": 10570, + "width": 187.5, + "height": 148, + "childCount": 0, + "textPreview": "", + "pageChildIndex": 208 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:37116", + "type": "FRAME", + "fields": { + "name": "Frame 1321315500", + "parentId": "3686:1678", + "childrenIds": [], + "x": 9316, + "y": 10958, + "width": 626, + "height": 240, + "childCount": 3, + "textPreview": "선택지 설명 AI 담당자 배정 전 : AI 담당자가 문맥을 자연스럽게 수정해요 AI 담당자 배정 후 : ${담당자명}가 문맥을 자연스럽게 수정해", + "pageChildIndex": 196 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35499", + "type": "FRAME", + "fields": { + "name": "Frame 1321315497", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8051, + "y": 10978, + "width": 797, + "height": 240, + "childCount": 3, + "textPreview": "선택지 AI 담당자 배정 전 : AI 담당자와 함께 문체 다듬기 AI 담당자 배정 후 : ${담당자명}와 함께 문체 다듬기 예시 ) 담이와 함께", + "pageChildIndex": 195 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35487", + "type": "FRAME", + "fields": { + "name": "Frame 1321315491", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8946, + "y": 11266, + "width": 747, + "height": 76, + "childCount": 1, + "textPreview": "인터뷰형 작성하기 결과물에선 교정 설정 표시 X", + "pageChildIndex": 189 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3879:35652", + "type": "FRAME", + "fields": { + "name": "A : STORY-F-PROOFREAD", + "parentId": "3686:1678", + "childrenIds": [], + "x": 8946, + "y": 11364, + "width": 360, + "height": 740, + "childCount": 4, + "textPreview": "이야기가 글로 정리되었어요 사진은 책에 인쇄하기 위해 고화질 사진(긴 쪽 기준 최소 1000px)만 업로드할 수 있어요. TIP 각 단락을 선택", + "pageChildIndex": 200 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3997:45576", + "type": "FRAME", + "fields": { + "name": "Frame 1321315540", + "parentId": "3686:1678", + "childrenIds": [], + "x": 7307, + "y": 14723, + "width": 822, + "height": 124, + "childCount": 1, + "textPreview": "표지를 상시 수정할 수 있게 되면서 책 출판 과정의 표지 설정 변경 과정도 변경됩니다. 기존의 템플릿 선택 → 제목 설정의 2단계 Depth를 ", + "pageChildIndex": 293 + }, + "extra": {}, + "fieldErrors": {} + }, + { + "id": "3997:45578", + "type": "FRAME", + "fields": { + "name": "[FR-032] 표지 체험하기", + "parentId": "3686:1678", + "childrenIds": [], + "x": 9679, + "y": 14765, + "width": 1375, + "height": 97, + "childCount": 1, + "textPreview": "[FR-032] 표지 체험하기", + "pageChildIndex": 301 + }, + "extra": {}, + "fieldErrors": {} + } + ], + "diagnostics": [] +} + diff --git a/crates/devup-mcp/tests/fixtures/wquw-151-section.json b/crates/devup-mcp/tests/fixtures/wquw-151-section.json new file mode 100644 index 0000000..2ec6bb9 --- /dev/null +++ b/crates/devup-mcp/tests/fixtures/wquw-151-section.json @@ -0,0 +1,28 @@ +{ + "source": { + "fileKey": "85CgSws3o5XsLv7aAwWJyS", + "nodeId": "4217:7743", + "capture": "official Figma MCP get_metadata read-only projection" + }, + "section": { + "id": "4217:7743", + "name": "[FR-026] 본연체", + "x": 6858, + "y": 9742, + "width": 4589, + "height": 2429 + }, + "screenCandidates": [ + { "id": "3879:36108", "name": "A : STORY-F-RECORD #recording", "x": 655, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:36059", "name": "A : STORY-F-RECORD #recording", "x": 1179, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35503", "name": "Loading", "x": 1702, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35518", "name": "A : STORY-F-PROOFREAD", "x": 2088, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35569", "name": "A : STORY-F-PROOFREAD", "x": 2458, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:36144", "name": "A : STORY-PROOFREAD", "x": 2871, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35729", "name": "A : STORY-F-PROOFREAD", "x": 3241, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35887", "name": "A : STORY-F-PROOFREAD", "x": 3663, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35973", "name": "A : STORY-F-PROOFREAD", "x": 4052, "y": 458, "width": 360, "height": 740 }, + { "id": "3879:35652", "name": "A : STORY-F-PROOFREAD", "x": 2088, "y": 1622, "width": 360, "height": 740 } + ], + "proofreadTargetId": "3879:35518" +} diff --git a/crates/devup-mcp/tests/handoff.rs b/crates/devup-mcp/tests/handoff.rs new file mode 100644 index 0000000..db09ffb --- /dev/null +++ b/crates/devup-mcp/tests/handoff.rs @@ -0,0 +1,268 @@ +use std::{ + sync::{ + Arc, + atomic::{AtomicU64, Ordering}, + }, + time::Duration, +}; + +use devup_mcp::server::handoff::{ + Clock, HandoffLimits, HandoffStep, HandoffStore, PendingOperation, +}; +use devup_mcp_figma::{ + CollectionRequest, CollectionScope, CollectorSession, ErrorCode, FigmaTarget, +}; +use serde_json::{Value, json}; + +#[derive(Debug, Default)] +struct FakeClock(AtomicU64); + +impl FakeClock { + fn advance(&self, seconds: u64) { + self.0.fetch_add(seconds, Ordering::SeqCst); + } +} + +impl Clock for FakeClock { + fn now_epoch_seconds(&self) -> u64 { + self.0.load(Ordering::SeqCst) + } +} + +fn collector() -> CollectorSession { + let target = + FigmaTarget::parse("https://www.figma.com/design/FileKey123/Fixture?node-id=1-2").unwrap(); + CollectorSession::new(CollectionRequest::new(target, CollectionScope::Node)) +} + +fn metadata_result() -> Value { + json!({ + "structuredContent": { + "devupMetadata": { + "fileKey": "FileKey123", + "version": "v1", + "rootId": "1:2", + "nodes": [{ + "id": "1:2", + "type": "FRAME", + "childrenIds": [], + "descendantCount": 1 + }] + } + } + }) +} + +fn snapshot_result() -> Value { + json!({ + "fileKey": "FileKey123", + "version": "v1", + "rootIds": ["1:2"], + "nodes": [{ + "id": "1:2", + "type": "FRAME", + "fields": {"name": "Synthetic", "childrenIds": []}, + "extra": {}, + "fieldErrors": {} + }] + }) +} + +fn limits() -> HandoffLimits { + HandoffLimits { + ttl: Duration::from_secs(600), + max_sessions: 8, + max_result_bytes: 1024, + max_total_bytes: 4096, + } +} + +#[tokio::test] +async fn expires_sessions_after_ten_minutes() { + let clock = Arc::new(FakeClock::default()); + let store = HandoffStore::with_clock(clock.clone(), limits()); + let id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + + clock.advance(601); + let error = store.next(&id).await.unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaHandoffExpired); +} + +#[tokio::test] +async fn enforces_session_and_payload_memory_limits() { + let clock = Arc::new(FakeClock::default()); + let store = HandoffStore::with_clock(clock, limits()); + for _ in 0..8 { + store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + } + let error = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaResponseTooLarge); + + let strict = HandoffStore::with_limits(HandoffLimits { + max_result_bytes: 32, + max_total_bytes: 64, + ..limits() + }); + let id = strict + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let HandoffStep::NeedsFigma { calls, .. } = strict.next(&id).await.unwrap() else { + panic!() + }; + let error = strict + .accept(&id, &calls[0].call_id, json!({"large": "x".repeat(80)})) + .await + .unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaResponseTooLarge); + let removed = strict.next(&id).await.unwrap_err(); + assert_eq!(removed.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[tokio::test] +async fn uses_opaque_ids_and_consumes_each_call_once() { + let store = HandoffStore::with_limits(limits()); + let id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + assert_eq!(id.len(), 43); + assert!( + id.bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_')) + ); + + let HandoffStep::NeedsFigma { calls, .. } = store.next(&id).await.unwrap() else { + panic!() + }; + assert_eq!(calls[0].call_id.len(), 43); + store + .accept(&id, &calls[0].call_id, metadata_result()) + .await + .unwrap(); + let replay = store + .accept(&id, &calls[0].call_id, metadata_result()) + .await + .unwrap_err(); + assert_eq!(replay.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[tokio::test] +async fn removes_the_session_after_collection_completes() { + let store = HandoffStore::with_limits(limits()); + let id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let HandoffStep::NeedsFigma { calls, .. } = store.next(&id).await.unwrap() else { + panic!() + }; + store + .accept(&id, &calls[0].call_id, metadata_result()) + .await + .unwrap(); + let HandoffStep::NeedsFigma { calls, .. } = store.next(&id).await.unwrap() else { + panic!() + }; + store + .accept(&id, &calls[0].call_id, snapshot_result()) + .await + .unwrap(); + let HandoffStep::Complete { parts, operation } = store.next(&id).await.unwrap() else { + panic!() + }; + assert_eq!(operation, PendingOperation::Collect); + assert_eq!(parts.snapshot_chunks.len(), 1); + + let removed = store.next(&id).await.unwrap_err(); + assert_eq!(removed.code, ErrorCode::DevupFigmaHandoffInvalid); +} + +#[tokio::test] +async fn rejects_cross_session_calls_and_concurrent_replays() { + let store = HandoffStore::with_limits(limits()); + let first_id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let second_id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let HandoffStep::NeedsFigma { calls, .. } = store.next(&first_id).await.unwrap() else { + panic!() + }; + let cross_session = store + .accept(&second_id, &calls[0].call_id, metadata_result()) + .await + .unwrap_err(); + assert_eq!(cross_session.code, ErrorCode::DevupFigmaHandoffInvalid); + + let call_id = calls[0].call_id.clone(); + let left = { + let store = store.clone(); + let session_id = first_id.clone(); + let call_id = call_id.clone(); + tokio::spawn(async move { store.accept(&session_id, &call_id, metadata_result()).await }) + }; + let right = { + let store = store.clone(); + let session_id = first_id.clone(); + tokio::spawn(async move { store.accept(&session_id, &call_id, metadata_result()).await }) + }; + let results = [left.await.unwrap(), right.await.unwrap()]; + assert_eq!(results.iter().filter(|result| result.is_ok()).count(), 1); + assert_eq!( + results + .iter() + .filter_map(|result| result.as_ref().err()) + .next() + .unwrap() + .code, + ErrorCode::DevupFigmaHandoffInvalid + ); +} + +#[tokio::test] +async fn enforces_the_aggregate_limit_across_sessions() { + let payload = metadata_result(); + let encoded_len = serde_json::to_vec(&payload).unwrap().len(); + let store = HandoffStore::with_limits(HandoffLimits { + max_result_bytes: encoded_len + 1, + max_total_bytes: encoded_len * 2 - 1, + ..limits() + }); + let first_id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let second_id = store + .begin(PendingOperation::Collect, collector()) + .await + .unwrap(); + let HandoffStep::NeedsFigma { calls: first, .. } = store.next(&first_id).await.unwrap() else { + panic!() + }; + let HandoffStep::NeedsFigma { calls: second, .. } = store.next(&second_id).await.unwrap() + else { + panic!() + }; + store + .accept(&first_id, &first[0].call_id, payload.clone()) + .await + .unwrap(); + let error = store + .accept(&second_id, &second[0].call_id, payload) + .await + .unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupFigmaResponseTooLarge); +} diff --git a/crates/devup-mcp/tests/live_figma_contract.rs b/crates/devup-mcp/tests/live_figma_contract.rs new file mode 100644 index 0000000..b0e7aaf --- /dev/null +++ b/crates/devup-mcp/tests/live_figma_contract.rs @@ -0,0 +1,214 @@ +use std::collections::BTreeSet; +use std::io::{self, BufRead}; + +use devup_mcp_devup_ui::codegen::{CodegenOptions, generate_component}; +use devup_mcp_figma::{ + CollectedPayload, CollectionRequest, CollectionScope, CollectorSession, CollectorStep, + FigmaTarget, PayloadStructure, ResourceScope, UpstreamResult, decode_fast_snapshot, + decode_fast_theme, validate_payload_context, +}; +use serde_json::{Value, json}; + +const LIVE_URL: &str = + "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Fixture?node-id=3879-35518"; + +#[test] +#[ignore = "requires official Figma MCP results on stdin"] +fn official_mcp_payload_round_trips_without_value_logging() { + assert_eq!( + std::env::var("DEVUP_MCP_LIVE_FIGMA").as_deref(), + Ok("1"), + "set DEVUP_MCP_LIVE_FIGMA=1 explicitly" + ); + let mut input = io::stdin().lock().lines(); + let target = FigmaTarget::parse(LIVE_URL).expect("static live target"); + let mut request = CollectionRequest::new(target.clone(), CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + let mut call_count = 0; + + let parts = loop { + match collector.advance().expect("advance collector") { + CollectorStep::Call(call) => { + call_count += 1; + assert_eq!(call.call.tool_name(), "use_figma"); + let raw = read_result(&mut input, call.call.tool_name()); + if call_count == 1 { + decode_fast_snapshot(&UpstreamResult { raw: raw.clone() }, &target) + .unwrap_or_else(|error| { + panic!("fast envelope validation failed: {}", error.details) + }); + } + collector + .accept(&call.id, UpstreamResult { raw }) + .expect("accept official MCP result"); + } + CollectorStep::AwaitingResults => continue, + CollectorStep::Complete(parts) => break parts, + } + }; + let payload = CollectedPayload::try_from(*parts).expect("normalize live payload"); + validate_payload_context(&payload, &target).expect("live payload context"); + let round_trip: CollectedPayload = + serde_json::from_value(serde_json::to_value(&payload).expect("serialize live payload")) + .expect("deserialize live payload"); + assert_eq!(round_trip, payload); + assert_eq!(call_count, 1); + assert_eq!(payload.stats.figma_tool_calls, 1); + assert_eq!(payload.stats.transport, "png-envelope-v1"); + assert!(!payload.stats.fallback_used); + assert_eq!(payload.snapshot.nodes.len(), 144); + assert_eq!(payload.stats.node_count, 144); + assert_eq!(payload.stats.variable_count, 20); + assert_eq!(payload.stats.style_count, 11); + let resources = &payload.variables.as_ref().expect("used resources").raw; + assert_eq!(resources["variables"].as_array().map(Vec::len), Some(20)); + assert_eq!(resources["styles"].as_array().map(Vec::len), Some(11)); + + let output = generate_component( + &payload.snapshot, + target.node_id.as_deref().expect("live node id"), + &CodegenOptions { + inline_instances: true, + ..CodegenOptions::default() + } + .with_payload_tokens(&payload), + ) + .expect("live DevupUI codegen"); + assert!(output.tsx.contains("borderTop=\"solid 1px $border\"")); + for typography in ["h3", "body", "bodySemibold"] { + assert!(output.tsx.contains(&format!("typography=\"{typography}\""))); + } + assert!( + !output.tsx.contains(" && "), + "a concrete live frame must not emit undeclared component-property expressions" + ); + + let stats = serde_json::to_value(&payload.stats).expect("safe stats"); + let keys = stats + .as_object() + .expect("stats object") + .keys() + .map(String::as_str) + .collect::>(); + assert_eq!( + keys, + BTreeSet::from([ + "envelopeChunks", + "fallbackUsed", + "figmaToolCalls", + "nodeCount", + "rawBytes", + "styleCount", + "transport", + "variableCount", + "wireBytes", + ]) + ); + + let structure = PayloadStructure::from_payload(&payload); + assert_eq!(structure.node_count, 144); + assert_eq!(structure.schema_hash.len(), 64); + println!( + "{}", + json!({ + "envelopeChunks": payload.stats.envelope_chunks, + "figmaToolCalls": payload.stats.figma_tool_calls, + "nodeCount": structure.node_count, + "schemaHash": structure.schema_hash, + "styleCount": payload.stats.style_count, + "transport": payload.stats.transport, + "variableCount": payload.stats.variable_count, + }) + ); +} + +#[test] +fn corrupted_fast_envelope_restarts_at_legacy_metadata() { + let target = FigmaTarget::parse(LIVE_URL).expect("static live target"); + let mut request = CollectionRequest::new(target, CollectionScope::Node); + request.resource_scope = ResourceScope::Used; + let mut collector = CollectorSession::new(request); + + let CollectorStep::Call(fast) = collector.advance().expect("fast call") else { + panic!("expected fast call"); + }; + assert_eq!(fast.call.tool_name(), "use_figma"); + collector + .accept( + &fast.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "corrupted envelope"}]}), + }, + ) + .expect("corruption must trigger safe fallback"); + + let CollectorStep::Call(metadata) = collector.advance().expect("legacy metadata") else { + panic!("expected legacy metadata call"); + }; + assert_eq!(metadata.call.tool_name(), "get_metadata"); +} + +#[test] +#[ignore = "requires an official Figma MCP fast-theme result on stdin"] +fn official_fast_theme_completes_in_one_call() { + assert_eq!( + std::env::var("DEVUP_MCP_LIVE_FIGMA").as_deref(), + Ok("1"), + "set DEVUP_MCP_LIVE_FIGMA=1 explicitly" + ); + let target = FigmaTarget::parse("https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Fixture") + .expect("static live file target"); + let mut request = CollectionRequest::new(target.clone(), CollectionScope::File); + request.resource_scope = ResourceScope::File; + request.variables_only = true; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(call) = collector.advance().expect("fast theme call") else { + panic!("expected fast theme call"); + }; + let raw = read_result(&mut io::stdin().lock().lines(), call.call.tool_name()); + let decoded = decode_fast_theme(&UpstreamResult { raw: raw.clone() }, &target.file_key) + .expect("fast theme envelope validation"); + assert_eq!(decoded.resources.raw["localComplete"], true); + collector + .accept(&call.id, UpstreamResult { raw }) + .expect("accept fast theme"); + let CollectorStep::Complete(parts) = collector.advance().expect("complete theme") else { + panic!("fast theme must complete in one call"); + }; + assert_eq!(parts.stats.figma_tool_calls, 1); + assert_eq!(parts.stats.transport, "png-theme-envelope-v1"); +} + +#[test] +fn corrupted_fast_theme_restarts_at_legacy_metadata() { + let target = FigmaTarget::parse("https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Fixture") + .expect("static live file target"); + let mut request = CollectionRequest::new(target, CollectionScope::File); + request.resource_scope = ResourceScope::File; + request.variables_only = true; + let mut collector = CollectorSession::new(request); + let CollectorStep::Call(fast) = collector.advance().expect("fast theme call") else { + panic!("expected fast theme call"); + }; + collector + .accept( + &fast.id, + UpstreamResult { + raw: json!({"content": [{"type": "text", "text": "corrupted theme"}]}), + }, + ) + .expect("corruption must trigger legacy fallback"); + let CollectorStep::Call(metadata) = collector.advance().expect("legacy metadata") else { + panic!("expected legacy metadata call"); + }; + assert_eq!(metadata.call.tool_name(), "get_metadata"); +} + +fn read_result(lines: &mut impl Iterator>, label: &str) -> Value { + let line = lines + .next() + .unwrap_or_else(|| panic!("missing {label} stdin line")) + .unwrap_or_else(|_| panic!("failed to read {label} stdin line")); + serde_json::from_str(&line).unwrap_or_else(|_| panic!("invalid {label} JSON envelope")) +} diff --git a/crates/devup-mcp/tests/module_boundaries.rs b/crates/devup-mcp/tests/module_boundaries.rs new file mode 100644 index 0000000..b8b6c16 --- /dev/null +++ b/crates/devup-mcp/tests/module_boundaries.rs @@ -0,0 +1,30 @@ +use std::path::PathBuf; + +#[test] +fn router_keeps_projection_and_validation_implementation_in_dedicated_modules() { + let server = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("src/server"); + let router = std::fs::read_to_string(server.join("mod.rs")).expect("server router source"); + let projection = + std::fs::read_to_string(server.join("projection.rs")).expect("projection module source"); + let validation = + std::fs::read_to_string(server.join("validation.rs")).expect("validation module source"); + + for implementation in [ + "fn projected_outputs_from_result", + "fn projection_key", + "fn validate_artifact_projection", + "fn validate_outputs", + "generate_component(", + "generate_devup_json(", + "std::fs::", + ] { + assert!( + !router.contains(implementation), + "{implementation} belongs outside the MCP router" + ); + } + assert!(projection.contains("fn projected_outputs_from_result")); + assert!(projection.contains("fn projection_key")); + assert!(validation.contains("fn validate_artifact_projection")); + assert!(validation.contains("fn validate_outputs")); +} diff --git a/crates/devup-mcp/tests/output_policy.rs b/crates/devup-mcp/tests/output_policy.rs new file mode 100644 index 0000000..9d57ee4 --- /dev/null +++ b/crates/devup-mcp/tests/output_policy.rs @@ -0,0 +1,193 @@ +use std::{ + fs::{self, File, FileTimes}, + path::PathBuf, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use devup_mcp::server::output::{OutputPolicy, OutputTransaction}; + +fn unique_temp_dir(label: &str) -> anyhow::Result { + let path = std::env::temp_dir().join(format!( + "devup-mcp-{label}-{}-{}", + std::process::id(), + SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + )); + fs::create_dir_all(&path)?; + Ok(path) +} + +#[test] +fn resolves_only_files_inside_preopened_roots() -> anyhow::Result<()> { + let root = unique_temp_dir("allowed-root")?; + let outside = unique_temp_dir("outside-root")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + + let relative = policy.resolve("nested/Component.tsx")?; + assert_eq!( + relative.display_path(), + root.join("nested").join("Component.tsx") + ); + let absolute_path = root.join("theme").join("devup.json"); + let absolute = policy.resolve(absolute_path.to_str().unwrap())?; + assert_eq!(absolute.display_path(), absolute_path); + + for invalid in [ + "", + ".", + "../escape.tsx", + root.to_str().unwrap(), + outside.join("escape.tsx").to_str().unwrap(), + "component.tsx:secret", + ] { + assert!( + policy.resolve(invalid).is_err(), + "accepted unsafe path: {invalid}" + ); + } + + drop(relative); + drop(absolute); + drop(policy); + fs::remove_dir_all(root)?; + fs::remove_dir_all(outside)?; + Ok(()) +} + +#[cfg(unix)] +#[test] +fn rejects_a_symlink_parent_that_escapes_the_root() -> anyhow::Result<()> { + use std::os::unix::fs::symlink; + + let root = unique_temp_dir("symlink-root")?; + let outside = unique_temp_dir("symlink-outside")?; + symlink(&outside, root.join("linked"))?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + + assert!(policy.resolve("linked/escape.tsx").is_err()); + assert!(!outside.join("escape.tsx").exists()); + + drop(policy); + fs::remove_file(root.join("linked"))?; + fs::remove_dir_all(root)?; + fs::remove_dir_all(outside)?; + Ok(()) +} + +#[cfg(windows)] +#[test] +fn rejects_a_directory_symlink_parent_that_escapes_the_root() -> anyhow::Result<()> { + use std::os::windows::fs::symlink_dir; + + let root = unique_temp_dir("symlink-root")?; + let outside = unique_temp_dir("symlink-outside")?; + if let Err(error) = symlink_dir(&outside, root.join("linked")) { + if error.kind() == std::io::ErrorKind::PermissionDenied { + fs::remove_dir_all(root)?; + fs::remove_dir_all(outside)?; + return Ok(()); + } + return Err(error.into()); + } + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + + assert!(policy.resolve("linked/escape.tsx").is_err()); + assert!(!outside.join("escape.tsx").exists()); + + drop(policy); + fs::remove_dir(root.join("linked"))?; + fs::remove_dir_all(root)?; + fs::remove_dir_all(outside)?; + Ok(()) +} + +#[test] +fn commits_multiple_outputs_only_after_every_stage_succeeds() -> anyhow::Result<()> { + let root = unique_temp_dir("transaction-success")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let first = policy.resolve("Component.tsx")?; + let second = policy.resolve("theme/devup.json")?; + let mut transaction = OutputTransaction::new(); + transaction.stage("tsx", first, b"export const Component = 1;\n")?; + transaction.stage("devupJson", second, br#"{"theme":{}}"#)?; + + let paths = transaction.commit()?; + + assert_eq!( + fs::read(root.join("Component.tsx"))?, + b"export const Component = 1;\n" + ); + assert_eq!(fs::read(root.join("theme/devup.json"))?, br#"{"theme":{}}"#); + assert_eq!(paths["tsx"], root.join("Component.tsx").to_string_lossy()); + assert_eq!( + paths["devupJson"], + root.join("theme").join("devup.json").to_string_lossy() + ); + + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) +} + +#[test] +fn rejects_duplicate_targets_before_replacing_any_file() -> anyhow::Result<()> { + let root = unique_temp_dir("transaction-duplicate")?; + let original = root.join("same.txt"); + fs::write(&original, b"original")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + transaction.stage("first", policy.resolve("same.txt")?, b"first")?; + + let duplicate = transaction.stage("second", policy.resolve("same.txt")?, b"second"); + + assert!(duplicate.is_err()); + assert_eq!(fs::read(&original)?, b"original"); + drop(transaction); + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) +} + +#[test] +fn staging_never_deletes_preexisting_internal_looking_siblings() -> anyhow::Result<()> { + let root = unique_temp_dir("transaction-ttl-cleanup")?; + let nested = root.join("nested"); + fs::create_dir_all(&nested)?; + let expired_temp = nested.join(".devup-tmp-00000000000000000000000000000000"); + let expired_backup = nested.join(".devup-bak-11111111111111111111111111111111"); + let recent_temp = nested.join(".devup-tmp-22222222222222222222222222222222"); + let user_file = nested.join(".devup-tmp-user.txt"); + let other_directory = root.join("other"); + fs::create_dir_all(&other_directory)?; + let untouched = other_directory.join(".devup-bak-33333333333333333333333333333333"); + for path in [ + &expired_temp, + &expired_backup, + &recent_temp, + &user_file, + &untouched, + ] { + fs::write(path, b"sentinel")?; + } + let old = SystemTime::now() - Duration::from_secs(25 * 60 * 60); + for path in [&expired_temp, &expired_backup, &user_file, &untouched] { + File::options() + .write(true) + .open(path)? + .set_times(FileTimes::new().set_modified(old))?; + } + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + + transaction.stage("tsx", policy.resolve("nested/Component.tsx")?, b"new")?; + + assert!(expired_temp.exists()); + assert!(expired_backup.exists()); + assert!(recent_temp.exists()); + assert!(user_file.exists()); + assert!(untouched.exists()); + + drop(transaction); + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) +} diff --git a/crates/devup-mcp/tests/resource_delivery.rs b/crates/devup-mcp/tests/resource_delivery.rs new file mode 100644 index 0000000..e4dfae5 --- /dev/null +++ b/crates/devup-mcp/tests/resource_delivery.rs @@ -0,0 +1,483 @@ +use std::{ + collections::BTreeMap, + fs, + path::PathBuf, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; + +use devup_mcp::server::{ + artifacts::{ArtifactLimits, ArtifactRequestKey, ArtifactStore}, + delivery::{ + DeliveryMode, MAX_INLINE_OUTPUT_BYTES, MAX_INLINE_TOTAL_BYTES, ProjectedOutput, + RESOURCE_CHUNK_BYTES, choose_delivery, choose_delivery_for_result, + }, + output::{OutputPolicy, OutputTransaction}, + resources::{list_output_resources, read_output_resource, resource_templates}, +}; +use devup_mcp_figma::{ + CollectedPayload, CollectionRequest, CollectionScope, CollectionStats, FigmaTarget, + PayloadCompleteness, ResourceScope, Snapshot, SourcePolicy, +}; +use rmcp::model::ResourceContents; +use serde_json::json; + +#[test] +fn delivery_boundaries_are_deterministic_and_strict() { + let exactly = ProjectedOutput::text( + "tsx", + "text/typescript", + vec![b'a'; MAX_INLINE_OUTPUT_BYTES], + ); + assert!( + !choose_delivery(DeliveryMode::Auto, &[exactly]) + .unwrap() + .inline + ); + + let comfortably_below_serialized_limit = + ProjectedOutput::text("tsx", "text/typescript", vec![b'a'; 100_000]); + assert!( + choose_delivery(DeliveryMode::Auto, &[comfortably_below_serialized_limit]) + .unwrap() + .inline + ); + + let over = ProjectedOutput::text( + "tsx", + "text/typescript", + vec![b'a'; MAX_INLINE_OUTPUT_BYTES + 1], + ); + assert!( + !choose_delivery(DeliveryMode::Auto, std::slice::from_ref(&over)) + .unwrap() + .inline + ); + assert!(choose_delivery(DeliveryMode::Inline, &[over]).is_ok()); + + let aggregate = (0..5) + .map(|index| { + ProjectedOutput::text( + format!("part-{index}"), + "application/json", + vec![b'x'; MAX_INLINE_TOTAL_BYTES / 5 + 1], + ) + }) + .collect::>(); + assert!( + !choose_delivery(DeliveryMode::Auto, &aggregate) + .unwrap() + .inline + ); + assert!(choose_delivery(DeliveryMode::Inline, &aggregate).is_err()); + assert!(!choose_delivery(DeliveryMode::Resource, &[]).unwrap().inline); + + assert_eq!("auto".parse::().unwrap(), DeliveryMode::Auto); + assert_eq!( + "inline".parse::().unwrap(), + DeliveryMode::Inline + ); + assert_eq!( + "resource".parse::().unwrap(), + DeliveryMode::Resource + ); + assert!("other".parse::().is_err()); +} + +#[test] +fn auto_delivery_accounts_for_json_escaping_base64_and_tool_result_duplication() { + let quote_heavy = "\"".repeat(100_000); + let text = ProjectedOutput::text("tsx", "text/typescript", quote_heavy.as_bytes().to_vec()); + assert!(text.bytes.len() < MAX_INLINE_OUTPUT_BYTES); + assert!( + !choose_delivery_for_result(DeliveryMode::Auto, &json!({"tsx": quote_heavy}), &[text],) + .unwrap() + .inline + ); + + let total_quote_heavy = "\"".repeat(300_000); + let total_text = ProjectedOutput::text( + "tsx", + "text/typescript", + total_quote_heavy.as_bytes().to_vec(), + ); + assert!( + choose_delivery_for_result( + DeliveryMode::Inline, + &json!({"tsx": total_quote_heavy}), + &[total_text], + ) + .is_err(), + "explicit inline must reject a response whose serialized wire form exceeds 1 MiB" + ); + + let below = vec![0x5a; 90_000]; + let below_base64 = STANDARD.encode(&below); + assert!( + choose_delivery_for_result( + DeliveryMode::Auto, + &json!({"referencePng": { + "mimeType": "image/png", + "dataBase64": below_base64, + "byteLength": below.len(), + "sha256": "0".repeat(64) + }}), + &[ProjectedOutput::binary("reference.png", "image/png", below)], + ) + .unwrap() + .inline + ); + + let above = vec![0x5a; 100_000]; + let above_base64 = STANDARD.encode(&above); + assert!( + !choose_delivery_for_result( + DeliveryMode::Auto, + &json!({"referencePng": { + "mimeType": "image/png", + "dataBase64": above_base64, + "byteLength": above.len(), + "sha256": "0".repeat(64) + }}), + &[ProjectedOutput::binary("reference.png", "image/png", above)], + ) + .unwrap() + .inline + ); +} + +#[tokio::test] +async fn attached_outputs_are_bounded_hashed_and_share_artifact_lifetime() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(ArtifactLimits { + ttl: Duration::from_secs(60), + max_entries: 2, + max_entry_bytes: 4 * 1024 * 1024, + max_total_bytes: 8 * 1024 * 1024, + }); + let request = request(); + let artifact = store + .insert( + ArtifactRequestKey::from_collection(&request, SourcePolicy::Direct), + payload(), + ) + .await?; + let acquisition_hash = artifact.content_hash.clone(); + let bytes = vec![0x5a; RESOURCE_CHUNK_BYTES * 2 + 7]; + + let attached = store + .attach_outputs( + &artifact.artifact_id, + "projection-key", + vec![ + ProjectedOutput::text("tsx", "text/typescript", b"hello".to_vec()), + ProjectedOutput::binary("preview", "image/png", bytes.clone()), + ], + ) + .await?; + + assert_eq!(attached.len(), 2); + assert_eq!( + store.get(&artifact.artifact_id).await.unwrap().content_hash, + acquisition_hash + ); + let preview = attached.iter().find(|item| item.name == "preview").unwrap(); + assert_eq!(preview.raw_bytes, bytes.len()); + assert_eq!(preview.chunk_count, 3); + assert!(!preview.output_id.contains(&request.target.file_key)); + let mut restored = Vec::new(); + for index in 0..preview.chunk_count { + let chunk = store + .read_output_chunk(&artifact.artifact_id, &preview.output_id, index) + .await + .expect("attached chunk"); + assert!(chunk.len() <= RESOURCE_CHUNK_BYTES); + restored.extend_from_slice(&chunk); + } + assert_eq!(restored, bytes); + + let reused = store + .attach_outputs( + &artifact.artifact_id, + "projection-key", + vec![ProjectedOutput::text( + "ignored", + "text/plain", + b"different".to_vec(), + )], + ) + .await?; + assert_eq!(reused, attached); + assert!( + store + .detach_projection(&artifact.artifact_id, "projection-key") + .await + ); + assert!( + store + .output_manifest(&artifact.artifact_id, &preview.output_id) + .await + .is_none() + ); + assert!( + !store + .detach_projection(&artifact.artifact_id, "projection-key") + .await + ); + Ok(()) +} + +#[tokio::test] +async fn resource_protocol_lists_manifests_and_round_trips_chunks() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(ArtifactLimits { + ttl: Duration::from_secs(60), + max_entries: 2, + max_entry_bytes: 4 * 1024 * 1024, + max_total_bytes: 8 * 1024 * 1024, + }); + let artifact = store + .insert( + ArtifactRequestKey::from_collection(&request(), SourcePolicy::Direct), + payload(), + ) + .await?; + let original = "가나다".repeat(100_000).into_bytes(); + let attached = store + .attach_outputs( + &artifact.artifact_id, + "unicode", + vec![ProjectedOutput::text( + "tsx", + "text/typescript", + original.clone(), + )], + ) + .await?; + let manifest = &attached[0]; + + let listed = list_output_resources(&store, None).await?; + assert_eq!(listed.resources.len(), 1); + assert_eq!(listed.resources[0].uri, manifest.manifest_uri); + assert_eq!( + listed.resources[0].mime_type.as_deref(), + Some("application/json") + ); + assert_eq!(listed.resources[0].size, None); + assert_eq!( + listed.resources[0] + .meta + .as_ref() + .and_then(|meta| meta.0.get("payloadMimeType")) + .and_then(serde_json::Value::as_str), + Some("text/typescript") + ); + assert!(listed.next_cursor.is_none()); + assert_eq!(resource_templates().resource_templates.len(), 2); + + let manifest_read = read_output_resource(&store, &manifest.manifest_uri).await?; + let ResourceContents::TextResourceContents { text, .. } = &manifest_read.contents[0] else { + panic!("manifest must be JSON text") + }; + let value: serde_json::Value = serde_json::from_str(text.as_str())?; + assert_eq!(value["sha256"], manifest.sha256); + assert_eq!(value["rawBytes"], original.len()); + + let mut restored = Vec::new(); + for index in 0..manifest.chunk_count { + let uri = format!( + "devup://artifact/{}/outputs/{}/chunks/{index}", + artifact.artifact_id, manifest.output_id + ); + let read = read_output_resource(&store, &uri).await?; + let ResourceContents::TextResourceContents { text, .. } = &read.contents[0] else { + panic!("text chunk expected") + }; + restored.extend_from_slice(text.as_bytes()); + } + assert_eq!(restored, original); + assert!( + read_output_resource( + &store, + "devup://artifact/not-an-id/outputs/not-an-id/chunks/0" + ) + .await + .is_err() + ); + Ok(()) +} + +#[tokio::test] +async fn reserved_resources_stay_invisible_until_publication() -> anyhow::Result<()> { + let store = ArtifactStore::with_limits(ArtifactLimits { + ttl: Duration::from_secs(60), + max_entries: 2, + max_entry_bytes: 4 * 1024 * 1024, + max_total_bytes: 8 * 1024 * 1024, + }); + let artifact = store + .insert( + ArtifactRequestKey::from_collection(&request(), SourcePolicy::Direct), + payload(), + ) + .await?; + let root = unique_temp_dir("combined-publication")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + transaction.stage("tsx", policy.resolve("Component.tsx")?, b"reserved")?; + let reservation = store + .reserve_outputs( + &artifact.artifact_id, + "invisible", + vec![ProjectedOutput::text( + "tsx", + "text/typescript", + b"reserved".to_vec(), + )], + ) + .await?; + let manifest_uri = reservation.manifests()[0].manifest_uri.clone(); + let listing_store = store.clone(); + let (started_tx, started_rx) = tokio::sync::oneshot::channel(); + let mut listing = tokio::spawn(async move { + let _ = started_tx.send(()); + list_output_resources(&listing_store, None).await + }); + let reading_store = store.clone(); + let reading_uri = manifest_uri.clone(); + let (reading_started_tx, reading_started_rx) = tokio::sync::oneshot::channel(); + let mut reading = tokio::spawn(async move { + let _ = reading_started_tx.send(()); + read_output_resource(&reading_store, &reading_uri).await + }); + + started_rx.await?; + reading_started_rx.await?; + assert!( + tokio::time::timeout(Duration::from_millis(25), &mut listing) + .await + .is_err(), + "resources/list must not observe an in-between reservation" + ); + assert!( + tokio::time::timeout(Duration::from_millis(25), &mut reading) + .await + .is_err(), + "resources/read must not observe an in-between reservation" + ); + transaction.commit()?; + reservation.commit(); + + assert_eq!(listing.await??.resources.len(), 1); + assert!(reading.await?.is_ok()); + assert_eq!(fs::read(root.join("Component.tsx"))?, b"reserved"); + + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) +} + +#[tokio::test] +async fn failed_file_commit_does_not_publish_or_evict_lru_resources() -> anyhow::Result<()> { + let sample_bytes = serde_json::to_vec(&payload())?.len(); + let store = ArtifactStore::with_limits(ArtifactLimits { + ttl: Duration::from_secs(60), + max_entries: 2, + max_entry_bytes: sample_bytes * 2, + max_total_bytes: sample_bytes * 2 + 32, + }); + let target = store + .insert( + ArtifactRequestKey::from_collection(&request(), SourcePolicy::Direct), + payload(), + ) + .await?; + let mut unrelated_request = request(); + unrelated_request.target.file_key = "UnrelatedFile".to_owned(); + let mut unrelated_payload = payload(); + unrelated_payload.target.file_key = "UnrelatedFile".to_owned(); + unrelated_payload.snapshot.file_key = "UnrelatedFile".to_owned(); + let unrelated = store + .insert( + ArtifactRequestKey::from_collection(&unrelated_request, SourcePolicy::Direct), + unrelated_payload, + ) + .await?; + let reservation = store + .reserve_outputs( + &target.artifact_id, + "will-roll-back", + vec![ProjectedOutput::text( + "tsx", + "text/typescript", + vec![b'x'; 128], + )], + ) + .await?; + let manifest_uri = reservation.manifests()[0].manifest_uri.clone(); + + let root = unique_temp_dir("combined-rollback")?; + let policy = OutputPolicy::from_roots(vec![root.clone()])?; + let mut transaction = OutputTransaction::new(); + transaction.stage("tsx", policy.resolve("Component.tsx")?, b"new")?; + fs::create_dir(root.join("Component.tsx"))?; + assert!(transaction.commit().is_err()); + reservation.rollback(); + + assert!(store.get(&unrelated.artifact_id).await.is_some()); + assert!(read_output_resource(&store, &manifest_uri).await.is_err()); + assert!( + list_output_resources(&store, None) + .await? + .resources + .is_empty() + ); + + drop(policy); + fs::remove_dir_all(root)?; + Ok(()) +} + +fn unique_temp_dir(label: &str) -> anyhow::Result { + let path = std::env::temp_dir().join(format!( + "devup-mcp-{label}-{}-{}", + std::process::id(), + SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + )); + fs::create_dir_all(&path)?; + Ok(path) +} + +fn request() -> CollectionRequest { + let mut request = CollectionRequest::new( + FigmaTarget { + file_key: "FileKey123".to_owned(), + node_id: Some("1:1".to_owned()), + branch_key: None, + }, + CollectionScope::Node, + ); + request.resource_scope = ResourceScope::Used; + request +} + +fn payload() -> CollectedPayload { + CollectedPayload { + target: request().target, + scope: CollectionScope::Node, + metadata: json!({}), + snapshot: Snapshot { + file_key: "FileKey123".to_owned(), + version: None, + roots: vec!["1:1".to_owned()], + nodes: BTreeMap::new(), + diagnostics: Vec::new(), + }, + variables: None, + styles: None, + completeness: PayloadCompleteness::ResolvedValuesOnly, + source_version: None, + stats: CollectionStats::default(), + assets: Vec::new(), + reference_png: None, + } +} diff --git a/crates/devup-mcp/tests/section_export.rs b/crates/devup-mcp/tests/section_export.rs new file mode 100644 index 0000000..6a339ee --- /dev/null +++ b/crates/devup-mcp/tests/section_export.rs @@ -0,0 +1,325 @@ +use std::sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, +}; + +use async_trait::async_trait; +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp::server::{DevupAuth, DevupServer, Services}; +use devup_mcp_figma::{ + AuthStatus, BuiltinScript, DevupError, ErrorCode, FigmaUpstream, ReadToolCall, UpstreamResult, +}; +use rmcp::{ServiceExt, model::CallToolRequestParams}; +use serde_json::{Map, Value, json}; + +#[derive(Debug)] +struct ConnectedAuth; + +#[async_trait] +impl DevupAuth for ConnectedAuth { + async fn status(&self) -> Result { + Ok(AuthStatus::Connected) + } + async fn login(&self) -> Result { + Ok(AuthStatus::Connected) + } + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +#[derive(Debug, Default)] +struct SectionUpstream(AtomicUsize); + +#[async_trait] +impl FigmaUpstream for SectionUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["use_figma".to_owned()]) + } + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + self.0.fetch_add(1, Ordering::SeqCst); + match call { + ReadToolCall::Snapshot { + script: BuiltinScript::FastSnapshotEnvelope, + .. + } => Ok(compact_section_index_result()), + ReadToolCall::Snapshot { + script: BuiltinScript::MultiRootSnapshotEnvelope, + root_ids: Some(root_ids), + .. + } => Ok(multi_root_envelope(&root_ids)), + _ => Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "section export must use one fast acquisition", + false, + )), + } + } +} + +async fn call( + client: &rmcp::service::RunningService, + arguments: Value, +) -> anyhow::Result { + let arguments: Map = arguments.as_object().cloned().unwrap(); + let result = client + .call_tool(CallToolRequestParams::new("devup_figma_export").with_arguments(arguments)) + .await?; + Ok(result.structured_content.expect("structured output")) +} + +#[tokio::test] +async fn section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact() +-> anyhow::Result<()> { + let upstream = Arc::new(SectionUpstream::default()); + let server = DevupServer::new(Services::new(Arc::new(ConnectedAuth), upstream.clone())); + let (server_transport, client_transport) = tokio::io::duplex(256 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let url = "https://www.figma.com/design/FileKey123/Fixture?node-id=10-1"; + + let selection = call( + &client, + json!({"url": url, "outputs": ["tsx"], "sourcePolicy": "direct"}), + ) + .await?; + assert_eq!(selection["status"], "selection_required"); + assert_eq!(selection["targetKind"], "section"); + assert!(selection.get("tsx").is_none()); + assert_eq!(selection["collection"]["figmaToolCalls"], 1); + assert_eq!( + selection["selection"]["candidates"] + .as_array() + .unwrap() + .iter() + .map(|candidate| candidate["node"]["nodeId"].as_str().unwrap()) + .collect::>(), + ["10:3", "10:2"] + ); + assert_eq!(upstream.0.load(Ordering::SeqCst), 1); + let artifact_id = selection["cache"]["artifactId"].as_str().unwrap(); + assert_eq!(selection["cache"]["capabilities"]["kind"], "section-index"); + + let selected = call( + &client, + json!({ + "artifactId": artifact_id, + "outputs": ["tsx", "sourceMap"], + "frameIds": ["10:2", "10:3"] + }), + ) + .await?; + assert_eq!(selected["status"], "complete"); + assert_eq!( + selected["frames"] + .as_array() + .unwrap() + .iter() + .map(|frame| frame["nodeId"].as_str().unwrap()) + .collect::>(), + ["10:3", "10:2"] + ); + assert!( + selected["frames"][0]["tsx"] + .as_str() + .unwrap() + .contains("First") + ); + assert_eq!(selected["frames"][0]["sourceMap"]["version"], 1); + assert!( + selected["frames"][0]["sourceMap"]["entries"] + .as_array() + .is_some_and(|entries| entries + .iter() + .any(|entry| entry["nodeId"] == "10:3" && entry["property"] == "type")) + ); + assert_eq!(selected["cache"]["cacheHit"], false); + assert_eq!(selected["collection"]["figmaToolCalls"], 1); + assert_eq!(upstream.0.load(Ordering::SeqCst), 2); + let selected_artifact_id = selected["cache"]["artifactId"].as_str().unwrap(); + + let all = call( + &client, + json!({ + "artifactId": selected_artifact_id, + "outputs": ["tsx"], + "allScreens": true + }), + ) + .await?; + assert_eq!( + all["frames"] + .as_array() + .unwrap() + .iter() + .map(|frame| frame["nodeId"].as_str().unwrap()) + .collect::>(), + ["10:3", "10:2"] + ); + assert_eq!(upstream.0.load(Ordering::SeqCst), 2); + assert_eq!(all["collection"]["figmaToolCalls"], 1); + + let invalid = client + .call_tool( + CallToolRequestParams::new("devup_figma_export").with_arguments( + json!({ + "artifactId": artifact_id, + "outputs": ["tsx"], + "frameIds": ["99:99"] + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await; + assert!(invalid.is_err()); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[test] +fn actual_wquw_151_section_fixture_preserves_the_ten_screen_index() { + let fixture: Value = serde_json::from_str(include_str!("fixtures/wquw-151-section.json")) + .expect("actual WQUW-151 Section fixture"); + assert_eq!(fixture["source"]["fileKey"], "85CgSws3o5XsLv7aAwWJyS"); + assert_eq!(fixture["source"]["nodeId"], "4217:7743"); + assert_eq!(fixture["section"]["name"], "[FR-026] 본연체"); + assert_eq!(fixture["proofreadTargetId"], "3879:35518"); + let candidates = fixture["screenCandidates"] + .as_array() + .expect("screen candidates"); + assert_eq!(candidates.len(), 10); + assert_eq!( + candidates + .iter() + .map(|candidate| candidate["id"].as_str().expect("candidate id")) + .collect::>(), + [ + "3879:36108", + "3879:36059", + "3879:35503", + "3879:35518", + "3879:35569", + "3879:36144", + "3879:35729", + "3879:35887", + "3879:35973", + "3879:35652", + ] + ); +} + +fn compact_section_index_result() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "fileKey": "FileKey123", "version": null, "rootIds": ["10:1"], + "nodes": [ + {"id": "10:1", "type": "SECTION", "fields": { + "name": "Proofread states", "parentId": "0:1", "childrenIds": ["10:2", "10:3"], + "visible": true, "projectionTruncated": false, + "absoluteBoundingBox": {"x": 0, "y": 0, "width": 1200, "height": 1000} + }, "extra": {}, "fieldErrors": {}}, + {"id": "10:2", "type": "FRAME", "fields": { + "name": "Second", "parentId": "10:1", "childrenIds": [], "visible": true, + "directChildCount": 0, "subtreeNodeCount": 1, "estimatedSerializedBytes": 1000, + "absoluteBoundingBox": {"x": 500, "y": 120, "width": 360, "height": 740} + }, "extra": {}, "fieldErrors": {}}, + {"id": "10:3", "type": "FRAME", "fields": { + "name": "First", "parentId": "10:1", "childrenIds": [], "visible": true, + "directChildCount": 0, "subtreeNodeCount": 1, "estimatedSerializedBytes": 1000, + "absoluteBoundingBox": {"x": 100, "y": 120, "width": 360, "height": 740} + }, "extra": {}, "fieldErrors": {}} + ], "diagnostics": [] + }), + } +} + +fn multi_root_envelope(root_ids: &[String]) -> UpstreamResult { + let nodes = root_ids + .iter() + .map(|root_id| match root_id.as_str() { + "10:2" => json!({"id": "10:2", "type": "FRAME", "fields": { + "name": "Second", "parentId": "10:1", "childrenIds": [], "visible": true, + "absoluteBoundingBox": {"x": 500, "y": 120, "width": 360, "height": 740}, + "layoutMode": "VERTICAL", "width": 360, "height": 740 + }, "extra": {}, "fieldErrors": {}}), + "10:3" => json!({"id": "10:3", "type": "FRAME", "fields": { + "name": "First", "parentId": "10:1", "childrenIds": [], "visible": true, + "absoluteBoundingBox": {"x": 100, "y": 120, "width": 360, "height": 740}, + "layoutMode": "VERTICAL", "width": 360, "height": 740 + }, "extra": {}, "fieldErrors": {}}), + _ => panic!("unexpected selected root"), + }) + .collect::>(); + let mut envelope = json!({ + "schemaVersion": 1, + "source": {"fileKey": "FileKey123", "rootId": "10:1"}, + "snapshot": { + "fileKey": "FileKey123", "version": null, "rootIds": root_ids, + "nodes": nodes, "diagnostics": [] + }, + "resources": { + "collections": [], "variables": [], "styles": [], + "usedRemoteVariables": [], "usedVariableIds": [], "usedStyleIds": [], + "localComplete": false, "usedRemoteComplete": true, "unresolved": [] + }, + "integrity": {"nodeCount": root_ids.len(), "variableRefCount": 0, "styleRefCount": 0, "utf8Bytes": 0} + }); + let bytes = loop { + let bytes = serde_json::to_vec(&envelope).unwrap(); + if envelope["integrity"]["utf8Bytes"] == bytes.len() as u64 { + break bytes; + } + envelope["integrity"]["utf8Bytes"] = Value::from(bytes.len()); + }; + let mut png = b"\x89PNG\r\n\x1a\n".to_vec(); + push_chunk(&mut png, b"IHDR", &[0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0]); + let mut chunk = Vec::with_capacity(bytes.len() + 8); + chunk.extend_from_slice(&0_u32.to_be_bytes()); + chunk.extend_from_slice(&1_u32.to_be_bytes()); + chunk.extend_from_slice(&bytes); + push_chunk(&mut png, b"duVp", &chunk); + push_chunk( + &mut png, + b"IDAT", + &[0x78, 1, 1, 5, 0, 0xfa, 0xff, 0, 0, 0, 0, 0, 5, 0, 1], + ); + push_chunk(&mut png, b"IEND", &[]); + let descriptor = json!({ + "kind": "devupFastSnapshotDescriptor", "schemaVersion": 1, "rootId": "10:1", + "nodeCount": root_ids.len(), "variableRefCount": 0, "styleRefCount": 0, + "utf8Bytes": bytes.len(), "chunkCount": 1 + }); + UpstreamResult { + raw: json!({"content": [ + {"type": "text", "text": descriptor.to_string()}, + {"type": "image", "data": STANDARD.encode(png), "mimeType": "image/png"} + ]}), + } +} + +fn push_chunk(output: &mut Vec, kind: &[u8; 4], data: &[u8]) { + output.extend_from_slice(&(data.len() as u32).to_be_bytes()); + output.extend_from_slice(kind); + output.extend_from_slice(data); + let mut crc_input = kind.to_vec(); + crc_input.extend_from_slice(data); + output.extend_from_slice(&crc32(&crc_input).to_be_bytes()); +} + +fn crc32(bytes: &[u8]) -> u32 { + let mut crc = u32::MAX; + for byte in bytes { + crc ^= u32::from(*byte); + for _ in 0..8 { + crc = (crc >> 1) ^ (0xedb8_8320 & 0_u32.wrapping_sub(crc & 1)); + } + } + !crc +} diff --git a/crates/devup-mcp/tests/source_orchestration.rs b/crates/devup-mcp/tests/source_orchestration.rs new file mode 100644 index 0000000..8461421 --- /dev/null +++ b/crates/devup-mcp/tests/source_orchestration.rs @@ -0,0 +1,641 @@ +use std::sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, +}; + +use async_trait::async_trait; +use devup_mcp::server::{DevupAuth, DevupServer, Services}; +use devup_mcp_figma::{ + AuthStatus, DevupError, ErrorCode, FigmaUpstream, ReadToolCall, UpstreamResult, +}; +use rmcp::{ + ServiceExt, + model::{CallToolRequestParams, CallToolResult}, +}; +use serde_json::{Map, Value, json}; + +struct AuthProbe { + status: AuthStatus, + logins: AtomicUsize, +} + +#[async_trait] +impl DevupAuth for AuthProbe { + async fn status(&self) -> Result { + Ok(self.status) + } + + async fn login(&self) -> Result { + self.logins.fetch_add(1, Ordering::SeqCst); + Ok(AuthStatus::Connected) + } + + async fn logout(&self) -> Result { + Ok(AuthStatus::Disconnected) + } +} + +struct UpstreamProbe { + calls: AtomicUsize, + error_code: ErrorCode, +} + +impl UpstreamProbe { + fn unavailable() -> Self { + Self { + calls: AtomicUsize::new(0), + error_code: ErrorCode::DevupFigmaDirectUnavailable, + } + } +} + +#[async_trait] +impl FigmaUpstream for UpstreamProbe { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["get_metadata".to_owned(), "use_figma".to_owned()]) + } + + async fn call_read_tool(&self, _call: ReadToolCall) -> Result { + self.calls.fetch_add(1, Ordering::SeqCst); + Err(DevupError::new( + self.error_code, + "synthetic direct failure", + false, + )) + } +} + +#[derive(Default)] +struct FixtureUpstream { + calls: AtomicUsize, +} + +#[derive(Default)] +struct FastRejectingFixture { + calls: AtomicUsize, +} + +#[async_trait] +impl FigmaUpstream for FastRejectingFixture { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["get_metadata".to_owned(), "use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + let index = self.calls.fetch_add(1, Ordering::SeqCst); + if index == 0 { + return Err(DevupError::new( + ErrorCode::DevupFigmaDirectUnavailable, + "fast transport unavailable", + false, + )); + } + let raw = match call.tool_name() { + "get_metadata" => metadata_result(), + "use_figma" => snapshot_result(), + _ => unreachable!(), + }; + Ok(UpstreamResult { raw }) + } +} + +#[async_trait] +impl FigmaUpstream for FixtureUpstream { + async fn list_tools(&self) -> Result, DevupError> { + Ok(vec!["get_metadata".to_owned(), "use_figma".to_owned()]) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + self.calls.fetch_add(1, Ordering::SeqCst); + let raw = match call.tool_name() { + "get_metadata" => metadata_result(), + "use_figma" => snapshot_result(), + _ => unreachable!(), + }; + Ok(UpstreamResult { raw }) + } +} + +async fn call_tool( + auth: Arc, + upstream: Arc, + arguments: Value, +) -> anyhow::Result { + call_named_tool(auth, upstream, "devup_figma_to_ui", arguments).await +} + +async fn call_named_tool( + auth: Arc, + upstream: Arc, + tool: &str, + arguments: Value, +) -> anyhow::Result { + let server = DevupServer::new(Services::new(auth, upstream)); + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let arguments: Map = arguments.as_object().cloned().unwrap(); + let result = client + .call_tool(CallToolRequestParams::new(tool.to_owned()).with_arguments(arguments)) + .await?; + client.cancel().await?; + task.await??; + Ok(result) +} + +async fn call_named_tool_with_roots( + auth: Arc, + upstream: Arc, + tool: &str, + arguments: Value, + roots: Vec, +) -> anyhow::Result { + let server = DevupServer::with_output_roots(Services::new(auth, upstream), roots)?; + let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + let arguments: Map = arguments.as_object().cloned().unwrap(); + let result = client + .call_tool(CallToolRequestParams::new(tool.to_owned()).with_arguments(arguments)) + .await?; + client.cancel().await?; + task.await??; + Ok(result) +} + +#[tokio::test] +async fn search_collects_the_file_and_returns_replayable_node_urls() -> anyhow::Result<()> { + let upstream = Arc::new(FixtureUpstream::default()); + let result = call_named_tool( + Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }), + upstream.clone(), + "devup_figma_search", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture", + "query": "syntheticframe", + "sourcePolicy": "direct" + }), + ) + .await?; + let output = result.structured_content.unwrap(); + assert_eq!(output["status"], "complete"); + assert_eq!(output["count"], 1); + assert_eq!(output["matches"][0]["nodeId"], "1:2"); + assert_eq!(output["matches"][0]["matchKind"], "normalized-exact"); + assert_eq!( + output["matches"][0]["canonicalUrl"], + "https://www.figma.com/design/FileKey123/devup?node-id=1-2" + ); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + Ok(()) +} + +#[tokio::test] +async fn ui_output_path_writes_the_generated_artifact_only_when_requested() -> anyhow::Result<()> { + let root = std::env::temp_dir().join(format!( + "devup-mcp-output-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH)? + .as_nanos() + )); + std::fs::create_dir_all(&root)?; + let path = root.join("generated.tsx"); + let result = call_named_tool_with_roots( + Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }), + Arc::new(FixtureUpstream::default()), + "devup_figma_to_ui", + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "sourcePolicy": "direct", + "outputPath": path + }), + vec![root.clone()], + ) + .await?; + let output = result.structured_content.unwrap(); + let written = std::fs::read_to_string(&path)?; + assert_eq!(written, output["tsx"].as_str().unwrap()); + assert!(output["outputPath"].as_str().is_some()); + std::fs::remove_file(path)?; + std::fs::remove_dir(root)?; + Ok(()) +} + +fn input(policy: &str) -> Value { + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "sourcePolicy": policy + }) +} + +fn metadata_result() -> Value { + json!({ + "structuredContent": { + "devupMetadata": { + "fileKey": "FileKey123", + "version": "v1", + "rootId": "1:2", + "nodes": [{ + "id": "1:2", "type": "FRAME", "name": "Synthetic Frame", + "childrenIds": [], "descendantCount": 1 + }] + } + } + }) +} + +fn snapshot_result() -> Value { + json!({ + "fileKey": "FileKey123", + "version": "v1", + "rootIds": ["1:2"], + "nodes": [{ + "id": "1:2", "type": "FRAME", + "fields": { + "name": "Synthetic Frame", "childrenIds": [], + "layoutMode": "VERTICAL", + "layoutSizingHorizontal": "FIXED", "layoutSizingVertical": "FIXED", + "width": 320, "height": 240 + }, + "extra": {}, "fieldErrors": {} + }] + }) +} + +#[tokio::test] +async fn auto_disconnected_returns_handoff_without_starting_oauth() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Disconnected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(UpstreamProbe::unavailable()); + let result = call_tool(auth.clone(), upstream.clone(), input("auto")).await?; + let output = result.structured_content.unwrap(); + + assert_eq!(output["status"], "needs_figma"); + assert_eq!(output["resumeTool"], "devup_figma_continue"); + assert_eq!(output["calls"][0]["tool"], "use_figma"); + assert!( + output["calls"][0]["arguments"]["code"] + .as_str() + .unwrap() + .contains("devupFastSnapshotDescriptor") + ); + assert!(output["expiresAt"].as_str().unwrap().contains('T')); + assert!(output["expiresAt"].as_str().unwrap().ends_with('Z')); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn host_policy_never_calls_direct_auth_or_upstream() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(UpstreamProbe::unavailable()); + let result = call_tool(auth.clone(), upstream.clone(), input("host")).await?; + let output = result.structured_content.unwrap(); + + assert_eq!(output["status"], "needs_figma"); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn direct_disconnected_never_starts_oauth() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Disconnected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(UpstreamProbe::unavailable()); + let result = call_tool(auth.clone(), upstream.clone(), input("direct")).await; + + assert!(result.is_err()); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn connected_auto_completes_through_the_direct_collector() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(FixtureUpstream::default()); + let result = call_tool(auth.clone(), upstream.clone(), input("auto")).await?; + let output = result.structured_content.unwrap(); + + assert_eq!(output["status"], "complete"); + assert_eq!(output["source"]["kind"], "direct"); + assert_eq!(output["rootLayout"], "standalone"); + assert!(output["tsx"].as_str().unwrap().contains("SyntheticFrame")); + assert_eq!(output["collection"]["figmaToolCalls"], 3); + assert_eq!(output["collection"]["transport"], "legacy-cursor"); + assert_eq!(output["collection"]["fallbackUsed"], true); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 3); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn embedded_root_layout_omits_selected_frame_dimensions() -> anyhow::Result<()> { + let result = call_tool( + Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }), + Arc::new(FixtureUpstream::default()), + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "sourcePolicy": "direct", + "rootLayout": "embedded" + }), + ) + .await?; + let output = result.structured_content.unwrap(); + + assert_eq!(output["rootLayout"], "embedded"); + let tsx = output["tsx"].as_str().unwrap(); + assert!(!tsx.contains("h=\"240px\"")); + assert!(!tsx.contains("w=\"320px\"")); + Ok(()) +} + +#[tokio::test] +async fn rejects_unknown_root_layout_before_collecting() -> anyhow::Result<()> { + let upstream = Arc::new(FixtureUpstream::default()); + let result = call_tool( + Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }), + upstream.clone(), + json!({ + "url": "https://www.figma.com/design/FileKey123/Fixture?node-id=1-2", + "sourcePolicy": "direct", + "rootLayout": "fluid" + }), + ) + .await; + + assert!(result.is_err()); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 0); + Ok(()) +} + +#[tokio::test] +async fn direct_fast_call_error_restarts_the_legacy_collector() -> anyhow::Result<()> { + let upstream = Arc::new(FastRejectingFixture::default()); + let result = call_tool( + Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }), + upstream.clone(), + input("direct"), + ) + .await?; + let output = result.structured_content.unwrap(); + + assert_eq!(output["status"], "complete"); + assert_eq!(output["collection"]["figmaToolCalls"], 3); + assert_eq!(output["collection"]["fallbackUsed"], true); + assert_eq!( + output["collection"]["fallbackReason"], + "DevupFigmaDirectUnavailable" + ); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 3); + Ok(()) +} + +#[tokio::test] +async fn auto_falls_back_for_capability_failure_but_not_rate_limit() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }); + let unavailable = Arc::new(UpstreamProbe::unavailable()); + let fallback = call_tool(auth.clone(), unavailable, input("auto")).await?; + assert_eq!( + fallback.structured_content.unwrap()["status"], + "needs_figma" + ); + + let rate_limited = Arc::new(UpstreamProbe { + calls: AtomicUsize::new(0), + error_code: ErrorCode::DevupFigmaRateLimited, + }); + let rejected = call_tool(auth, rate_limited.clone(), input("auto")).await; + assert!(rejected.is_err()); + assert_eq!(rate_limited.calls.load(Ordering::SeqCst), 1); + Ok(()) +} + +#[tokio::test] +async fn public_continuation_finishes_a_multi_call_host_collection() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Disconnected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(UpstreamProbe::unavailable()); + let server = DevupServer::new(Services::new(auth, upstream)); + let (server_transport, client_transport) = tokio::io::duplex(128 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + + let start = client + .call_tool( + CallToolRequestParams::new("devup_figma_to_ui") + .with_arguments(input("host").as_object().cloned().unwrap()), + ) + .await? + .structured_content + .unwrap(); + let session_id = start["sessionId"].as_str().unwrap(); + let fast_call = start["calls"][0]["callId"].as_str().unwrap(); + let after_fast = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": fast_call, + "result": snapshot_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + assert_eq!(after_fast["calls"][0]["tool"], "get_metadata"); + let metadata_call = after_fast["calls"][0]["callId"].as_str().unwrap(); + let after_metadata = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": metadata_call, + "result": metadata_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + assert_eq!(after_metadata["status"], "needs_figma"); + assert_eq!(after_metadata["calls"][0]["tool"], "use_figma"); + + let snapshot_call = after_metadata["calls"][0]["callId"].as_str().unwrap(); + let complete = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": snapshot_call, + "result": snapshot_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + assert_eq!(complete["status"], "complete"); + assert_eq!(complete["source"]["kind"], "host"); + assert!(complete["tsx"].as_str().unwrap().contains("SyntheticFrame")); + assert_eq!(complete["collection"]["figmaToolCalls"], 3); + assert_eq!(complete["collection"]["fallbackUsed"], true); + + client.cancel().await?; + task.await??; + Ok(()) +} + +#[tokio::test] +async fn direct_and_host_collection_produce_identical_artifacts() -> anyhow::Result<()> { + let auth = Arc::new(AuthProbe { + status: AuthStatus::Connected, + logins: AtomicUsize::new(0), + }); + let upstream = Arc::new(FixtureUpstream::default()); + let server = DevupServer::new(Services::new(auth, upstream)); + let (server_transport, client_transport) = tokio::io::duplex(128 * 1024); + let task = tokio::spawn(async move { + server.serve(server_transport).await?.waiting().await?; + anyhow::Ok(()) + }); + let client = ().serve(client_transport).await?; + + let direct = client + .call_tool( + CallToolRequestParams::new("devup_figma_to_ui") + .with_arguments(input("direct").as_object().cloned().unwrap()), + ) + .await? + .structured_content + .unwrap(); + let start = client + .call_tool( + CallToolRequestParams::new("devup_figma_to_ui") + .with_arguments(input("host").as_object().cloned().unwrap()), + ) + .await? + .structured_content + .unwrap(); + let session_id = start["sessionId"].as_str().unwrap(); + let fast_call = start["calls"][0]["callId"].as_str().unwrap(); + let after_fast = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": fast_call, + "result": snapshot_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + let metadata_call = after_fast["calls"][0]["callId"].as_str().unwrap(); + let after_metadata = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": metadata_call, + "result": metadata_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + let snapshot_call = after_metadata["calls"][0]["callId"].as_str().unwrap(); + let host = client + .call_tool( + CallToolRequestParams::new("devup_figma_continue").with_arguments( + json!({ + "sessionId": session_id, + "callId": snapshot_call, + "result": snapshot_result() + }) + .as_object() + .cloned() + .unwrap(), + ), + ) + .await? + .structured_content + .unwrap(); + + for field in [ + "tsx", + "imports", + "usedTokens", + "diagnostics", + "snapshot", + "collection", + ] { + assert_eq!(direct[field], host[field], "source changed {field}"); + } + assert_eq!(direct["source"]["kind"], "direct"); + assert_eq!(host["source"]["kind"], "host"); + + client.cancel().await?; + task.await??; + Ok(()) +} diff --git a/crates/devup-mcp/tests/stdio_smoke.rs b/crates/devup-mcp/tests/stdio_smoke.rs new file mode 100644 index 0000000..28f51da --- /dev/null +++ b/crates/devup-mcp/tests/stdio_smoke.rs @@ -0,0 +1,260 @@ +//! Raw wire-protocol regression test for the "opencode can't load devup-mcp" +//! incompatibility. +//! +//! Root cause: `devup_figma_continue`'s `result` field is typed +//! `serde_json::Value` so it can carry an arbitrary host-executed Figma MCP +//! response. schemars' blanket `JsonSchema` impl for `Value` serializes that +//! to the JSON Schema 2020-12 boolean shorthand `true` ("accept anything"). +//! That is spec-legal, but several MCP clients' schema converters (opencode +//! included) assume every `properties` entry is a JSON object and reject the +//! *entire* `tools/list` response — not just the one field — when they hit a +//! bare boolean. Every `outputSchema` also lacked the `"type": "object"` +//! marker the spec (SEP-2106) requires. +//! +//! `stdio_tools.rs` exercises the same server through rmcp's own in-process +//! client, but that client deserializes `Tool.input_schema`/`output_schema` +//! into typed `Arc` before test code can inspect them — a +//! boolean schema and an equivalent object schema round-trip identically +//! through that path, so a regression there would not be caught. This test +//! instead spawns the actual compiled `devup-mcp` binary over real OS pipes +//! and parses the raw `tools/list` JSON exactly as an external client would, +//! so a reintroduced boolean schema anywhere fails here. + +use std::{ + io::{BufRead, BufReader, Write}, + process::{Child, ChildStdin, ChildStdout, Command, Stdio}, +}; + +use serde_json::{Value, json}; + +/// JSON Schema keywords whose value is itself a single (sub-)schema. +const SINGLE_SCHEMA_KEYS: &[&str] = &[ + "items", + "additionalProperties", + "additionalItems", + "contains", + "propertyNames", + "not", + "if", + "then", + "else", + "unevaluatedItems", + "unevaluatedProperties", +]; + +/// JSON Schema keywords whose value is a map of name -> schema. +const MAP_SCHEMA_KEYS: &[&str] = &[ + "properties", + "patternProperties", + "$defs", + "definitions", + "dependentSchemas", +]; + +/// JSON Schema keywords whose value is an array of schemas. +const LIST_SCHEMA_KEYS: &[&str] = &["allOf", "anyOf", "oneOf", "prefixItems"]; + +/// Recursively finds every position in `node` (a JSON Schema document rooted +/// at `path`) where a bare boolean (`true`/`false`) appears where the spec +/// expects a schema. Returns the dotted path of each hit, or an empty `Vec` +/// if none are found. +fn find_boolean_schemas(path: &str, node: &Value) -> Vec { + let mut hits = Vec::new(); + collect_boolean_schemas(path, node, &mut hits); + hits +} + +fn collect_boolean_schemas(path: &str, node: &Value, hits: &mut Vec) { + if node.is_boolean() { + hits.push(path.to_owned()); + return; + } + let Some(object) = node.as_object() else { + return; + }; + for key in SINGLE_SCHEMA_KEYS { + if let Some(child) = object.get(*key) { + collect_boolean_schemas(&format!("{path}.{key}"), child, hits); + } + } + for key in MAP_SCHEMA_KEYS { + if let Some(Value::Object(map)) = object.get(*key) { + for (name, child) in map { + collect_boolean_schemas(&format!("{path}.{key}.{name}"), child, hits); + } + } + } + for key in LIST_SCHEMA_KEYS { + if let Some(Value::Array(items)) = object.get(*key) { + for (index, child) in items.iter().enumerate() { + collect_boolean_schemas(&format!("{path}.{key}[{index}]"), child, hits); + } + } + } +} + +/// A minimal, dependency-free JSON-RPC-over-newline-delimited-stdio client, +/// deliberately independent of rmcp's own client so this test observes the +/// exact bytes an external MCP client would. +struct RawStdioClient { + child: Child, + stdin: ChildStdin, + stdout: BufReader, + next_id: u64, +} + +impl RawStdioClient { + fn spawn() -> anyhow::Result { + let mut child = Command::new(env!("CARGO_BIN_EXE_devup-mcp")) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn()?; + let stdin = child.stdin.take().expect("devup-mcp stdin must be piped"); + let stdout = BufReader::new(child.stdout.take().expect("devup-mcp stdout must be piped")); + Ok(Self { + child, + stdin, + stdout, + next_id: 1, + }) + } + + fn call(&mut self, method: &str, params: Value) -> anyhow::Result { + let id = self.next_id; + self.next_id += 1; + self.send(&json!({ + "jsonrpc": "2.0", + "id": id, + "method": method, + "params": params, + }))?; + loop { + let response = self.read_message()?; + if response.get("id") == Some(&Value::from(id)) { + return Ok(response); + } + // Frames with a different (or absent) id are notifications / + // unrelated responses; keep reading until ours arrives. + } + } + + fn notify(&mut self, method: &str, params: Value) -> anyhow::Result<()> { + self.send(&json!({ + "jsonrpc": "2.0", + "method": method, + "params": params, + })) + } + + fn send(&mut self, message: &Value) -> anyhow::Result<()> { + let mut line = serde_json::to_string(message)?; + line.push('\n'); + self.stdin.write_all(line.as_bytes())?; + self.stdin.flush()?; + Ok(()) + } + + fn read_message(&mut self) -> anyhow::Result { + let mut line = String::new(); + loop { + line.clear(); + let read = self.stdout.read_line(&mut line)?; + anyhow::ensure!(read > 0, "devup-mcp closed stdout before responding"); + let trimmed = line.trim(); + if trimmed.is_empty() { + continue; + } + return Ok(serde_json::from_str(trimmed)?); + } + } +} + +impl Drop for RawStdioClient { + fn drop(&mut self) { + let _ = self.child.kill(); + let _ = self.child.wait(); + } +} + +#[test] +fn tools_list_over_raw_stdio_has_no_boolean_schemas_and_object_output_types() -> anyhow::Result<()> +{ + let mut client = RawStdioClient::spawn()?; + + let initialize = client.call( + "initialize", + json!({ + "protocolVersion": "2025-11-25", + "capabilities": {}, + "clientInfo": { "name": "stdio-smoke-test", "version": "0.0.0" }, + }), + )?; + anyhow::ensure!( + initialize.get("error").is_none(), + "initialize failed: {initialize}" + ); + + client.notify("notifications/initialized", json!({}))?; + + let tools_list = client.call("tools/list", json!({}))?; + anyhow::ensure!( + tools_list.get("error").is_none(), + "tools/list failed: {tools_list}" + ); + + let tools = tools_list + .pointer("/result/tools") + .and_then(Value::as_array) + .expect("tools/list result must contain a tools array"); + assert_eq!( + tools.len(), + 7, + "expected all 7 devup_figma_* tools to be listed: {tools:?}" + ); + + let mut boolean_schema_hits = Vec::new(); + let mut missing_object_output_type = Vec::new(); + + for tool in tools { + let name = tool + .get("name") + .and_then(Value::as_str) + .expect("each tool must have a name"); + + if let Some(input_schema) = tool.get("inputSchema") { + boolean_schema_hits.extend(find_boolean_schemas( + &format!("{name}.inputSchema"), + input_schema, + )); + } + + let output_schema = tool + .get("outputSchema") + .unwrap_or_else(|| panic!("{name} is missing outputSchema")); + boolean_schema_hits.extend(find_boolean_schemas( + &format!("{name}.outputSchema"), + output_schema, + )); + + // MCP spec (SEP-2106): a declared `outputSchema` must describe an + // object (`"type": "object"`). + if output_schema.get("type") != Some(&json!("object")) { + missing_object_output_type.push(name.to_owned()); + } + } + + assert!( + boolean_schema_hits.is_empty(), + "found boolean JSON Schema(s) at: {boolean_schema_hits:?}. Many MCP \ + clients (opencode included) reject the *entire* tools/list response \ + when any schema position is a bare `true`/`false` instead of an \ + object." + ); + assert!( + missing_object_output_type.is_empty(), + "outputSchema missing \"type\": \"object\" for: {missing_object_output_type:?}" + ); + + Ok(()) +} diff --git a/crates/devup-mcp/tests/stdio_tools.rs b/crates/devup-mcp/tests/stdio_tools.rs new file mode 100644 index 0000000..2187399 --- /dev/null +++ b/crates/devup-mcp/tests/stdio_tools.rs @@ -0,0 +1,217 @@ +use devup_mcp::server::DevupServer; +use rmcp::ServiceExt; +use serde_json::Value; + +/// JSON Schema keywords whose value is itself a single (sub-)schema. +const SINGLE_SCHEMA_KEYS: &[&str] = &[ + "items", + "additionalProperties", + "additionalItems", + "contains", + "propertyNames", + "not", + "if", + "then", + "else", + "unevaluatedItems", + "unevaluatedProperties", +]; + +/// JSON Schema keywords whose value is a map of name -> schema. +const MAP_SCHEMA_KEYS: &[&str] = &[ + "properties", + "patternProperties", + "$defs", + "definitions", + "dependentSchemas", +]; + +/// JSON Schema keywords whose value is an array of schemas. +const LIST_SCHEMA_KEYS: &[&str] = &["allOf", "anyOf", "oneOf", "prefixItems"]; + +/// Recursively finds every position in `node` (a JSON Schema document rooted +/// at `path`) where a bare boolean (`true`/`false`) appears where the JSON +/// Schema 2020-12 spec expects a schema. Such booleans are spec-legal +/// shorthand ("accept"/"reject" anything), but several MCP clients' +/// tool-schema converters (opencode included) reject the entire `tools/list` +/// response when they encounter one instead of an object, which is exactly +/// how `devup_figma_continue`'s `serde_json::Value`-typed `result` field +/// broke opencode compatibility. See `stdio_smoke.rs` for the raw-wire +/// regression test that exercises this against the compiled binary. +fn find_boolean_schemas(path: &str, node: &Value) -> Vec { + let mut hits = Vec::new(); + collect_boolean_schemas(path, node, &mut hits); + hits +} + +fn collect_boolean_schemas(path: &str, node: &Value, hits: &mut Vec) { + if node.is_boolean() { + hits.push(path.to_owned()); + return; + } + let Some(object) = node.as_object() else { + return; + }; + for key in SINGLE_SCHEMA_KEYS { + if let Some(child) = object.get(*key) { + collect_boolean_schemas(&format!("{path}.{key}"), child, hits); + } + } + for key in MAP_SCHEMA_KEYS { + if let Some(Value::Object(map)) = object.get(*key) { + for (name, child) in map { + collect_boolean_schemas(&format!("{path}.{key}.{name}"), child, hits); + } + } + } + for key in LIST_SCHEMA_KEYS { + if let Some(Value::Array(items)) = object.get(*key) { + for (index, child) in items.iter().enumerate() { + collect_boolean_schemas(&format!("{path}.{key}[{index}]"), child, hits); + } + } + } +} + +#[tokio::test] +async fn exposes_the_seven_read_only_devup_figma_tools() -> anyhow::Result<()> { + let (server_transport, client_transport) = tokio::io::duplex(16 * 1024); + let server = tokio::spawn(async move { + DevupServer::default() + .serve(server_transport) + .await? + .waiting() + .await?; + anyhow::Ok(()) + }); + + let client = ().serve(client_transport).await?; + let server_info = client.peer_info().expect("server info"); + let resources = server_info + .capabilities + .resources + .as_ref() + .expect("resources capability"); + assert_eq!(resources.subscribe, None); + assert_eq!(resources.list_changed, None); + assert_eq!(client.list_all_resources().await?, Vec::new()); + assert_eq!(client.list_all_resource_templates().await?.len(), 2); + let tools = client.list_all_tools().await?; + assert!( + tools.iter().all(|tool| tool.output_schema.is_some()), + "native resource-link responses must preserve the previous structured output schemas" + ); + + let mut boolean_schema_hits = Vec::new(); + let mut missing_object_output_type = Vec::new(); + for tool in &tools { + let input_schema = Value::Object((*tool.input_schema).clone()); + boolean_schema_hits.extend(find_boolean_schemas( + &format!("{}.inputSchema", tool.name), + &input_schema, + )); + let Some(output_schema) = tool.output_schema.as_deref() else { + continue; + }; + let output_schema = Value::Object(output_schema.clone()); + boolean_schema_hits.extend(find_boolean_schemas( + &format!("{}.outputSchema", tool.name), + &output_schema, + )); + if output_schema.get("type") != Some(&serde_json::json!("object")) { + missing_object_output_type.push(tool.name.to_string()); + } + } + assert!( + boolean_schema_hits.is_empty(), + "found boolean JSON Schema(s) at: {boolean_schema_hits:?}. A bare \ + `true`/`false` anywhere in inputSchema/outputSchema makes several \ + MCP clients (opencode included) drop the entire tools/list response." + ); + assert!( + missing_object_output_type.is_empty(), + "outputSchema missing \"type\": \"object\" (MCP spec SEP-2106) for: \ + {missing_object_output_type:?}" + ); + + let mut names = tools + .iter() + .map(|tool| tool.name.to_string()) + .collect::>(); + names.sort(); + + assert_eq!( + names, + [ + "devup_figma_auth", + "devup_figma_continue", + "devup_figma_explore", + "devup_figma_export", + "devup_figma_search", + "devup_figma_to_json", + "devup_figma_to_ui", + ] + ); + + let ui = tools + .iter() + .find(|tool| tool.name == "devup_figma_to_ui") + .unwrap(); + let ui_schema = serde_json::to_value(&ui.input_schema)?; + assert!(ui_schema.to_string().contains("sourcePolicy")); + assert!(ui_schema.to_string().contains("scope")); + assert!(ui_schema.to_string().contains("rootLayout")); + assert!(!ui_schema.to_string().contains("code")); + + let export = tools + .iter() + .find(|tool| tool.name == "devup_figma_export") + .unwrap(); + let export_schema = serde_json::to_value(&export.input_schema)?; + let export_text = export_schema.to_string(); + for field in [ + "url", + "artifactId", + "outputs", + "scope", + "rootLayout", + "strict", + "refresh", + "outputPaths", + "frameIds", + "allScreens", + "delivery", + "sourcePolicy", + ] { + assert!(export_text.contains(field), "missing export field {field}"); + } + assert!(!export_text.contains("accessToken")); + assert!(!export_text.contains("clientSecret")); + + let explore = tools + .iter() + .find(|tool| tool.name == "devup_figma_explore") + .unwrap(); + let explore_schema = serde_json::to_value(&explore.input_schema)?; + let explore_text = explore_schema.to_string(); + assert!(explore_text.contains("url")); + assert!(explore_text.contains("limit")); + assert!(explore_text.contains("includeTextPreview")); + assert!(explore_text.contains("sourcePolicy")); + assert!(!explore_text.contains("code")); + + let continuation = tools + .iter() + .find(|tool| tool.name == "devup_figma_continue") + .unwrap(); + let continuation_schema = serde_json::to_value(&continuation.input_schema)?; + let continuation_text = continuation_schema.to_string(); + assert!(continuation_text.contains("sessionId")); + assert!(continuation_text.contains("callId")); + assert!(continuation_text.contains("result")); + assert!(!continuation_text.contains("code")); + + client.cancel().await?; + server.await??; + Ok(()) +} diff --git a/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md new file mode 100644 index 0000000..89fb1e0 --- /dev/null +++ b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md @@ -0,0 +1,423 @@ +# Figma Remote MCP Implementation Plan + +> 이 최초 계획은 현재 구현 이후의 fallback·live contract·fixture parity·검색 범위를 +> 포함하지 않는다. 후속 작업은 `2026-08-31-figma-collection-live-contract.md`, +> `2026-08-31-json-fixture-parity.md`, `2026-08-31-figma-search-and-export.md` 순서로 실행한다. + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a Rust Cargo workspace that ships one `devup-mcp` binary, authenticates to Figma Remote MCP, reads a linked design without modifying it, preserves an exhaustive node snapshot, and emits DevupUI TSX or `devup.json`. + +**Architecture:** `crates/devup-mcp` is the downstream stdio MCP binary, `crates/devup-mcp-figma` owns OAuth, the read-only upstream MCP allowlist, credential storage and raw-preserving snapshots, and `crates/devup-mcp-devup-ui` owns deterministic TSX/theme projection. There is no separate IR, auth, or server crate. + +**Tech Stack:** Rust 1.88+, edition 2024, Tokio, rmcp 3.1, reqwest/rustls, serde/schemars, keyring 4, axum loopback callback, oauth2/PKCE helpers, tracing, cargo-nextest-compatible tests. + +**Spec:** `docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md` + +> Workspace correction: the task-by-task paths below record the original implementation order. Their final locations are `src/figma/* -> crates/devup-mcp-figma/src/*`, `src/codegen/*` and `src/theme/* -> crates/devup-mcp-devup-ui/src/*`, and `src/server/*`, `src/main.rs`, `src/lib.rs` -> `crates/devup-mcp/src/*`. + +## Global Constraints + +- Product name, executable name and Cargo package are exactly `devup-mcp`. +- Keep one Cargo package; split responsibilities into focused internal modules only. +- Support Windows, macOS and Linux with Rust 1.88 or newer. +- The downstream transport is stdio; stdout contains MCP protocol frames only. +- The default upstream endpoint is exactly `https://mcp.figma.com/mcp` and is injectable only for tests. +- Figma access is read-only: only `get_metadata`, `get_variable_defs`, `get_design_context`, `get_code_connect_map`, `get_screenshot`, and fixed built-in read-only `use_figma` scripts may be called. +- Never accept arbitrary JavaScript, never call Figma write tools, and never persist source design snapshots or screenshots by default. +- Use OAuth discovery, dynamic client registration, PKCE S256 and a loopback callback; no embedded client secret or PAT. +- Persist OAuth registration and tokens only in the OS credential store; redact secrets from errors, Debug output and tracing. +- Preserve every readable public Plugin API data property in raw JSON; typed views are additive and unknown enumerable fields live under `extra`. +- Functions, cyclic host references, inaccessible private data and binary asset bytes are explicitly excluded as documented in the spec. +- Each implementation task follows red-green-refactor and ends with a focused commit. + +--- + +### Task 1: Rust Package and Downstream stdio MCP Skeleton + +**Files:** +- Create: `Cargo.toml` +- Create: `rust-toolchain.toml` +- Create: `.gitignore` +- Create: `.github/workflows/ci.yml` +- Create: `src/lib.rs` +- Create: `src/main.rs` +- Create: `src/server/mod.rs` +- Create: `src/server/tools.rs` +- Test: `tests/stdio_tools.rs` + +**Interfaces:** +- Produces: `pub struct DevupServer`, `impl DevupServer { pub fn new(services: Services) -> Self }`, and `pub async fn run_stdio() -> anyhow::Result<()>`. +- Produces: downstream input structs `AuthInput`, `FigmaToUiInput`, `FigmaToJsonInput` and output structs that derive `Serialize`, `Deserialize`, `JsonSchema`. +- Consumes: no earlier implementation task. + +- [ ] **Step 1: Add the package manifest and a failing tool-list integration test** + + Configure `rmcp = { version = "3.1", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] }`, Tokio full, serde, serde_json, schemars, thiserror, anyhow, tracing, tracing-subscriber, url, reqwest with rustls, axum, keyring, oauth2, sha2, base64, rand, subtle, webbrowser and async-trait. In `tests/stdio_tools.rs`, connect an rmcp client to an in-memory duplex transport and assert the sorted names are `devup_figma_auth`, `devup_figma_to_json`, and `devup_figma_to_ui`. + +- [ ] **Step 2: Run the test and confirm the package is absent** + + Run: `cargo test --test stdio_tools -- --nocapture` + + Expected: FAIL because `Cargo.toml` or `DevupServer` does not exist. + +- [ ] **Step 3: Implement the minimal rmcp server and safe process entrypoint** + + Use `#[tool_router]`, `#[tool_handler(router = self.tool_router)]`, and `ServiceExt::serve((tokio::io::stdin(), tokio::io::stdout()))`. Initialize tracing with stderr as the writer, return rmcp structured errors from placeholder service methods, and keep all request/output types in `server/tools.rs`. + +- [ ] **Step 4: Add CI and verify the skeleton** + + CI runs `cargo fmt --all -- --check`, `cargo clippy --all-targets --all-features -- -D warnings`, `cargo test --all-features`, and `cargo build --release` on Windows, macOS and Ubuntu. Run locally: `cargo fmt --all && cargo test --test stdio_tools && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: all commands PASS and the integration test observes exactly three downstream tools. + +- [ ] **Step 5: Commit** + + Run: `git add Cargo.toml Cargo.lock rust-toolchain.toml .gitignore .github src tests/stdio_tools.rs && git commit -m "feat: add Rust MCP server skeleton"`. + +### Task 2: Strict Figma URL Parsing and Stable Errors + +**Files:** +- Create: `src/figma/mod.rs` +- Create: `src/figma/url.rs` +- Create: `src/figma/errors.rs` +- Modify: `src/lib.rs` +- Test: `tests/figma_url.rs` + +**Interfaces:** +- Produces: `pub struct FigmaTarget { pub file_key: String, pub node_id: Option, pub branch_key: Option }`. +- Produces: `impl FigmaTarget { pub fn parse(input: &str) -> Result }`. +- Produces: `pub struct DevupError { pub code: ErrorCode, pub message: String, pub retryable: bool, pub details: serde_json::Value }` and the error codes enumerated by the spec. +- Consumes: downstream string URLs from Task 1. + +- [ ] **Step 1: Write table-driven failing parser and redaction tests** + + Cover `/design//...`, `/file//...`, URL-encoded names, `node-id=3879-35481` normalized to `3879:35481`, branch URLs, missing node ids, wrong schemes, deceptive suffix hosts such as `figma.com.evil.test`, short file keys, fragments, and query parameters containing token-like values. Assert `Display` and `Debug` never contain input query secrets. + +- [ ] **Step 2: Run the tests and confirm missing parser failures** + + Run: `cargo test --test figma_url -- --nocapture` + + Expected: FAIL because `figma::url::FigmaTarget` is unresolved. + +- [ ] **Step 3: Implement strict parsing and safe errors** + + Accept only HTTPS and hosts `figma.com` or `www.figma.com`; accept only `design`, `file`, and `branch` routes; validate keys with ASCII alphanumeric, underscore and hyphen; parse only the `node-id` query parameter and discard all other query data. Implement manual redacted `Debug` for sensitive error contexts. + +- [ ] **Step 4: Verify parser behavior and lint** + + Run: `cargo test --test figma_url && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS, including hostile-host and secret-redaction cases. + +- [ ] **Step 5: Commit** + + Run: `git add src/figma src/lib.rs tests/figma_url.rs && git commit -m "feat: parse Figma links safely"`. + +### Task 3: OAuth Discovery, PKCE, Loopback Callback and Keyring Storage + +**Files:** +- Create: `src/figma/credentials.rs` +- Create: `src/figma/oauth.rs` +- Modify: `src/figma/mod.rs` +- Test: `tests/oauth_flow.rs` + +**Interfaces:** +- Produces: `#[async_trait] pub trait CredentialStore { async fn load(&self) -> Result, DevupError>; async fn save(&self, value: &StoredAuthorization) -> Result<(), DevupError>; async fn clear(&self) -> Result<(), DevupError>; }`. +- Produces: `pub struct OAuthManager`, `pub async fn status(&self) -> Result`, `pub async fn login(&self, opener: &dyn BrowserOpener) -> Result`, `pub async fn logout(&self) -> Result<(), DevupError>`, and `pub async fn access_token(&self) -> Result`. +- Produces: `BrowserOpener` and in-memory `CredentialStore` test seams. +- Consumes: `DevupError` from Task 2. + +- [ ] **Step 1: Write failing mock-server OAuth tests** + + Use an axum test server for protected-resource metadata, authorization-server metadata, dynamic registration, and token endpoints. Assert discovery ordering, exact resource binding, requested scope `mcp:connect`, S256 challenge, random state, callback host `127.0.0.1`, successful code exchange, refresh-on-expiry, single refresh retry, logout, callback timeout, state mismatch, and that serialized/logged errors omit code, verifier, access token, refresh token and registration secret. + +- [ ] **Step 2: Run OAuth tests and confirm missing implementation** + + Run: `cargo test --test oauth_flow -- --nocapture` + + Expected: FAIL because `OAuthManager` and `CredentialStore` are unresolved. + +- [ ] **Step 3: Implement discovery and dynamic registration** + + Validate metadata issuer/resource URLs and HTTPS endpoints except injected loopback test endpoints. Register a public client with the exact ephemeral redirect URI, `authorization_code` grant and `none` token authentication when supported. Generate 32-byte CSPRNG state and verifier, derive S256 using SHA-256/base64url without padding, and compare callback state with `subtle::ConstantTimeEq`. + +- [ ] **Step 4: Implement ephemeral callback and keyring persistence** + + Bind `TcpListener` to `127.0.0.1:0`, serve only `/callback`, cap the request size, enforce a three-minute timeout, show a static success/failure page, then shut down. Store one versioned JSON credential value under service `devup-mcp` and account `figma-remote-mcp`; do not provide a plaintext fallback. + +- [ ] **Step 5: Verify OAuth security behavior** + + Run: `cargo test --test oauth_flow && cargo test && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS; timeout and state mismatch are stable error codes and secret sentinel strings do not occur in captured diagnostics. + +- [ ] **Step 6: Commit** + + Run: `git add src/figma tests/oauth_flow.rs Cargo.toml Cargo.lock && git commit -m "feat: authenticate Figma with OAuth"`. + +### Task 4: Read-only Figma Remote MCP Client + +**Files:** +- Create: `src/figma/upstream.rs` +- Modify: `src/figma/mod.rs` +- Test: `tests/upstream_contract.rs` + +**Interfaces:** +- Produces: `#[async_trait] pub trait FigmaUpstream { async fn list_tools(&self) -> Result, DevupError>; async fn call_read_tool(&self, call: ReadToolCall) -> Result; }`. +- Produces: `pub enum ReadToolCall { Metadata { file_key: String, node_id: Option }, VariableDefs { file_key: String, node_id: String }, DesignContext { file_key: String, node_id: String }, CodeConnectMap { file_key: String, node_id: String }, Screenshot { file_key: String, node_id: String }, Snapshot { file_key: String, node_id: String, script: BuiltinScript } }`. +- Produces: `pub struct RemoteFigmaClient` with endpoint injection restricted to `cfg(test)` or an explicit constructor hidden from downstream tool input. +- Consumes: `OAuthManager::access_token` from Task 3 and rmcp Streamable HTTP client support. + +- [ ] **Step 1: Write a failing MCP contract test** + + Start a local Streamable HTTP MCP fixture that records initialize, tools/list and tools/call. Assert the client negotiates capabilities, propagates only bearer authorization, calls all six allowed read tools, rejects names such as `generate_figma_design`, `upload_assets`, `add_code_connect_map`, and does not forward user-provided JavaScript. Exercise 401 refresh once, 429 with bounded Retry-After, malformed content and missing `use_figma` capability. + +- [ ] **Step 2: Run and observe the missing upstream client** + + Run: `cargo test --test upstream_contract -- --nocapture` + + Expected: FAIL because `RemoteFigmaClient` and `ReadToolCall` do not exist. + +- [ ] **Step 3: Implement the rmcp client and closed call enum** + + Build `StreamableHttpClientTransport` with a bearer-aware reqwest client, initialize with rmcp, inspect `tools/list`, and translate each enum variant into exact upstream arguments. The `Snapshot` variant maps only an internal `BuiltinScript` enum to a compiled-in source string; no public function accepts script text. + +- [ ] **Step 4: Implement retry and response validation** + + Refresh a rejected token once, honor a valid bounded retry hint once for 429, cap accumulated tool result bytes, validate text/JSON content blocks, and map errors to stable `DevupError` codes without response headers or tokens. + +- [ ] **Step 5: Verify the contract** + + Run: `cargo test --test upstream_contract && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS and the fixture log contains no write-tool invocation. + +- [ ] **Step 6: Commit** + + Run: `git add src/figma tests/upstream_contract.rs && git commit -m "feat: add read-only Figma MCP client"`. + +### Task 5: Exhaustive Raw-preserving Figma Snapshot + +**Files:** +- Create: `src/figma/snapshot.rs` +- Create: `src/figma/plugin_api_manifest.json` +- Create: `src/figma/scripts/snapshot.js` +- Create: `src/figma/scripts/variables.js` +- Create: `scripts/check_plugin_api_manifest.rs` +- Modify: `src/figma/mod.rs` +- Test: `tests/snapshot.rs` +- Test: `tests/fixtures/snapshot/frame.json` +- Test: `tests/fixtures/snapshot/text.json` +- Test: `tests/fixtures/plugin-api.d.ts` + +**Interfaces:** +- Produces: `pub struct Snapshot { pub file_key: String, pub version: Option, pub roots: Vec, pub nodes: BTreeMap, pub diagnostics: Vec }`. +- Produces: `pub struct RawNode { pub id: String, pub node_type: String, pub fields: serde_json::Map, pub extra: serde_json::Map, pub field_errors: BTreeMap }`. +- Produces: `pub fn merge_chunks(chunks: Vec) -> Result` and `pub fn typed_view(node: &RawNode) -> TypedNode<'_>`. +- Consumes: `FigmaUpstream::call_read_tool(ReadToolCall::Snapshot { ... })` from Task 4. + +- [ ] **Step 1: Add failing raw preservation and merge tests** + + Load synthetic Frame and Text fixtures with fields not consumed by codegen. Assert every fixture property survives deserialization/serialization, unknown enumerable values remain in `extra`, getter failures remain in `fieldErrors`, node references are ids, child order is stable, duplicate equal nodes deduplicate, conflicting nodes fail, and mismatched versions return `DEVUP_FIGMA_VERSION_CHANGED`. + +- [ ] **Step 2: Add a failing manifest coverage test** + + Parse the checked-in synthetic Plugin API typings fixture, collect readonly/data properties from node interfaces and mixins, subtract only documented exclusions (`methods`, `parent` object, raw bytes, private plugin data), and assert the resulting names equal `plugin_api_manifest.json`. Include a synthetic newly added property so the first run proves the check fails. + +- [ ] **Step 3: Run snapshot tests and confirm failures** + + Run: `cargo test --test snapshot -- --nocapture` + + Expected: FAIL because snapshot types, merge and manifest coverage are absent. + +- [ ] **Step 4: Implement raw-first Rust snapshot types and merge** + + Deserialize `fields`, `extra`, and `fieldErrors` without `deny_unknown_fields`; keep `serde_json::Map` as the source of truth. Implement borrowed typed accessors for layout, paint, text, component and variable bindings so adding codegen support never removes raw data. + +- [ ] **Step 5: Implement fixed read-only serializer scripts** + + The script obtains a node by id, walks descendants, reads the manifest property-by-property inside `try/catch`, serializes primitives/arrays/plain records recursively with cycle detection, maps node references to ids, sends unsupported enumerable data to `extra`, and records failed getters by field name. The variable script uses only `getLocalVariableCollectionsAsync`, `getLocalVariablesAsync`, collection modes and resolved binding reads; neither script assigns to a Figma object or calls a mutation API. + +- [ ] **Step 6: Implement chunk planning and deterministic merge** + + Use metadata counts to select whole-node or direct-child chunks, execute with bounded concurrency four, sort by child order, reject cross-version merges, and split a failed oversized subtree once before returning a diagnostic. + +- [ ] **Step 7: Verify snapshot completeness checks** + + Run: `cargo test --test snapshot && cargo test && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS; adding an undeclared property to the typings fixture makes only the manifest coverage assertion fail. + +- [ ] **Step 8: Commit** + + Run: `git add src/figma scripts tests/snapshot.rs tests/fixtures && git commit -m "feat: preserve exhaustive Figma snapshots"`. + +### Task 6: Deterministic DevupUI TSX Code Generation + +**Files:** +- Create: `src/codegen/mod.rs` +- Create: `src/codegen/component.rs` +- Create: `src/codegen/layout.rs` +- Create: `src/codegen/style.rs` +- Create: `src/codegen/text.rs` +- Modify: `src/lib.rs` +- Test: `tests/codegen.rs` +- Test: `tests/fixtures/codegen/auto-layout.json` +- Test: `tests/fixtures/codegen/absolute-and-mask.json` +- Test: `tests/fixtures/codegen/expected.tsx` + +**Interfaces:** +- Produces: `pub struct CodegenOptions { pub component_name: Option, pub include_diagnostics: bool }`. +- Produces: `pub struct CodegenOutput { pub tsx: String, pub imports: Vec, pub used_tokens: BTreeSet, pub diagnostics: Vec }`. +- Produces: `pub fn generate_component(snapshot: &Snapshot, root_id: &str, options: &CodegenOptions) -> Result`. +- Consumes: `Snapshot`, `RawNode`, and `typed_view` from Task 5. + +- [ ] **Step 1: Write failing golden tests** + + Assert horizontal/vertical Auto Layout maps to `Flex`, ordinary containers to `Box`, text to `Text`, theme bindings to `$token`, unbound values to deterministic CSS, component names such as `[FR-026] 본연체` become valid non-empty TypeScript identifiers, text is escaped, imports are sorted, and identical input produces byte-identical TSX. Assert absolute positioning, masks, vectors, images and unsupported effects emit explicit diagnostics. + +- [ ] **Step 2: Run and confirm missing codegen** + + Run: `cargo test --test codegen -- --nocapture` + + Expected: FAIL because `generate_component` is unresolved. + +- [ ] **Step 3: Implement component tree and identifier generation** + + Traverse child ids from the snapshot, normalize Unicode names into a PascalCase identifier with `FigmaComponent` fallback and a leading underscore for digits, generate JSX with two-space indentation, and escape strings using JSON string encoding. + +- [ ] **Step 4: Implement layout, style and text mapping** + + Map supported typed fields to DevupUI props, prefer variable aliases rendered with `$`, normalize colors and lengths, sort properties and imports, and append node-id-scoped diagnostics for every fallback. Do not read fields outside typed accessors, so raw preservation remains independent. + +- [ ] **Step 5: Verify golden output and parseability** + + Run: `cargo test --test codegen && cargo test && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS and `expected.tsx` matches byte-for-byte. + +- [ ] **Step 6: Commit** + + Run: `git add src/codegen src/lib.rs tests/codegen.rs tests/fixtures/codegen && git commit -m "feat: generate DevupUI from Figma snapshots"`. + +### Task 7: Figma Variables and `devup.json` + +**Files:** +- Create: `src/theme/mod.rs` +- Create: `src/theme/tokens.rs` +- Create: `src/theme/devup_json.rs` +- Modify: `src/lib.rs` +- Test: `tests/theme.rs` +- Test: `tests/fixtures/theme/variables.json` +- Test: `tests/fixtures/theme/expected.devup.json` + +**Interfaces:** +- Produces: `pub enum ThemeScope { Node, Page, File }` and `pub enum Completeness { FullLocalPlusUsedRemote, UsedTokens, ResolvedValuesOnly }`. +- Produces: `pub struct VariableSnapshot`, `pub struct ThemeOutput { pub json: String, pub counts: ThemeCounts, pub completeness: Completeness, pub diagnostics: Vec }`. +- Produces: `pub fn generate_devup_json(snapshot: &Snapshot, variables: &VariableSnapshot, scope: ThemeScope) -> Result`. +- Consumes: built-in variable snapshots from Task 5 and used bindings from `Snapshot`. + +- [ ] **Step 1: Write failing theme mapping tests** + + Assert COLOR maps to `theme.colors.`, FLOAT dimensions to `theme.length.`, font composites to `theme.typography`, effect composites to `theme.shadow`, WEB `codeSyntax` wins token naming, original names remain in diagnostics, aliases resolve transitively, alias cycles and normalized-name collisions are reported, modes are stable keys, and JSON key order is deterministic. + +- [ ] **Step 2: Run and confirm missing theme generator** + + Run: `cargo test --test theme -- --nocapture` + + Expected: FAIL because theme types and `generate_devup_json` are absent. + +- [ ] **Step 3: Implement token normalization, alias resolution and completeness** + + Normalize tokens deterministically, preserve original collection/variable/mode ids in diagnostics, resolve aliases with an explicit visiting set, and compute `full-local-plus-used-remote`, `used-tokens`, or `resolved-values-only` from collection and binding evidence without inventing absent tokens. + +- [ ] **Step 4: Implement deterministic Devup schema serialization** + + Build ordered maps for `theme.colors`, `theme.typography`, `theme.length`, and `theme.shadow`; retain all modes; format four-space pretty JSON with a final newline; return `DEVUP_THEME_CONFLICT` only when deterministic disambiguation cannot retain both meanings. + +- [ ] **Step 5: Verify schema output** + + Run: `cargo test --test theme && cargo test && cargo clippy --all-targets --all-features -- -D warnings`. + + Expected: PASS and the golden `devup.json` is byte-identical. + +- [ ] **Step 6: Commit** + + Run: `git add src/theme src/lib.rs tests/theme.rs tests/fixtures/theme && git commit -m "feat: generate devup theme from Figma variables"`. + +### Task 8: Wire Tools, Live Smoke Test, Documentation and Release Checks + +**Files:** +- Modify: `src/server/mod.rs` +- Modify: `src/server/tools.rs` +- Modify: `src/main.rs` +- Modify: `README.md` +- Create: `.changepacks/config.json` +- Create: `.changepacks/figma-remote-mcp.md` +- Create: `tests/downstream_integration.rs` +- Create: `tests/live_figma.rs` + +**Interfaces:** +- Produces: working `devup_figma_auth`, `devup_figma_to_ui`, and `devup_figma_to_json` calls over stdio. +- Produces: opt-in live test selected with `DEVUP_MCP_LIVE_FIGMA=1`, using file `85CgSws3o5XsLv7aAwWJyS` and node `3879:35481` without saving its returned design data. +- Consumes: all public interfaces from Tasks 2 through 7. + +- [ ] **Step 1: Write failing downstream end-to-end tests** + + Inject memory credentials and a fake `FigmaUpstream`, invoke each tool through an rmcp client, and assert structured outputs include source identifiers, TSX or JSON, counts, completeness and optional diagnostics. Verify auto-login on missing auth, logout clearing credentials, invalid URL rejection before upstream calls, and a call log containing only allowlisted reads. + +- [ ] **Step 2: Run and confirm wiring failures** + + Run: `cargo test --test downstream_integration -- --nocapture` + + Expected: FAIL because placeholder handlers do not invoke the services. + +- [ ] **Step 3: Wire service orchestration and structured MCP results** + + Add a `Services` aggregate of credential, OAuth and upstream abstractions, collect the requested target, call snapshot/theme/codegen pipelines, and map `DevupError` to stable rmcp error data. Include diagnostics only when requested while always returning completeness and safe counts. + +- [ ] **Step 4: Add the opt-in live smoke test** + + When `DEVUP_MCP_LIVE_FIGMA=1` is absent, return early. When present, load the OS keyring authorization, call the provided node, assert the output contains an exported React function and valid JSON, and keep all response bodies in memory only. + +- [ ] **Step 5: Document installation, OAuth and limitations** + + Document Cargo installation, generic MCP client stdio configuration, first-call browser authorization, three tool schemas, read-only guarantee, credential location, logout, supported theme categories, exhaustive-snapshot exclusions, external unused-variable limitation, live test command and troubleshooting codes. Add a changepack describing the first private Figma feature without including design content or credentials. + +- [ ] **Step 6: Run focused and full verification** + + Run in order: + + ```text + cargo fmt --all -- --check + cargo clippy --all-targets --all-features -- -D warnings + cargo test --all-features + cargo build --release + cargo test --test downstream_integration + ``` + + Expected: every command exits 0. If valid authorization is already present, additionally run `DEVUP_MCP_LIVE_FIGMA=1 cargo test --test live_figma -- --ignored --nocapture`; otherwise record the live OAuth smoke test as the only manual verification remaining. + +- [ ] **Step 7: Self-review against the specification** + + Confirm every downstream tool exists, no public API accepts JavaScript, all upstream calls are enum-closed, raw snapshot fields survive, CI catches manifest drift, stdout is protocol-only, keyring has no plaintext fallback, test fixtures are synthetic, no credential or real Figma response is tracked, and `rg -n "PAT|client_secret|access_token|refresh_token" . --glob '!Cargo.lock'` shows only documentation, types or redaction tests with no literal secret values. + +- [ ] **Step 8: Commit, push and open the pull request** + + Run: + + ```text + git add src tests README.md Cargo.toml Cargo.lock .github .changepacks scripts docs + git commit -m "feat: complete Figma to Devup MCP" + git push origin owjs3901/figma-remote-mcp + gh pr create --base main --head owjs3901/figma-remote-mcp --title "feat: add Figma Remote MCP integration" --body-file + ``` + + The PR body states architecture, read-only/OAuth security, exhaustive snapshot semantics, codegen/theme behavior, exact verification commands, live-test status and remaining risks; create the body in a temporary file outside the repository and remove it after use. + +## Plan Self-review + +- Spec coverage: OAuth, upstream MCP, read-only allowlist, exhaustive snapshot, chunk/version handling, codegen, variables, downstream tools, security, tests, packaging and documentation each map to Tasks 1–8. +- Placeholder scan: implementation steps name concrete files, interfaces, commands, assertions and expected outcomes; no deferred implementation markers are used. +- Type consistency: `DevupError`, `FigmaTarget`, `CredentialStore`, `OAuthManager`, `FigmaUpstream`, `ReadToolCall`, `Snapshot`, `CodegenOutput` and `ThemeOutput` are introduced before their downstream consumers and retain the same signatures throughout. diff --git a/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md b/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md new file mode 100644 index 0000000..70e16cb --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md @@ -0,0 +1,496 @@ +# Figma Collection and Live JSON Contract Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build direct/host-fallback Figma collection through one Rust state machine and validate its real JSON contract before any compatibility fixture schema is frozen. + +**Architecture:** `devup-mcp-figma` owns source-independent read calls, the resumable collector, exhaustive raw payload types, and upstream error classification. `devup-mcp` owns short-lived host handoff sessions and resumes the same collector used by the direct path. A live contract probe inspects the provided Figma node in memory, round-trips it through the Rust types, and emits only a non-sensitive structural report. + +**Tech Stack:** Rust 1.88, edition 2024, Tokio, rmcp 3.1, serde/serde_json, sha2, Axum OAuth callback, cargo test/clippy/fmt. + +**Spec:** `docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md` + +## Global Constraints + +- `devup-mcp` remains Cargo-only: no `package.json`, Bun, Node, or local JavaScript runtime. +- Figma access is read-only; only built-in script templates and allowlisted read tools may be emitted. +- `auto` never opens a browser. Only `devup_figma_auth {"action":"login"}` starts OAuth. +- Direct Catalog/auth/capability failures may fall back to host; invalid URL, missing node, version conflict, and rate limit may not. +- Host sessions are memory-only, CSPRNG-addressed, expire after 10 minutes, and enforce 8 sessions, 16 MiB per result, and 64 MiB aggregate limits. +- Unknown Figma fields survive deserialize/serialize; functions, cycles, and binary payloads are represented only by safe IDs/metadata. +- Live Figma design values are never written to the repository or logs. +- Every production change follows TDD and ends in a focused commit. + +## File Structure + +### Create + +- `crates/devup-mcp-figma/src/source.rs` — source policy and fallback classification. +- `crates/devup-mcp-figma/src/collector.rs` — resumable collection state machine shared by direct and host execution. +- `crates/devup-mcp-figma/src/metadata.rs` — metadata discovery and deterministic page/node planning. +- `crates/devup-mcp-figma/src/payload.rs` — real collected payload envelope and structural report. +- `crates/devup-mcp-figma/tests/source_policy.rs` — fallback decision matrix. +- `crates/devup-mcp-figma/tests/collector.rs` — node/page/file planning, chunking, version and payload tests. +- `crates/devup-mcp-figma/tests/payload_contract.rs` — serde round-trip and redacted structural report tests. +- `crates/devup-mcp/src/server/handoff.rs` — bounded in-memory continuation store. +- `crates/devup-mcp/tests/handoff.rs` — expiry, replay, size and context validation. +- `crates/devup-mcp/tests/source_orchestration.rs` — direct/auto/host server behavior. +- `crates/devup-mcp/tests/live_figma_contract.rs` — ignored opt-in live contract probe. + +### Modify + +- `Cargo.toml` — add shared dependencies only when a task consumes them. +- `crates/devup-mcp-figma/src/lib.rs` — export source, collector, metadata and payload interfaces. +- `crates/devup-mcp-figma/src/url.rs` — serialize/deserialize the validated Figma target inside collected payloads. +- `crates/devup-mcp-figma/src/errors.rs` — stable direct/handoff error codes and safe details. +- `crates/devup-mcp-figma/src/upstream.rs` — typed upstream failures and serializable read calls/results. +- `crates/devup-mcp-figma/src/snapshot.rs` — raw response preservation and strict merge invariants. +- `crates/devup-mcp-figma/src/scripts/snapshot.js` — exhaustive read-only serializer based on the checked-in manifest. +- `crates/devup-mcp-figma/src/scripts/variables.js` — local variables, collections and styles with explicit completeness. +- `crates/devup-mcp-figma/src/plugin_api_manifest.json` — public data-property contract. +- `crates/devup-mcp/src/server/tools.rs` — source policy, scope and continuation inputs. +- `crates/devup-mcp/src/server/mod.rs` — source orchestration and continuation tool. +- `crates/devup-mcp/tests/stdio_tools.rs` — public tool schemas. +- `crates/devup-mcp/tests/downstream_integration.rs` — conversion through the new collector. +- `README.md` — direct versus host behavior and live probe instructions. +- `.changepacks/*.md` — focused package change record. + +--- + +### Task 1: Source Policy and Typed Upstream Failures + +**Files:** +- Create: `crates/devup-mcp-figma/src/source.rs` +- Create: `crates/devup-mcp-figma/tests/source_policy.rs` +- Modify: `crates/devup-mcp-figma/src/errors.rs` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` + +**Interfaces:** +- Produces: `SourcePolicy::{Auto, Direct, Host}` with camelCase serde values. +- Produces: `SelectedSource::{Direct, Host}` returned by server source selection. +- Produces: `UpstreamFailureKind::{CatalogRejected, AuthUnavailable, CapabilityUnavailable, PermissionDenied, RateLimited, NodeNotFound, VersionChanged, Transport, InvalidResponse}`. +- Produces: `pub fn fallback_allowed(policy: SourcePolicy, kind: UpstreamFailureKind) -> bool`. +- Produces: `DevupError::with_details(code, message, retryable, details)` without sensitive raw errors. + +- [ ] **Step 1: Write the failing fallback matrix tests** + +```rust +#[test] +fn auto_falls_back_only_for_identity_or_capability_failures() { + use SourcePolicy::Auto; + assert!(fallback_allowed(Auto, UpstreamFailureKind::CatalogRejected)); + assert!(fallback_allowed(Auto, UpstreamFailureKind::AuthUnavailable)); + assert!(fallback_allowed(Auto, UpstreamFailureKind::CapabilityUnavailable)); + assert!(fallback_allowed(Auto, UpstreamFailureKind::PermissionDenied)); + assert!(!fallback_allowed(Auto, UpstreamFailureKind::RateLimited)); + assert!(!fallback_allowed(Auto, UpstreamFailureKind::NodeNotFound)); + assert!(!fallback_allowed(Auto, UpstreamFailureKind::VersionChanged)); +} +``` + +- [ ] **Step 2: Run the focused test and confirm missing interfaces fail** + +Run: `cargo test -p devup-mcp-figma --test source_policy` + +Expected: compile failure for `SourcePolicy` and `fallback_allowed`. + +- [ ] **Step 3: Implement the enums, error codes and safe classifier** + +Add the spec codes to `ErrorCode` and implement a classifier that maps HTTP/status/message metadata to `UpstreamFailureKind` without storing the raw response body. Extend `UpstreamResult` to derive `Serialize`, `Deserialize` and `PartialEq`, and expose `ReadToolCall` as serializable safe tool name plus arguments. + +```rust +pub fn fallback_allowed(policy: SourcePolicy, kind: UpstreamFailureKind) -> bool { + policy == SourcePolicy::Auto + && matches!( + kind, + UpstreamFailureKind::CatalogRejected + | UpstreamFailureKind::AuthUnavailable + | UpstreamFailureKind::CapabilityUnavailable + | UpstreamFailureKind::PermissionDenied + ) +} +``` + +- [ ] **Step 4: Add classifier/redaction cases and run them** + +Test Catalog rejection, 401/auth, missing `use_figma`, 403 permission, 429, node-not-found, generic transport, and messages containing bearer-token-shaped text. Assert serialized `DevupError` contains only stable code, source, retry hint and status. + +Run: `cargo test -p devup-mcp-figma --test source_policy` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/errors.rs crates/devup-mcp-figma/src/source.rs crates/devup-mcp-figma/src/upstream.rs crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/tests/source_policy.rs +git commit -m "feat: classify figma source failures" +``` + +### Task 2: Resumable Collector State Machine + +**Files:** +- Create: `crates/devup-mcp-figma/src/metadata.rs` +- Create: `crates/devup-mcp-figma/src/collector.rs` +- Create: `crates/devup-mcp-figma/tests/collector.rs` +- Modify: `crates/devup-mcp-figma/src/snapshot.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` + +**Interfaces:** +- Consumes: `ReadToolCall`, `UpstreamResult`, `SnapshotChunk`, `merge_chunks`. +- Produces: `CollectionScope::{Node, Page, File}`. +- Produces: `CollectionRequest { target: FigmaTarget, scope: CollectionScope, include_variables: bool, include_context: bool }`. +- Produces: `CollectorSession::new(request)`, `advance(&mut self) -> Result`, and `accept(&mut self, call_id: &str, result: UpstreamResult) -> Result<(), DevupError>`. +- Produces: `PlannedCall { id: String, call: ReadToolCall, expected_file_key: String, expected_node_id: Option }`. +- Produces: `CollectedParts { target, scope, metadata, snapshot_chunks, variables, styles, source_version }`; this is transport output, not the fixture contract. + +- [ ] **Step 1: Write failing state-machine tests** + +Cover a node request that first emits metadata, then a snapshot call; a page request that emits direct-child chunks in child order; a file request that visits every page; duplicate equal nodes; conflicting nodes; stale call IDs; mismatched file keys; and version changes. + +```rust +let mut session = CollectorSession::new(node_request("file", "1:2")); +let CollectorStep::Call(metadata) = session.advance().unwrap() else { panic!() }; +assert_eq!(metadata.call.tool_name(), "get_metadata"); +session.accept(&metadata.id, metadata_result()).unwrap(); +let CollectorStep::Call(snapshot) = session.advance().unwrap() else { panic!() }; +assert_eq!(snapshot.call.tool_name(), "use_figma"); +``` + +- [ ] **Step 2: Run the tests and confirm they fail** + +Run: `cargo test -p devup-mcp-figma --test collector` + +Expected: compile failure for the collector types. + +- [ ] **Step 3: Implement deterministic metadata parsing and planning** + +`metadata.rs` must recursively find metadata in structured content or text JSON, preserve page/node names and types, and emit stable child order. `collector.rs` stores pending calls in a `BTreeMap`, accepts each ID once, and refuses `finish` while any required call remains. + +```rust +pub enum CollectorStep { + Call(PlannedCall), + Complete(Box), +} + +pub fn advance(&mut self) -> Result; +``` + +Use metadata counts to snapshot a small node whole and split a large Page/Section/Frame by direct child. Cap in-flight calls at four; the state machine may expose at most four pending calls at once. + +- [ ] **Step 4: Run collector and existing snapshot tests** + +Run: `cargo test -p devup-mcp-figma --test collector` + +Run: `cargo test -p devup-mcp-figma --test snapshot` + +Expected: all tests pass, including version conflict and child-order assertions. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/metadata.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/src/snapshot.rs crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/tests/collector.rs +git commit -m "feat: add resumable figma collector" +``` + +### Task 3: Exhaustive Serializer and Collected Payload + +**Files:** +- Create: `crates/devup-mcp-figma/src/payload.rs` +- Create: `crates/devup-mcp-figma/tests/payload_contract.rs` +- Modify: `crates/devup-mcp-figma/src/scripts/snapshot.js` +- Modify: `crates/devup-mcp-figma/src/scripts/variables.js` +- Modify: `crates/devup-mcp-figma/src/plugin_api_manifest.json` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` + +**Interfaces:** +- Consumes: `CollectedParts` from Task 2. +- Produces: `CollectedPayload { target, scope, metadata, snapshot, variables, styles, completeness, source_version }` with serde round-trip. +- Produces: `PayloadCompleteness::{FullLocalPlusUsedRemote, UsedTokens, ResolvedValuesOnly}`. +- Produces: `PayloadStructure::from_payload(&CollectedPayload)` containing field names, JSON kinds, counts and a schema-only hash but no design values or hashes derived from design values. +- Produces: `pub fn validate_payload_context(payload, expected_target) -> Result<(), DevupError>`. + +- [ ] **Step 1: Write failing raw-preservation and structure-report tests** + +Create a synthetic payload containing a future node field, failed getter, remote variable alias, two modes, paint/text/effect styles, asset metadata and a text value such as `PRIVATE_TEXT_MUST_NOT_APPEAR`. Assert round-trip equality and assert the structure report contains keys/types but not that value. + +```rust +let encoded = serde_json::to_value(&payload).unwrap(); +let decoded: CollectedPayload = serde_json::from_value(encoded).unwrap(); +assert_eq!(decoded, payload); +let report = PayloadStructure::from_payload(&payload); +assert!(!serde_json::to_string(&report).unwrap().contains("PRIVATE_TEXT")); +``` + +- [ ] **Step 2: Run the payload test and confirm it fails** + +Run: `cargo test -p devup-mcp-figma --test payload_contract` + +Expected: compile failure for `CollectedPayload` and `PayloadStructure`. + +- [ ] **Step 3: Implement the payload and harden built-in scripts** + +Keep `fields`, `extra` and `fieldErrors` separate. Serialize node references to IDs, recurse through plain records/arrays with cycle detection, never serialize functions, and retain asset IDs/metadata instead of bytes. Extend `variables.js` to return local collections/variables and local paint/text/effect/grid styles with explicit `localComplete` and `usedRemoteComplete` flags. Every Plugin API call must be a read method from the allowlist. + +Add serde derives to `FigmaTarget` and `CollectionScope` so the target already validated by the URL parser is the exact target stored in `CollectedPayload`. + +```rust +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CollectedPayload { + pub target: FigmaTarget, + pub scope: CollectionScope, + pub metadata: serde_json::Value, + pub snapshot: Snapshot, + pub variables: Option, + pub styles: Option, + pub completeness: PayloadCompleteness, + pub source_version: Option, +} +``` + +- [ ] **Step 4: Add the manifest drift assertion** + +Extend `upstream_contract.rs` so a synthetic added public data property fails until present in `plugin_api_manifest.json`. Assert the snapshot script includes no assignment to Figma nodes and none of `create`, `set`, `remove`, `append`, `insert`, `deleteAsync`, or write-tool names. + +Run: `cargo test -p devup-mcp-figma --test upstream_contract` + +Run: `cargo test -p devup-mcp-figma --test payload_contract` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/payload.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/src/url.rs crates/devup-mcp-figma/src/scripts crates/devup-mcp-figma/src/plugin_api_manifest.json crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/tests/payload_contract.rs crates/devup-mcp-figma/tests/upstream_contract.rs +git commit -m "feat: preserve complete figma payloads" +``` + +### Task 4: Bounded Host Handoff Sessions + +**Files:** +- Create: `crates/devup-mcp/src/server/handoff.rs` +- Create: `crates/devup-mcp/tests/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/Cargo.toml` + +**Interfaces:** +- Consumes: `CollectorSession`, `PlannedCall`, `UpstreamResult`. +- Produces: `HandoffStore::begin(PendingOperation, CollectorSession)`, `next(session_id)`, `accept(session_id, call_id, Value)`, and `remove(session_id)`. +- Produces: public `ContinueInput { session_id: String, call_id: String, result: Value }`. +- Produces: `NeedsFigma { session_id, expires_at, calls, resume_tool }` with tool arguments generated only from `ReadToolCall`. + +- [ ] **Step 1: Write failing session safety tests with a fake clock** + +Test 10-minute expiry, eight active sessions, 16 MiB single result, 64 MiB aggregate, CSPRNG-shaped opaque IDs, one-time call consumption, mismatched call/session IDs, and removal on completion. + +- [ ] **Step 2: Run and confirm failures** + +Run: `cargo test -p devup-mcp --test handoff` + +Expected: compile failure for `HandoffStore`. + +- [ ] **Step 3: Implement the in-memory store** + +Use `tokio::sync::Mutex>`; inject a clock trait for deterministic expiry tests. Compute input byte length before deserialization, validate the expected file/node context after deserialization, and erase a session on terminal success or terminal error. + +```rust +#[derive(Clone)] +pub struct HandoffStore { + sessions: Arc>>, + clock: Arc, + limits: HandoffLimits, +} + +pub struct HandoffLimits { + pub ttl: Duration, + pub max_sessions: usize, + pub max_result_bytes: usize, + pub max_total_bytes: usize, +} +``` + +- [ ] **Step 4: Run handoff tests including concurrent accepts** + +Run: `cargo test -p devup-mcp --test handoff` + +Expected: all tests pass and a replay receives `DEVUP_FIGMA_HANDOFF_INVALID`. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp/src/server/handoff.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/src/server/tools.rs crates/devup-mcp/Cargo.toml crates/devup-mcp/tests/handoff.rs Cargo.lock +git commit -m "feat: add figma host handoff sessions" +``` + +### Task 5: Wire Direct, Auto, Host and Continuation Tools + +**Files:** +- Create: `crates/devup-mcp/tests/source_orchestration.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/tests/stdio_tools.rs` +- Modify: `crates/devup-mcp/tests/downstream_integration.rs` + +**Interfaces:** +- Consumes: source policy, collector, handoff store and existing `DevupAuth`/`FigmaUpstream`. +- Produces: `devup_figma_continue` MCP tool. +- Produces: conversion result union `{status:"needs_figma", ...}` or `{status:"complete", artifacts, diagnostics, completeness, source}`. + +- [ ] **Step 1: Write failing source-orchestration tests** + +Cover: `auto` + disconnected returns handoff without login; `direct` + disconnected returns auth-required; `host` never calls auth/upstream; `auto` + connected uses direct; fallbackable direct error returns handoff; 429 and version errors do not; continuation can require multiple calls before completion; direct and host sequences produce byte-identical `CollectedPayload`. + +- [ ] **Step 2: Run and confirm current auto-login behavior fails the contract** + +Run: `cargo test -p devup-mcp --test source_orchestration` + +Expected: failures showing `ensure_authenticated` invokes login and continuation is absent. + +- [ ] **Step 3: Replace `ensure_authenticated` with source orchestration** + +Add `sourcePolicy` and `scope` fields to tool inputs. Drive `CollectorSession` in a loop for direct mode and through `HandoffStore` for host mode. Keep explicit OAuth login behavior unchanged. Return safe structured results rather than MCP protocol errors for `needs_figma`. + +```rust +async fn start_operation( + &self, + operation: PendingOperation, + policy: SourcePolicy, +) -> Result, ErrorData> { + match self.select_source(policy).await.map_err(to_mcp_error)? { + SelectedSource::Direct => self.run_direct(operation).await, + SelectedSource::Host => self.begin_handoff(operation).await, + } +} +``` + +- [ ] **Step 4: Register and test the public tool schemas** + +Assert `tools/list` includes `devup_figma_continue`, and tool schemas expose only documented fields. Assert no host call ever contains write tool names or user-supplied code. + +Run: `cargo test -p devup-mcp --test stdio_tools` + +Run: `cargo test -p devup-mcp --test source_orchestration` + +Run: `cargo test -p devup-mcp --test downstream_integration` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp/src/server crates/devup-mcp/tests/stdio_tools.rs crates/devup-mcp/tests/source_orchestration.rs crates/devup-mcp/tests/downstream_integration.rs +git commit -m "feat: add figma source fallback orchestration" +``` + +### Task 6: Validate the Real JSON Contract + +**Files:** +- Create: `crates/devup-mcp/tests/live_figma_contract.rs` +- Modify: `README.md` +- Modify: `crates/devup-mcp-figma/src/payload.rs` + +**Interfaces:** +- Consumes: `CollectedPayload`, `PayloadStructure`, host continuation sequence. +- Produces: ignored live test controlled by `DEVUP_MCP_LIVE_FIGMA=1` and host-supplied result files outside the repository when needed. +- Produces: finalized serde JSON contract used by the next implementation plan. + +- [ ] **Step 1: Write an ignored live contract test before running it** + +Use file `85CgSws3o5XsLv7aAwWJyS` and node `3879:35481`. The test must deserialize the real official-MCP result, validate context, round-trip the collected payload, assert at least one root/node, and create only `PayloadStructure` in memory. + +```rust +#[tokio::test] +#[ignore = "requires explicit official Figma MCP results"] +async fn official_mcp_payload_round_trips_without_value_logging() { + let payload = load_live_payload_from_process_input().await.unwrap(); + validate_payload_context(&payload, &expected_target()).unwrap(); + let round_trip: CollectedPayload = serde_json::from_value( + serde_json::to_value(&payload).unwrap(), + ).unwrap(); + assert_eq!(round_trip, payload); + assert!(!round_trip.snapshot.nodes.is_empty()); +} +``` + +- [ ] **Step 2: Run the ignored test without input and verify it stays skipped** + +Run: `cargo test -p devup-mcp --test live_figma_contract` + +Expected: one ignored test; no network or browser activity. + +- [ ] **Step 3: Exercise the official host fallback with the provided node** + +Invoke the new server tool with `sourcePolicy:"host"`, execute every returned official Figma MCP read call, and feed each result to `devup_figma_continue`. Keep results in process memory or an OS temporary file outside the repository; remove the temporary file after the test. Do not print raw result bodies. + +- [ ] **Step 4: Fix only observed contract mismatches and rerun focused tests** + +If the real envelope differs, add a redacted synthetic regression case containing the observed shape but fake values. Do not add guessed fields. Run: + +`cargo test -p devup-mcp-figma --test payload_contract` + +`cargo test -p devup-mcp --test source_orchestration` + +`cargo test -p devup-mcp --test live_figma_contract -- --ignored` + +Expected: round-trip and context checks pass; no raw payload exists under `git status --short`. + +- [ ] **Step 5: Commit the finalized contract and documentation** + +```bash +git add crates/devup-mcp-figma/src/payload.rs crates/devup-mcp-figma/tests/payload_contract.rs crates/devup-mcp/tests/live_figma_contract.rs README.md +git commit -m "test: validate live figma json contract" +``` + +### Task 7: Plan-One Verification and Changepack + +**Files:** +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` +- Modify: `README.md` + +**Interfaces:** +- Consumes: all preceding tasks. +- Produces: a reviewable working milestone that obtains and round-trips real Figma JSON through direct or host source without defining compatibility fixtures. + +- [ ] **Step 1: Add the changepack** + +Record minor changes for `devup-mcp` and `devup-mcp-figma`: host fallback, resumable collection, exhaustive payload preservation and the live contract gate. Do not include actual Figma content. + +- [ ] **Step 2: Run formatting and focused suites** + +Run: `cargo fmt --all -- --check` + +Run: `cargo test -p devup-mcp-figma --all-features` + +Run: `cargo test -p devup-mcp --all-features` + +Expected: all non-live tests pass. + +- [ ] **Step 3: Run workspace lint and release build** + +Run: `cargo clippy --workspace --all-targets --all-features -- -D warnings` + +Run: `cargo test --workspace --all-features` + +Run: `cargo build --workspace --release` + +Expected: all commands exit 0. + +- [ ] **Step 4: Verify repository privacy and scope** + +Run: `git status --short` + +Run: `git diff --check` + +Run: `rg -n "85CgSws3o5XsLv7aAwWJyS|3879:35481" . -g '!docs/**' -g '!crates/devup-mcp/tests/live_figma_contract.rs'` + +Expected: only the intentional live-test reference exists; no raw design JSON, screenshot, token, OAuth code or temporary payload is tracked. + +- [ ] **Step 5: Commit** + +```bash +git add .changepacks/changepack_log_figma_remote_mcp.json README.md +git commit -m "docs: document figma collection fallback" +``` diff --git a/docs/superpowers/plans/2026-08-31-figma-linked-screen-exploration.md b/docs/superpowers/plans/2026-08-31-figma-linked-screen-exploration.md new file mode 100644 index 0000000..bef500c --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-figma-linked-screen-exploration.md @@ -0,0 +1,458 @@ +# Figma Linked Screen Exploration and Used Resources Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Turn a Figma link to a requirement heading into an explicit, ranked set of related screen candidates, then convert the selected screen with every used variable, style, mixed-text child, and typography token intact. + +**Architecture:** A bounded Figma Plugin API projection returns compact spatial metadata while Rust classifies and ranks candidates deterministically. Collection uses a three-way `ResourceScope`: exploration and search collect no resources, UI conversion recursively discovers and resolves only referenced local or remote resources, and JSON export retains the full local file catalog. Live text collection adds styled segments so root and nested `Text` nodes share the same resolved typography map. + +**Tech Stack:** Rust 1.88, edition 2024, serde/serde_json, Tokio, rmcp, embedded Figma Plugin API JavaScript, cargo-insta, Cargo-only build and test workflow. + +**Spec:** `docs/superpowers/specs/2026-08-31-figma-linked-screen-exploration-design.md` + +## Global Constraints + +- All Figma access remains read-only and uses the existing direct OAuth or official-host handoff boundary. +- `devup_figma_explore` returns all plausible screens with reasons; it never silently chooses one when candidates are ambiguous. +- Projection node count, text preview length, resource batch size, and pending host calls have fixed bounds. +- Search and exploration use `ResourceScope::None`, UI conversion uses `ResourceScope::Used`, and JSON export uses `ResourceScope::File`. +- Used-resource discovery recursively scans the complete selected snapshot, including styled text segments, and resolves exact IDs without guessing names. +- A missing or inaccessible resource falls back to the resolved raw value and emits `DEVUP_RESOURCE_UNRESOLVED` without discarding successfully resolved resources. +- The live regression fixture contains no OAuth token, request header, email, user handle, callback payload, or other account identifier. +- The pinned 268-case JavaScript plugin fixture corpus remains a mandatory compatibility gate. +- Each task follows red-green-refactor: add one failing test, observe the intended failure, implement the smallest behavior, and rerun the focused test before committing. + +## File Structure + +### Create + +- `crates/devup-mcp-figma/src/explore.rs` — spatial classification, grouping, ranking, and public result contract. +- `crates/devup-mcp-figma/src/resources.rs` — recursive used-resource reference discovery and unresolved-resource diagnostics. +- `crates/devup-mcp-figma/src/scripts/explore.js` — bounded page-neighborhood projection. +- `crates/devup-mcp-figma/src/text_segment_manifest.json` — exact fields requested from `getStyledTextSegments`. +- `crates/devup-mcp-figma/tests/explore.rs` — classification, boundary, ordering, and projection contract tests. +- `crates/devup-mcp-figma/tests/used_resources.rs` — local, remote, duplicate, styled-segment, and missing-resource tests. +- `crates/devup-mcp/tests/figma_explore.rs` — MCP direct/host continuation and schema tests. +- `crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json` — sanitized compact live projection around node `3879:35481`. +- `crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json` — sanitized selected subtree and resolved resource payload for node `3879:35518`. + +### Modify + +- `crates/devup-mcp-figma/src/lib.rs` — export exploration and resource-scope interfaces. +- `crates/devup-mcp-figma/src/collector.rs` — plan projection/resource phases and merge partial results. +- `crates/devup-mcp-figma/src/upstream.rs` — embed and invoke explore, styled-text, and used-resource scripts. +- `crates/devup-mcp-figma/src/variables.rs` — merge exact-ID resource batches and completeness metadata. +- `crates/devup-mcp-figma/src/scripts/snapshot.js` — capture styled text segments from the manifest. +- `crates/devup-mcp-devup-ui/src/codegen/text.rs` — pass text-style tokens through nested segment rendering. +- `crates/devup-mcp-devup-ui/src/codegen/component.rs` — preserve shared token maps for all text descendants. +- `crates/devup-mcp-devup-ui/tests/fixture_snapshot.rs` — assert the live-derived proofread snapshot. +- `crates/devup-mcp/src/server/tools.rs` — public exploration input schema. +- `crates/devup-mcp/src/server/handoff.rs` — pending host exploration operation. +- `crates/devup-mcp/src/server/mod.rs` — register exploration and select the correct resource scope per tool. +- `crates/devup-mcp/tests/stdio_tools.rs` — six-tool list and schema assertions. +- `crates/devup-mcp/tests/source_orchestration.rs` — source parity and collection policy assertions. +- `crates/devup-mcp/tests/live_figma_contract.rs` — ignored authenticated WQUW-151 smoke. +- `README.md` — heading-link exploration and exact-conversion workflow. +- `.changepacks/changepack_log_figma_remote_mcp.json` — release notes for all three crates. + +--- + +### Task 1: Define Resource Scope and Recursively Discover Used References + +**Files:** +- Create: `crates/devup-mcp-figma/src/resources.rs` +- Create: `crates/devup-mcp-figma/tests/used_resources.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` + +**Interfaces:** +- Produces: `ResourceScope::{None, Used, File}`. +- Produces: `UsedResourceRefs { variable_ids, styles, occurrences }`. +- Produces: `ResourceOccurrence { node_id, field, resource_id, resource_kind }`. +- Produces: `collect_used_resource_refs(chunks: &[SnapshotChunk]) -> UsedResourceRefs`. +- Replaces: `CollectionRequest::include_variables` with `CollectionRequest::resource_scope`. + +- [ ] **Step 1: Write failing recursive-scanner tests** + +Cover variable aliases under every `boundVariables` object, variable references inside `styledTextSegments`, all six style fields (`textStyleId`, `fillStyleId`, `strokeStyleId`, `effectStyleId`, `gridStyleId`, `backgroundStyleId`), mixed local/remote-looking IDs, duplicates, non-resource `id` fields, nulls, mixed sentinels, and deterministic ordering. Assert arbitrary JSON keys named `id` are not collected. + +```rust +let refs = collect_used_resource_refs(&chunks); +assert_eq!(refs.variable_ids, ["VariableID:12:34", "VariableID:56:78"]); +assert_eq!(refs.styles[0].style_type, ResourceStyleType::Text); +assert_eq!(refs.occurrences[0].node_id, "3879:35518"); +``` + +- [ ] **Step 2: Run and observe the missing API** + +Run: `cargo test -p devup-mcp-figma --test used_resources scanner` + +Expected: compile failure because `resources` and `ResourceScope` do not exist. + +- [ ] **Step 3: Implement typed scope and field-aware recursive discovery** + +Use ordered maps/sets for stable batches. Enter variable-ID collection only below a `boundVariables` key, map each supported style field to its Figma style type, record the owning node ID and JSON field for diagnostics, and leave raw snapshot values untouched. + +- [ ] **Step 4: Migrate collection request constructors** + +Set the default to `ResourceScope::None`; explicitly select `None` in metadata/search paths while preserving the existing file-catalog behavior behind `File`. Do not enable any resource call for a compact projection. + +Run: `cargo test -p devup-mcp-figma --test used_resources scanner` + +Expected: scanner tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/resources.rs crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/tests/used_resources.rs +git commit -m "refactor: model figma resource collection scopes" +``` + +### Task 2: Resolve Exact Used Local and Remote Resources + +**Files:** +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/variables.rs` +- Modify: `crates/devup-mcp-figma/tests/used_resources.rs` +- Modify: `crates/devup-mcp-figma/tests/collector.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` + +**Interfaces:** +- Produces: `ReadToolCall::used_resources(variable_ids, styles)` with fixed-size batches. +- Produces: `UsedResourceBatchResult { variables, styles, unresolved }`. +- Produces: `UnresolvedResource { id, kind, reason }` and `DEVUP_RESOURCE_UNRESOLVED` payload diagnostics. +- Preserves: `VariableCatalog` and style-consumer pagination only for `ResourceScope::File`. + +- [ ] **Step 1: Write failing exact-ID lookup and merge tests** + +Assert the embedded script calls `getVariableByIdAsync` and `getStyleByIdAsync`, does not call `getLocalVariablesAsync` or `getStyleConsumersAsync` in `Used` mode, retains the actual `remote` flag/name/type, merges successful entries when another ID is null, emits one stable unresolved item per occurrence, and marks completeness partial without inventing a token. + +- [ ] **Step 2: Run and observe the missing used-resource read call** + +Run: `cargo test -p devup-mcp-figma --test used_resources exact_id` + +Run: `cargo test -p devup-mcp-figma --test upstream_contract used_resource` + +Expected: failures because no exact-ID batch script or merge path exists. + +- [ ] **Step 3: Implement bounded direct resource batches** + +Generate batches only after the node snapshot is complete. Fetch variables/styles independently so a null or inaccessible ID is represented in `unresolved` rather than aborting the successful portion. Preserve the collector version guard and existing maximum pending-call bound. + +- [ ] **Step 4: Merge payload resources and diagnostics** + +Build the same `variables`/`styles` payload shape consumed by `with_payload_tokens`, append occurrence-aware diagnostics with node ID, field, resource ID, and reason, set `usedRemoteComplete` true only after every discovered ID was attempted, and keep raw node values as codegen fallback. + +Run: `cargo test -p devup-mcp-figma --test used_resources` + +Run: `cargo test -p devup-mcp-figma --test collector resource_scope` + +Expected: all exact-ID and partial-completeness tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/upstream.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/src/variables.rs crates/devup-mcp-figma/tests/used_resources.rs crates/devup-mcp-figma/tests/collector.rs crates/devup-mcp-figma/tests/upstream_contract.rs +git commit -m "feat: resolve used figma resources by id" +``` + +### Task 3: Capture Styled Text Segments and Preserve Nested Typography + +**Files:** +- Create: `crates/devup-mcp-figma/src/text_segment_manifest.json` +- Modify: `crates/devup-mcp-figma/src/scripts/snapshot.js` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/text.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/tests.rs` + +**Interfaces:** +- Embeds: `TEXT_SEGMENT_MANIFEST` with characters/range, fills, style IDs, font, decoration, case, line-height, letter-spacing, list, indentation, and hyperlink fields. +- Changes: `render_text_children(view, text_style_tokens, variable_tokens, depth)`. +- Changes: `typography_props(segment, text_style_tokens, variable_tokens)`. + +- [ ] **Step 1: Write the nested typography regression test first** + +Create a `TEXT` snapshot whose root uses `body`, whose `[1. 이름]` segment uses `bodySemibold`, and whose colors are variable-bound. Assert generated TSX contains nested `Text typography="bodySemibold"`, preserves surrounding spaces and `
    `, and omits redundant raw `fontSize`/`fontWeight` on resolved segments. + +- [ ] **Step 2: Run and observe the current typography loss** + +Run: `cargo test -p devup-mcp-devup-ui nested_text_style_uses_typography -- --exact` + +Expected: assertion failure because nested segments receive only variable tokens and render raw font properties. + +- [ ] **Step 3: Thread text-style tokens through segment rendering** + +Pass the same text-style map used for root `Text` into every segment. Resolve `textStyleId` before raw font properties; only segment differences produce nested `Text`, while identical runs retain the existing text/newline structure. + +Run: `cargo test -p devup-mcp-devup-ui nested_text_style_uses_typography -- --exact` + +Expected: pass. + +- [ ] **Step 4: Write and implement the live snapshot contract** + +Add an upstream contract test that evaluates the embedded snapshot script against a mocked `TEXT` node and asserts one exact `getStyledTextSegments` call using the manifest plus serialized `styledTextSegments`. Then embed the manifest, guard the method by node type/capability, and collect its result without changing the general node-field manifest. + +Run: `cargo test -p devup-mcp-figma --test upstream_contract styled_text` + +Run: `cargo test -p devup-mcp-devup-ui` + +Expected: all styled-text and codegen tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-figma/src/text_segment_manifest.json crates/devup-mcp-figma/src/scripts/snapshot.js crates/devup-mcp-figma/src/upstream.rs crates/devup-mcp-figma/tests/upstream_contract.rs crates/devup-mcp-devup-ui/src/codegen/text.rs crates/devup-mcp-devup-ui/src/codegen/component.rs crates/devup-mcp-devup-ui/src/codegen/tests.rs +git commit -m "fix: preserve figma styled text typography" +``` + +### Task 4: Build the Bounded Spatial Exploration Projection + +**Files:** +- Create: `crates/devup-mcp-figma/src/explore.rs` +- Create: `crates/devup-mcp-figma/src/scripts/explore.js` +- Create: `crates/devup-mcp-figma/tests/explore.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Modify: `crates/devup-mcp-figma/tests/collector.rs` + +**Interfaces:** +- Produces: `ExploreReadOptions { projection_limit, text_preview_limit }`. +- Produces: `ExploreNode { node_id, name, node_type, bounds, child_count, text_preview }`. +- Produces: `ExploreKind::{Screen, Heading, Annotation, Container, Unknown}`. +- Produces: `ExploreResult { anchor, group, candidates, truncated }`. +- Produces: `explore_projection(projection, target, limit) -> Result`. +- Adds: `BuiltinScript::ExploreSnapshot` and `ReadToolCall::explore_snapshot`. + +- [ ] **Step 1: Write failing Rust classification and grouping tests** + +Cover a wide/short heading, 360px screen frames, annotation text, a container with screen children, the next-heading cutoff, candidates with duplicate names, non-overlapping distant frames, WQUW-like horizontal rows, stable top/left/node-ID ordering, score reasons, caller limit, and projection truncation propagation. + +```rust +let result = explore_projection(&projection, &target, 50)?; +assert_eq!(result.anchor.kind, ExploreKind::Heading); +assert!(result.candidates.iter().any(|candidate| candidate.node_id == "3879:35518")); +assert!(result.candidates.iter().all(|candidate| !candidate.selection_reasons.is_empty())); +``` + +- [ ] **Step 2: Run and observe missing exploration types** + +Run: `cargo test -p devup-mcp-figma --test explore classification` + +Expected: compile failure. + +- [ ] **Step 3: Implement deterministic Rust classification and ranking** + +Use explicit dimension/aspect/child-count rules, group only candidates spatially connected to the anchor band before the next peer heading, retain every state/duplicate, attach all matching reasons, and sort by group order rather than score so output remains visually predictable. + +- [ ] **Step 4: Add the failing bounded-script contract** + +Mock a page with more than the projection limit and long text descendants. Assert the script returns anchor/page ancestry, bounded sibling metadata, short first-text previews, next-heading candidates, and `truncated:true`; assert it never serializes arbitrary full node fields or a whole page subtree. + +- [ ] **Step 5: Implement and wire the compact projection** + +Embed fixed default/max limits, request only the target and ancestor page, walk bounded page children, collect at most the configured text preview, and pass the compact result to Rust ranking. Explore collection must use `ResourceScope::None` and a single projection phase. + +Run: `cargo test -p devup-mcp-figma --test explore` + +Run: `cargo test -p devup-mcp-figma --test upstream_contract explore` + +Run: `cargo test -p devup-mcp-figma --test collector explore` + +Expected: all exploration projection tests pass. + +- [ ] **Step 6: Commit** + +```bash +git add crates/devup-mcp-figma/src/explore.rs crates/devup-mcp-figma/src/scripts/explore.js crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/src/upstream.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/tests/explore.rs crates/devup-mcp-figma/tests/upstream_contract.rs crates/devup-mcp-figma/tests/collector.rs +git commit -m "feat: explore linked figma screen groups" +``` + +### Task 5: Expose `devup_figma_explore` Through Direct and Host Sources + +**Files:** +- Create: `crates/devup-mcp/tests/figma_explore.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/stdio_tools.rs` +- Modify: `crates/devup-mcp/tests/source_orchestration.rs` + +**Interfaces:** +- Produces: `FigmaExploreInput { url, limit, include_text_preview, source_policy }`. +- Produces: public `devup_figma_explore` response `{ status, anchor, group, candidates, truncated, source, diagnostics }`. +- Adds: `PendingOperation::Explore(FigmaExploreInput)`. + +- [ ] **Step 1: Write failing tool-list, schema, and orchestration tests** + +Assert the tool list grows from five to six, `url` is required, `limit` is bounded to `1..=100`, direct and host completions return byte-equivalent candidate data, host mode returns `needs_figma` with a continuation ID, and invalid/file-only URLs return stable validation errors. + +- [ ] **Step 2: Run and observe the absent MCP tool** + +Run: `cargo test -p devup-mcp --test figma_explore` + +Run: `cargo test -p devup-mcp --test stdio_tools` + +Expected: failures for the missing tool and old five-tool assertion. + +- [ ] **Step 3: Register direct completion and host continuation** + +Parse the link through `FigmaTarget`, plan the compact exploration read call, store only the pending input/collector state during host handoff, rank after collection, include canonical URLs built from the source file key, and erase the session after completion. + +- [ ] **Step 4: Enforce per-tool resource policies** + +Add orchestration assertions that explore/search produce no resource calls, UI conversion always schedules `Used` after snapshot completion, and JSON conversion retains `File`. Ensure source policy changes transport only, not output ordering or resource semantics. + +Run: `cargo test -p devup-mcp --test figma_explore` + +Run: `cargo test -p devup-mcp --test source_orchestration` + +Run: `cargo test -p devup-mcp --test stdio_tools` + +Expected: all MCP and resource-policy tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp/src/server/tools.rs crates/devup-mcp/src/server/handoff.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/figma_explore.rs crates/devup-mcp/tests/stdio_tools.rs crates/devup-mcp/tests/source_orchestration.rs +git commit -m "feat: expose figma screen exploration" +``` + +### Task 6: Add the Sanitized WQUW-151 Live-Derived Regression + +**Files:** +- Create: `crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json` +- Create: `crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json` +- Modify: `crates/devup-mcp/tests/figma_explore.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/fixture_snapshot.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/snapshots/fixture_snapshot__wquw_151_proofread.snap` + +**Interfaces:** +- Consumes: sanitized real projection for heading `3879:35481` and selected screen `3879:35518`. +- Produces: stable explore result and DevupUI TSX snapshot with real token/typography names. + +- [ ] **Step 1: Create minimal sanitized fixtures from the authenticated read-only result** + +Keep the exact node geometry/names needed for spatial grouping and the selected subtree fields/resources needed for codegen. Remove source request metadata, account/user data, access credentials, plugin session identifiers, and unrelated page contents. Validate both files as JSON before use. + +- [ ] **Step 2: Write and run the failing real-regression assertions** + +Assert exploration includes all related proofread states and exact node `3879:35518`. Assert the generated component contains the root and story-section `VStack` children, the long first paragraph, `bg="$backgroundLight"`, `color="$primary"`, `typography="h3"`, `typography="body"`, and nested `typography="bodySemibold"` around `[1. 이름]`. + +Run: `cargo test -p devup-mcp --test figma_explore wquw_151 -- --exact` + +Run: `cargo insta test -p devup-mcp-devup-ui wquw_151_proofread -- --exact` + +Expected: failures until the fixture adapters and approved snapshot are present. + +- [ ] **Step 3: Add fixture adapters and review the snapshot** + +Route the compact fixture through the same public Rust exploration function and the subtree fixture through the same production `generate_component` path. Review the entire new insta snapshot, confirm no child/story section is missing and every token/style name comes from the captured resource payload, then accept only this named snapshot. + +Run: `cargo test -p devup-mcp --test figma_explore wquw_151 -- --exact` + +Run: `cargo insta test -p devup-mcp-devup-ui wquw_151_proofread -- --exact` + +Run: `cargo insta pending-snapshots --workspace` + +Expected: both regressions pass and no pending snapshots remain. + +- [ ] **Step 4: Commit** + +```bash +git add crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json crates/devup-mcp/tests/figma_explore.rs crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json crates/devup-mcp-devup-ui/tests/fixture_snapshot.rs crates/devup-mcp-devup-ui/tests/snapshots/fixture_snapshot__wquw_151_proofread.snap +git commit -m "test: lock wquw 151 figma conversion" +``` + +### Task 7: Live Smoke, Documentation, Changepack, and Full Fixture Parity + +**Files:** +- Modify: `crates/devup-mcp/tests/live_figma_contract.rs` +- Modify: `README.md` +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` + +**Interfaces:** +- Produces: ignored authenticated exploration-to-conversion smoke and release-ready documentation. + +- [ ] **Step 1: Add an ignored live WQUW-151 smoke** + +Call explore for the canonical heading URL, verify candidate `3879:35518`, convert that exact canonical URL with `ResourceScope::Used`, and assert the result contains named color/typography tokens and the `[1. 이름]` nested text. Keep all returned live payloads in memory and avoid printing/snapshotting the full story. + +- [ ] **Step 2: Run the authenticated smoke** + +Run: `cargo test -p devup-mcp --test live_figma_contract wquw_151 -- --ignored --exact` + +Expected: exploration and exact conversion pass through the authenticated source available to the environment; the repository receives no generated live payload. + +- [ ] **Step 3: Document the explicit explore-then-convert workflow** + +Add the Korean/English-safe command flow, explain duplicate/state candidate preservation, document `None`/`Used`/`File`, and state that unresolved resources fall back to raw values with a diagnostic. Do not imply that the MCP semantically interprets Jira or chooses a product state. + +- [ ] **Step 4: Update the existing JSON changepack** + +Record minor changes for `devup-mcp`, `devup-mcp-figma`, and `devup-mcp-devup-ui`: linked-screen exploration, exact local/remote used-resource collection, and styled-text typography preservation. + +- [ ] **Step 5: Run focused and compatibility suites** + +Run: `cargo test -p devup-mcp-figma` + +Run: `cargo test -p devup-mcp-devup-ui` + +Run: `cargo test -p devup-mcp` + +Run: `cargo insta test --workspace --all-features` + +Run: `cargo test -p devup-mcp-devup-ui --test fixture_snapshot` + +Expected: all tests pass, including all 268 imported plugin fixtures, and no `.snap.new` file remains. + +- [ ] **Step 6: Commit** + +```bash +git add crates/devup-mcp/tests/live_figma_contract.rs README.md .changepacks/changepack_log_figma_remote_mcp.json +git commit -m "docs: release linked figma exploration" +``` + +### Task 8: Final Verification, Installation, Push, and PR Update + +**Files:** +- Verify: entire workspace and Git history. +- Install: release `devup-mcp` binary into the active Codex MCP configuration target already used by this branch. + +- [ ] **Step 1: Run the complete verification matrix from a clean index** + +Run: `cargo fmt --all -- --check` + +Run: `cargo clippy --workspace --all-targets --all-features -- -D warnings` + +Run: `cargo test --workspace --all-features` + +Run: `cargo insta test --workspace --all-features` + +Run: `cargo insta pending-snapshots --workspace` + +Run: `cargo build --workspace --release` + +Expected: every command exits 0, no ignored failure is hidden, and no pending snapshot exists. + +- [ ] **Step 2: Audit privacy, generated artifacts, and diff scope** + +Run targeted `rg` searches for bearer tokens, OAuth callback parameters, email addresses, `.snap.new`, and temp/live payload names under tracked changes. Run `git diff --check`, inspect `git status --short`, and review every changed file against the approved spec. + +Expected: only intended source, test, fixture, docs, and changepack changes remain; no credential or unrelated Girok worktree file is present. + +- [ ] **Step 3: Install and smoke the release binary in Codex** + +Copy the verified release executable to the existing Codex devup-mcp installation path without changing secrets, restart/reconnect the MCP process through the existing configuration, list tools, and confirm `devup_figma_explore` plus the five existing tools are callable. Run one bounded authenticated explore request and one exact conversion request; do not persist their full response. + +- [ ] **Step 4: Commit any verification-only metadata, push, and update PR** + +If formatting or the reviewed snapshot changed tracked files, rerun the affected verification and create one focused final commit. Push `owjs3901/figma-remote-mcp` to `origin` and update PR `https://github.com/dev-five-git/devup-mcp/pull/1` with requirements, implementation, tests, privacy considerations, assumptions, and remaining risks. + +- [ ] **Step 5: Record final evidence** + +Capture the final commit SHA, pushed branch status, PR URL, exact verification commands/results, Codex installation target, live smoke outcome, unresolved limitations, and the fact that Figma access remained read-only for the user-facing completion report. diff --git a/docs/superpowers/plans/2026-08-31-figma-search-and-export.md b/docs/superpowers/plans/2026-08-31-figma-search-and-export.md new file mode 100644 index 0000000..7366a9a --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-figma-search-and-export.md @@ -0,0 +1,304 @@ +# Figma Name Search and Workspace Export Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Find Figma pages/canvases by human-readable name and let an agent deterministically convert every confirmed result into DevupUI artifacts. + +**Architecture:** Search builds a deterministic in-memory index from the same source-independent collector used by conversion. It returns canonical node URLs plus type/page/breadcrumb metadata and keeps no conversational server state; the agent reuses those URLs for one or more existing `devup_figma_to_ui` calls. Optional file output is confined to the startup workspace and uses atomic writes. + +**Tech Stack:** Rust 1.88, edition 2024, serde/serde_json, unicode-normalization, Tokio, rmcp, Cargo-only CI. + +**Spec:** `docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md` + +## Global Constraints + +- Prerequisites: both the collection/live-contract and JSON-fixture-parity plans are complete and green. +- Search uses direct or host source through the existing collector; results must be identical across sources. +- Default node types are PAGE, SECTION, FRAME, COMPONENT_SET and COMPONENT. +- Ranking is exact, normalized exact, prefix, contains; fuzzy matching is opt-in only. +- Normalization uses Unicode NFC, whitespace collapse and Unicode lowercase without modifying returned original names. +- Duplicate names are never silently reduced to one result. +- Search results include canonical URL, node ID, type, page name and complete breadcrumb. +- Follow-up natural language is interpreted by the agent, not stored or parsed by `devup-mcp`. +- First release has no batch conversion tool; agents call `devup_figma_to_ui` per confirmed canonical URL with bounded concurrency. +- Raw search indexes and Figma content remain memory-only. +- File output occurs only when `outputPath` is explicit and resolves beneath the startup workspace. + +## File Structure + +### Create + +- `crates/devup-mcp-figma/src/search.rs` — name normalization, index and ranking. +- `crates/devup-mcp-figma/tests/search.rs` — Korean/Unicode/ranking/duplicate/source parity tests. +- `crates/devup-mcp/src/server/workspace.rs` — workspace-confined atomic artifact writer. +- `crates/devup-mcp/tests/figma_search.rs` — MCP search direct/host continuation tests. +- `crates/devup-mcp/tests/workspace_export.rs` — traversal, symlink and atomic-write tests. +- `crates/devup-mcp/tests/search_to_ui_flow.rs` — search followed by every-result conversion. + +### Modify + +- `Cargo.toml` — add `unicode-normalization = "0.1"` as a workspace dependency. +- `crates/devup-mcp-figma/Cargo.toml` — consume unicode-normalization. +- `crates/devup-mcp-figma/src/lib.rs` — export search interfaces. +- `crates/devup-mcp/src/server/tools.rs` — search input and optional output paths. +- `crates/devup-mcp/src/server/handoff.rs` — persist pending search operation without persisting result indexes after completion. +- `crates/devup-mcp/src/server/mod.rs` — register search and workspace export. +- `crates/devup-mcp/tests/stdio_tools.rs` — tool schema assertions. +- `README.md` — conversational search-to-implementation examples. +- `.changepacks/*.md` — search/export release notes. + +--- + +### Task 1: Deterministic Figma Name Index + +**Files:** +- Create: `crates/devup-mcp-figma/src/search.rs` +- Create: `crates/devup-mcp-figma/tests/search.rs` +- Modify: `Cargo.toml` +- Modify: `crates/devup-mcp-figma/Cargo.toml` +- Modify: `crates/devup-mcp-figma/src/lib.rs` + +**Interfaces:** +- Consumes: `CollectedPayload` metadata and snapshot nodes. +- Produces: `SearchMatchKind::{Exact, NormalizedExact, Prefix, Contains, Fuzzy}`. +- Produces: `SearchQuery { query, node_types, match_mode, limit }`. +- Produces: `SearchMatch { name, node_id, node_type, page_name, breadcrumb, canonical_url, match_kind, score }`. +- Produces: `FigmaSearchIndex::from_payload(&CollectedPayload)` and `search(&self, &SearchQuery) -> Vec`. + +- [ ] **Step 1: Write failing normalization and ranking tests** + +Cover composed/decomposed Korean, repeated whitespace, ASCII case, exact versus prefix versus contains, duplicate names on different pages, hidden nodes, type filters, deterministic ties and limit enforcement. + +```rust +let results = index.search(&SearchQuery::normalized("A : STORY-F-PROOFREAD")); +assert_eq!(results[0].match_kind, SearchMatchKind::Exact); +assert_eq!(results[0].breadcrumb, ["Writer", "Proofread", "A : STORY-F-PROOFREAD"]); +assert_eq!(results.len(), 2); // duplicate names are retained +``` + +- [ ] **Step 2: Run and confirm search types are missing** + +Run: `cargo test -p devup-mcp-figma --test search` + +Expected: compile failure. + +- [ ] **Step 3: Implement normalization, index construction and stable sorting** + +Construct breadcrumbs from parent IDs and page roots with cycle detection. Normalize only the comparison key. Sort by match rank, then normalized name, page name, breadcrumb and node ID. Canonical URLs must use the source file key and percent-safe `node-id` query. + +```rust +fn normalize_name(value: &str) -> String { + value.nfc().flat_map(char::to_lowercase).collect::() + .split_whitespace().collect::>().join(" ") +} +``` + +- [ ] **Step 4: Add opt-in fuzzy matching tests** + +Implement a bounded edit-distance calculation only when `matchMode:"fuzzy"`; require a threshold tied to query length and rank fuzzy below contains. Assert normalized mode never returns a fuzzy-only candidate. + +Run: `cargo test -p devup-mcp-figma --test search` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add Cargo.toml Cargo.lock crates/devup-mcp-figma/Cargo.toml crates/devup-mcp-figma/src/search.rs crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/tests/search.rs +git commit -m "feat: index figma nodes by name" +``` + +### Task 2: Expose `devup_figma_search` Through Direct and Host Sources + +**Files:** +- Create: `crates/devup-mcp/tests/figma_search.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/stdio_tools.rs` + +**Interfaces:** +- Consumes: `FigmaSearchIndex`, `CollectionScope::File`, existing source orchestration. +- Produces: `FigmaSearchInput { url, query, node_types, match_mode, limit, source_policy }`. +- Produces: public `devup_figma_search` result `{status, query, matches, diagnostics, source}`. + +- [ ] **Step 1: Write failing MCP tool tests** + +Assert search appears in `tools/list`; a file URL without node ID is accepted; host mode returns `needs_figma`; continuation eventually returns matches; direct mode returns the same ordered JSON; invalid node type, empty query and limit outside 1..=100 return stable errors. + +- [ ] **Step 2: Run and confirm the tool is absent** + +Run: `cargo test -p devup-mcp --test figma_search` + +Run: `cargo test -p devup-mcp --test stdio_tools` + +Expected: failures for missing tool/schema. + +- [ ] **Step 3: Implement search as a pending operation** + +Add `PendingOperation::Search(FigmaSearchInput)` to the handoff session. Collect file metadata/snapshots using the existing state machine, build the index only after completion, return matches, then erase all session/index data. + +```rust +async fn complete_search( + input: FigmaSearchInput, + payload: CollectedPayload, +) -> Result { + let index = FigmaSearchIndex::from_payload(&payload)?; + let query = input.into_query()?; + Ok(serde_json::json!({ + "status": "complete", + "matches": index.search(&query), + })) +} +``` + +- [ ] **Step 4: Verify source parity and privacy** + +Feed the identical synthetic collected payload through direct and host test paths and assert byte-identical matches. Inspect server debug/error output and assert node names do not appear outside the final successful response. + +Run: `cargo test -p devup-mcp --test figma_search` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp/src/server crates/devup-mcp/tests/figma_search.rs crates/devup-mcp/tests/stdio_tools.rs +git commit -m "feat: expose figma name search" +``` + +### Task 3: Verify the Conversational Search-to-All-Results Flow + +**Files:** +- Create: `crates/devup-mcp/tests/search_to_ui_flow.rs` +- Modify: `README.md` + +**Interfaces:** +- Consumes: `devup_figma_search` matches and existing `devup_figma_to_ui` canonical URL input. +- Produces: documented stateless two-turn agent workflow. + +- [ ] **Step 1: Write the failing end-to-end flow test** + +Create two same-name frames on different pages. Search for the shared name, retain both results, then invoke UI conversion once per returned canonical URL. Assert two distinct artifacts and source node IDs; assert no search-result session ID is required after search completes. + +- [ ] **Step 2: Run and fix only URL handoff incompatibilities** + +Run: `cargo test -p devup-mcp --test search_to_ui_flow` + +Expected: pass after canonical URLs round-trip through `FigmaTarget::parse`. + +- [ ] **Step 3: Document the Korean conversational flow** + +Add examples for “이 파일에 이름이 ~인 화면이 있니?” followed by “맞아, 그 목록 다 구현해줘.” Explain that the client agent retains structured matches and calls the existing converter for each; `devup-mcp` does not interpret natural language or persist the list. + +- [ ] **Step 4: Commit** + +```bash +git add crates/devup-mcp/tests/search_to_ui_flow.rs README.md +git commit -m "test: cover figma search to ui flow" +``` + +### Task 4: Workspace-Confined Atomic Artifact Export + +**Files:** +- Create: `crates/devup-mcp/src/server/workspace.rs` +- Create: `crates/devup-mcp/tests/workspace_export.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` + +**Interfaces:** +- Produces: `WorkspaceWriter::new(root: PathBuf)` and `write(relative_path, bytes) -> Result`. +- Produces: optional `outputPath` on UI and JSON conversion tools. +- Produces: `ArtifactFile { path, sha256, byte_len }` without echoing content when a file is written. + +- [ ] **Step 1: Write failing Windows-safe path tests** + +Cover relative file and directory outputs, `..`, absolute paths, nonexistent nested directories, a symlink/junction escaping the root, reserved/invalid target handling, existing-file replacement and cleanup after simulated write failure. + +- [ ] **Step 2: Run and confirm writer is missing** + +Run: `cargo test -p devup-mcp --test workspace_export` + +Expected: compile failure. + +- [ ] **Step 3: Implement root capture and atomic writes** + +Capture the canonical startup current directory in `Services::production`. Resolve the nearest existing parent of a requested relative path, reject any canonical parent outside root, create only validated descendants, write to a same-directory random temporary file, flush, then rename. Never recursively delete or overwrite a directory. + +```rust +impl WorkspaceWriter { + pub fn write(&self, relative: &Path, bytes: &[u8]) -> Result { + let target = self.resolve_confined_target(relative)?; + atomic_write_same_directory(&target, bytes)?; + Ok(ArtifactFile::from_bytes(target, bytes)) + } +} +``` + +- [ ] **Step 4: Wire output paths into completed conversions** + +UI directory output writes deterministic `.tsx` component files and a manifest; JSON file output writes `devup.json`. Without `outputPath`, preserve the existing in-memory content response. On write failure return no partial success and remove the temporary file. + +Run: `cargo test -p devup-mcp --test workspace_export` + +Run: `cargo test -p devup-mcp --test downstream_integration` + +Expected: all tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp/src/server/workspace.rs crates/devup-mcp/src/server/tools.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/workspace_export.rs crates/devup-mcp/tests/downstream_integration.rs +git commit -m "feat: export devup artifacts safely" +``` + +### Task 5: Live Search Smoke, Changepack and Final Verification + +**Files:** +- Modify: `crates/devup-mcp/tests/live_figma_contract.rs` +- Modify: `README.md` +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` + +**Interfaces:** +- Produces: opt-in live search smoke and release-ready search/export feature. + +- [ ] **Step 1: Add an ignored live name-search smoke** + +Against file `85CgSws3o5XsLv7aAwWJyS`, search exact name `A : STORY-F-PROOFREAD` through host fallback. Assert at least one result has the expected original name, type FRAME and a canonical URL whose node ID parses. Do not snapshot the remaining names or raw metadata. + +- [ ] **Step 2: Run the live smoke only in the authenticated environment** + +Run: `cargo test -p devup-mcp --test live_figma_contract -- --ignored` + +Expected: search smoke and payload round-trip pass; no response body is written under the repository. + +- [ ] **Step 3: Add changepack and finish documentation** + +Record minor changes for `devup-mcp` and `devup-mcp-figma`: deterministic name search, stateless multi-result flow and safe workspace export. + +- [ ] **Step 4: Run full verification** + +Run: `cargo fmt --all -- --check` + +Run: `cargo clippy --workspace --all-targets --all-features -- -D warnings` + +Run: `cargo insta test --workspace --all-features` + +Run: `cargo test --workspace --all-features` + +Run: `cargo build --workspace --release` + +Expected: every command exits 0 and no pending snapshots exist. + +- [ ] **Step 5: Verify clean scope and commit** + +Run: `git status --short` + +Run: `git diff --check` + +Expected: only changepack/documentation changes remain before commit; no live Figma payload or secret exists. + +```bash +git add .changepacks/changepack_log_figma_remote_mcp.json README.md crates/devup-mcp/tests/live_figma_contract.rs +git commit -m "docs: release figma search workflow" +``` diff --git a/docs/superpowers/plans/2026-08-31-figma-single-call-envelope.md b/docs/superpowers/plans/2026-08-31-figma-single-call-envelope.md new file mode 100644 index 0000000..9766503 --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-figma-single-call-envelope.md @@ -0,0 +1,356 @@ +# Figma Single-Call Envelope Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Collect an exact Figma node subtree and every referenced variable/style in one normal official Figma MCP call, validate the result losslessly in Rust, and fall back to the proven cursor collector without accepting partial fast-path data. + +**Architecture:** A compile-in read-only Plugin API script serializes the existing snapshot schema plus exact used resources into a versioned JSON envelope and returns each CRC-protected private chunk as a valid 1×1 PNG inside one official MCP call. Rust treats those images as untrusted transport, validates framing/schema/graph/resource integrity, normalizes them into the existing `CollectedParts`, and uses the unchanged DevupUI pipeline; the collector owns fast-first selection, clean restart, call statistics, and legacy optimization. + +**Tech Stack:** Rust 1.88 workspace, `rmcp`, `serde`/`serde_json`, `base64`, compile-in Figma Plugin API JavaScript, `cargo insta`, Bun changepacks, official read-only Figma MCP. + +**Spec:** `docs/superpowers/specs/2026-08-31-figma-single-call-envelope-design.md` + +## Global Constraints + +- Run every behavior change test-first: add one focused failing test, observe the intended failure, then add the smallest implementation and observe the pass. +- Do not add a JavaScript runtime, Bun runtime dependency, user-supplied upstream script, or a second code-generation pipeline. +- Do not call any Figma mutation API. The only write-shaped operation is `figma.io.write`, used solely as the official result transport. +- Never persist or report OAuth credentials, user identity, full private design text, variable values, or raw binary envelope bytes. +- A fast result is atomic: any transport, schema, graph, target, descriptor, or resource validation failure discards it and restarts legacy collection from cursor zero. +- Keep `standalone` root layout as the compatibility default; `embedded` is explicit. +- Preserve the 268 imported snapshot outputs byte-for-byte except fixtures intentionally corrected by stronger live Figma evidence. +- Use only `apply_patch` for authored source/document edits; snapshot regeneration and formatter output may use their normal tools. + +--- + +## Task 1: Implement and harden the PNG envelope decoder + +**Files:** + +- Create: `crates/devup-mcp-figma/src/envelope.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Create: `crates/devup-mcp-figma/tests/envelope.rs` + +- [x] **Step 1: Add a valid single- and multi-chunk fixture builder in the integration test** + + Define test-only helpers that create a minimal valid PNG with `IHDR`, one or more `duVp` chunks, `IDAT`, and `IEND`. Each `duVp` payload starts with big-endian `sequence` and `total` values, and every PNG chunk receives a standards-compliant CRC32. + +- [x] **Step 2: Write the first failing round-trip test** + + Construct a schema-version-1 envelope containing two nodes, one variable, one style, and a descriptor. Call the planned `decode_fast_snapshot(&UpstreamResult, &FigmaTarget)` API and assert exact source IDs, node/resource counts, UTF-8 byte count, and transport byte/chunk statistics. + + Run: `cargo test -p devup-mcp-figma --test envelope valid_multichunk_envelope_round_trips -- --exact` + + Expected: compilation failure because `envelope` and `decode_fast_snapshot` do not exist. + +- [x] **Step 3: Add the minimal public decoder model and happy path** + + Introduce: + + ```rust + pub struct FastSnapshotPayload { + pub snapshot: SnapshotChunk, + pub resources: UpstreamResult, + pub stats: FastTransportStats, + } + + pub struct FastTransportStats { + pub raw_bytes: usize, + pub wire_bytes: usize, + pub chunk_count: usize, + } + + pub fn decode_fast_snapshot( + result: &UpstreamResult, + target: &FigmaTarget, + ) -> Result; + ``` + + Find exactly one `image/png` content block, decode base64, parse checked PNG lengths, verify every PNG CRC, collect all `duVp` chunks, enforce unique contiguous sequence numbers, concatenate bytes, decode UTF-8/JSON, and verify the descriptor without logging content. + +- [x] **Step 4: Observe the round-trip test pass** + + Run the exact test from Step 2 and confirm it passes. + +- [x] **Step 5: Add table-driven failing corruption and limit tests** + + Cover bad PNG signature, truncated length, missing/duplicate/out-of-order envelope chunk, corrupted CRC, invalid UTF-8, invalid JSON, unsupported schema, image MIME mismatch, multiple image blocks, oversized PNG, oversized envelope, descriptor count mismatch, file key mismatch, root ID mismatch, declared node count mismatch, missing root, dangling child, and unresolved resource reference. + + Run: `cargo test -p devup-mcp-figma --test envelope` + + Expected: new cases fail at the missing validation boundary, never panic. + +- [x] **Step 6: Implement all validation boundaries with stable safe errors** + + Use checked arithmetic and explicit constants sized below the existing 16 MiB handoff result ceiling after base64 overhead. Validate that every referenced variable/style appears either in the resource result or its `unresolved` list. Error messages contain only category/count/ID metadata, never design text or values. + +- [x] **Step 7: Run focused crate checks and commit** + + Run: + + ```powershell + cargo fmt --all -- --check + cargo clippy -p devup-mcp-figma --all-targets -- -D warnings + cargo test -p devup-mcp-figma --test envelope + ``` + + Commit: `feat(figma): decode validated single-call envelopes` + +--- + +## Task 2: Build the lossless compile-in Figma fast snapshot script + +**Files:** + +- Create: `crates/devup-mcp-figma/src/scripts/fast_snapshot.js` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Modify if shared serializer extraction is needed: `crates/devup-mcp-figma/src/scripts/snapshot.js` + +- [x] **Step 1: Write failing source-contract tests** + + Assert that `BuiltinScript::FastSnapshotEnvelope` exists, is selected by `ReadToolCall::fast_snapshot`, receives only Rust-substituted file/root IDs, walks the complete subtree without text-page limits, reads manifest plus runtime fields, captures styled text segments and individual stroke weights, collects used variable/style IDs, resolves both kinds in one `Promise.all`, encodes lone surrogates safely, emits `duVp` chunks, and calls only `figma.io.write` for output. + + Also reject mutation tokens such as `createRectangle`, `appendChild`, `setPluginData`, property assignments on document nodes, and imports/network access. + + Run: `cargo test -p devup-mcp-figma --test upstream_contract fast_snapshot -- --nocapture` + + Expected: compilation/assertion failure because the variant and script do not exist. + +- [x] **Step 2: Implement the script from the current serializer contract** + + Reuse the snapshot field/marker semantics rather than inventing a projection. Traverse breadth-first, serialize all public manifest and enumerable/prototype data properties, preserve getter errors and mixed/styled text, scan the completed serialized graph for used IDs, resolve resources in stable sorted order, assemble schema version 1 and integrity counts, encode UTF-8 in pure JavaScript, construct one valid 1×1 PNG per private ancillary chunk with CRC32, then emit those images within the same `use_figma` execution. + +- [x] **Step 3: Add deterministic script-level contract cases** + + Assert placeholder escaping, stable resource ordering, no `maxFieldBytes`/`maxNodeBytes` truncation in fast mode, a bounded maximum envelope size before allocation, and a descriptor containing only schema/count/byte/chunk metadata. + +- [x] **Step 4: Run upstream and snapshot contract suites** + + Run: + + ```powershell + cargo test -p devup-mcp-figma --test upstream_contract + cargo test -p devup-mcp-figma --test snapshot + ``` + +- [x] **Step 5: Commit** + + Commit: `feat(figma): add lossless single-call snapshot script` + +--- + +## Task 3: Make the collector fast-first, atomic, observable, and safely fall back + +**Files:** + +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/payload.rs` +- Modify: `crates/devup-mcp-figma/src/server/mod.rs` +- Modify: `crates/devup-mcp-figma/src/server/handoff.rs` +- Modify: `crates/devup-mcp-figma/tests/collector.rs` +- Modify or create: `crates/devup-mcp-figma/tests/fast_fallback.rs` + +- [x] **Step 1: Write a failing one-call collector test** + + Start an exact-node `CollectionRequest` with node scope and used resources. Assert the first emitted call is `FastSnapshotEnvelope`; after accepting one valid envelope, assert the session completes without metadata, snapshot-page, variable, or style calls and reports `figma_tool_calls=1`, `transport="png-envelope-v1"`, `fallback_used=false`. + + Run: `cargo test -p devup-mcp-figma --test collector exact_node_fast_path_completes_in_one_call -- --exact` + +- [x] **Step 2: Add collection stats and the minimal fast success transition** + + Add a serializable `CollectionStats` to `CollectedParts`/`CollectedPayload` with tool call count, transport name, fallback flag, node/variable/style counts, raw bytes, and wire bytes. Count calls when the state machine dispatches a unique upstream request, not when a result is parsed. + +- [x] **Step 3: Write failing atomic fallback tests** + + For text-only result, malformed PNG, target mismatch, graph mismatch, resource mismatch, and rejected direct upstream call, assert that the next request is legacy metadata at cursor zero; fast partial nodes/resources are absent; the final payload is produced only from legacy results; stats preserve `fallback_used=true` and a sanitized failure category. + +- [x] **Step 4: Implement an explicit fast-call rejection/fallback transition** + + Add a collector method used by direct execution when the fast upstream request errors. In `accept`, convert every decoder/integrity error for the fast call into the same clean restart. Retain hard errors for stale/wrong call IDs and failures after legacy collection begins. Host handoff uses the identical `accept` path when it submits a text/error-shaped result. + +- [x] **Step 5: Write a failing legacy combined-resource test** + + Feed a paginated legacy snapshot referencing variables and styles whose combined serialized request fits the configured limit. Assert one stable, sorted used-resource batch follows the final snapshot page instead of separate variable/style groups. + +- [x] **Step 6: Implement bounded combined batching** + + Merge variable/style IDs into one read-only used-resource request when it fits; deterministically split only when the serialized ID/count limit requires it. Keep existing partial completeness and unresolved behavior. + +- [x] **Step 7: Verify direct and handoff result observability** + + Add server tests that both execution modes expose the same safe fields: `figmaToolCalls`, `transport`, `fallbackUsed`, `nodeCount`, `variableCount`, `styleCount`, `rawBytes`, and `wireBytes`, without raw envelope or credentials. + +- [x] **Step 8: Run focused checks and commit** + + Run: + + ```powershell + cargo test -p devup-mcp-figma --test collector + cargo test -p devup-mcp-figma --test fast_fallback + cargo test -p devup-mcp-figma + ``` + + Commit: `feat(figma): collect exact nodes with atomic fast fallback` + +--- + +## Task 4: Correct mixed strokes and add explicit root layout semantics + +**Files:** + +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/layout.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/style.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/wquw_151.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-proofread.json` +- Modify: `crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap` +- Create or modify: `crates/devup-mcp-devup-ui/tests/codegen_layout.rs` +- Modify: `crates/devup-mcp-figma/src/server/tools.rs` +- Modify: `crates/devup-mcp-figma/src/server/handoff.rs` +- Modify: `crates/devup-mcp-figma/src/server/mod.rs` + +- [x] **Step 1: Write failing mixed-stroke unit tests** + + A node with mixed `strokeWeight` plus top/right/bottom/left values `1/0/0/0` must emit only `borderTop="solid 1px $border"`. A mixed/unsupported weight without individual side data must not guess `border="solid 1px ..."`. + + Run: `cargo test -p devup-mcp-devup-ui mixed_individual_stroke -- --nocapture` + + Expected: first case lacks `borderTop` or second case emits a guessed all-side border. + +- [x] **Step 2: Fix stroke selection without changing uniform strokes** + + Prefer explicit individual side fields whenever uniform weight is non-numeric/mixed. Preserve current inside/center/outside handling for genuinely numeric uniform weights. Omit the guessed border when neither form is trustworthy. + +- [x] **Step 3: Write failing standalone/embedded root tests** + + Add `RootLayout::{Standalone, Embedded}` to the planned options assertions. Standalone must retain selected-frame width, height, and relative containing block; embedded must omit only root fixed width/height/position while preserving descendants and all other root props. + +- [x] **Step 4: Implement root layout through every API boundary** + + Add `root_layout` to `CodegenOptions`, default it to standalone, parse optional MCP input `rootLayout` as `standalone|embedded`, preserve it through pending handoff state, and pass it into root layout property generation. Return the selected mode in the tool result. + +- [x] **Step 5: Correct the WQUW live fixture and snapshots** + + Add the four observed individual weights for node `3879:35564` without changing its 144-node graph, 13 variable names, or 11 typography names. Regenerate standalone and embedded snapshots and assert `borderTop`, all children, variable tokens, and typography tokens. + + Run: + + ```powershell + $env:INSTA_UPDATE='always' + cargo test -p devup-mcp-devup-ui --test wquw_151 + Remove-Item Env:INSTA_UPDATE + cargo insta test -p devup-mcp-devup-ui --check + ``` + +- [x] **Step 6: Re-run all imported compatibility fixtures** + + Run: + + ```powershell + cargo test -p devup-mcp-devup-ui --test compat_fixtures + cargo test -p devup-mcp-devup-ui --test compat_manifest + ``` + + Expected: 268/268 JSON-to-golden snapshot comparisons still pass; only the dedicated live WQUW regression changes. + +- [x] **Step 7: Commit** + + Commit: `fix(devup-ui): preserve individual strokes and root modes` + +--- + +## Task 5: Make upstream fixture coverage claims executable and accurate + +**Files:** + +- Modify: `crates/devup-mcp-devup-ui/tests/compat_manifest.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/compat_fixtures.rs` +- Create: `crates/devup-mcp-devup-ui/tests/fixtures/devup-figma-plugin/coverage-registry.json` +- Modify: `crates/devup-mcp-devup-ui/tests/fixtures/devup-figma-plugin/ledger.json` +- Modify: `crates/devup-mcp-devup-ui/tests/fixtures/devup-figma-plugin/README.md` +- Modify repository documentation that currently implies all 978 tests run as Rust parity tests. + +- [x] **Step 1: Add a failing coverage-registry integrity test** + + Require every one of the 978 ledger entries to reference a registered executable Rust test or an explicit non-parity classification with a non-empty reason. Require all 268 generated fixture paths to exist as JSON input plus golden output and to be exercised by `compat_fixtures`. + +- [x] **Step 2: Replace the nonexistent umbrella symbol mapping** + + Register actual Rust test symbols/categories. Map all snapshot-producing entries to the executable fixture parity harness; map TSX-affecting assertions such as strokes, layout, text styles, variables, instances, and responsive output to concrete unit/integration tests; leave plugin-runtime and write-only cases explicitly classified rather than falsely covered. + +- [x] **Step 3: Correct documentation and generated metadata wording** + + State precisely: 268 imported snapshot outputs pass byte parity, while 978 upstream tests are inventoried and categorized. Do not claim 978 independently executed Rust parity tests. + +- [x] **Step 4: Run corpus verification** + + Run: + + ```powershell + cargo test -p devup-mcp-devup-ui --test compat_manifest + cargo test -p devup-mcp-devup-ui --test compat_fixtures + ``` + +- [x] **Step 5: Commit** + + Commit: `test(devup-ui): make upstream coverage registry executable` + +--- + +## Task 6: Live contract, release metadata, full verification, installation, and PR update + +**Files:** + +- Modify or create: `crates/devup-mcp/tests/live_figma_contract.rs` +- Modify: relevant README/tool documentation +- Create: one changepack file under `.changepacks/` +- Modify only if generated by tests: snapshots and lockfile + +- [x] **Step 1: Add opt-in read-only live contract assertions** + + For file `85CgSws3o5XsLv7aAwWJyS`, node `3879:35518`, assert one normal fast tool call, 144 nodes, the observed 20 variable aliases across all lossless fields, 11 text styles, `borderTop` on node-derived output, and no credential/raw-content fields in stats. Add a deterministic forced-corruption mode that proves automatic legacy fallback without modifying Figma. + +- [x] **Step 2: Run the authenticated live contract when credentials are available** + + Use the authenticated official host Figma MCP without reading or printing its token. Record actual call count and fallback status in the test output. + +- [x] **Step 3: Add user-facing documentation and changepack** + + Document exact-node one-call behavior, automatic legacy fallback, `rootLayout`, safe stats, and the distinction between 268 snapshot parity and the 978-test inventory. Add a focused release note for `devup-mcp`/affected crates according to `.changepacks/config.json`. + +- [x] **Step 4: Run focused and workspace verification from a clean environment** + + Run: + + ```powershell + cargo fmt --all -- --check + cargo clippy --workspace --all-targets --all-features -- -D warnings + cargo test --workspace --all-features + cargo build --workspace --all-features + ``` + + Run any repository-specific Bun lint/build commands only if package scripts exist; do not introduce Bun as a Rust runtime dependency. + +- [x] **Step 5: Inspect the final diff for privacy, scope, and generated artifacts** + + Confirm no credential/token/account identifier, full binary envelope, temporary live output, `.env`, or unrelated file is tracked. Confirm every changed snapshot is explained by the intended WQUW stroke/root mode behavior. + +- [x] **Step 6: Install the verified binary for Codex** + + Run: + + ```powershell + cargo install --path crates/devup-mcp --locked --force + devup-mcp --version + ``` + + Verify the configured Codex MCP entry still points at the installed executable; note that an already-running Codex session may require a restart to load the new binary. + +- [x] **Step 7: Commit, push, and update PR #1** + + Create a final focused docs/release commit if needed, push `owjs3901/figma-remote-mcp`, and update PR `https://github.com/dev-five-git/devup-mcp/pull/1` with requirements, architecture, test evidence, live call count, fixture audit wording, security/privacy considerations, assumptions, and remaining live-runtime risks. + +- [ ] **Step 8: Final evidence report** + + Report changed files, all command outcomes, commit SHAs, PR URL, installed binary path/version, observed Figma counts, privacy/security checks, assumptions, and any remaining risk. Do not claim completion before re-running and reading the final verification outputs. diff --git a/docs/superpowers/plans/2026-08-31-json-fixture-parity.md b/docs/superpowers/plans/2026-08-31-json-fixture-parity.md new file mode 100644 index 0000000..9d158f8 --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-json-fixture-parity.md @@ -0,0 +1,502 @@ +# JSON Fixture and DevupUI Parity Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Convert the pinned JavaScript plugin test corpus to self-contained production-shaped JSON inputs and make the Rust DevupUI/devup.json converter pass the corresponding cargo-insta snapshots. + +**Architecture:** This plan starts only after `2026-08-31-figma-collection-live-contract.md` has completed and `CollectedPayload` has passed the live JSON contract gate. Fixtures deserialize directly into that real Rust payload type; a manifest and ledger prove one-to-one accounting for the pinned 54 files, 978 tests and 268 existing snapshots. Codegen parity is then implemented in focused layers using the JSON cases as end-to-end tests. + +**Tech Stack:** Rust 1.88, edition 2024, serde/serde_json, insta/cargo-insta 1.48.0 with `json` and `glob`, DevupUI TSX, Cargo-only build/test. + +**Spec:** `docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md` + +## Global Constraints + +- Prerequisite: the collection/live-contract plan is complete and its tests pass. +- Do not invent fixture node fields. Every fixture payload must deserialize as the finalized `devup_mcp_figma::CollectedPayload`. +- `devup-mcp` does not run Bun/Node and contains no JavaScript fixture generator. +- Pinned source is `dev-five-git/devup-figma-plugin@243db650f1d635ab5385546a2a297eae4ea93515` until an explicitly reviewed update changes it. +- Baseline evidence is 54 test files, 978 passing tests, 0 failures, 268 snapshots and 1,974 assertions. +- Existing upstream snapshot strings are normalized only from CRLF to LF; formatting is otherwise byte-identical. +- Actual user Figma payloads are not fixtures. Fixtures use the pinned plugin's synthetic mocks normalized into the real payload shape. +- JSON, manifest, ledger and snapshot changes are reviewed together; tests never auto-accept snapshots. +- Each codegen layer follows red-green-refactor and ends in a focused commit. + +## File Structure + +### Create + +- `fixtures/devup-figma-plugin/manifest.json` — source provenance, schema version, counts and checksums. +- `fixtures/devup-figma-plugin/ledger.json` — all upstream test IDs and their Rust mapping. +- `fixtures/devup-figma-plugin/cases/{codegen,responsive,devup-json,snapshot,errors}/*.json` — one self-contained JSON case per conversion behavior. +- `fixtures/devup-figma-plugin/snapshots/{codegen,responsive,devup-json,snapshot,errors}/*.snap` — one insta result per `rust_snapshot` case. +- `crates/devup-mcp-devup-ui/tests/support/mod.rs` — fixture discovery, validation and snapshot settings. +- `crates/devup-mcp-devup-ui/tests/compat_fixtures.rs` — JSON-to-output dispatcher. +- `crates/devup-mcp-devup-ui/tests/compat_manifest.rs` — manifest/ledger/orphan/checksum gate. +- `crates/devup-mcp-devup-ui/src/codegen/node_tree.rs` — production-shaped payload to codegen IR. +- `crates/devup-mcp-devup-ui/src/codegen/render.rs` — deterministic JSX/import rendering. +- `crates/devup-mcp-devup-ui/src/codegen/props/mod.rs` — property aggregation. +- `crates/devup-mcp-devup-ui/src/codegen/props/layout.rs` — layout, constraints, sizing, padding and gap. +- `crates/devup-mcp-devup-ui/src/codegen/props/visual.rs` — fills, gradients, borders, radii, blend and effects. +- `crates/devup-mcp-devup-ui/src/codegen/props/typography.rs` — text segments and text CSS. +- `crates/devup-mcp-devup-ui/src/codegen/props/variables.rs` — bound-variable resolution. +- `crates/devup-mcp-devup-ui/src/codegen/components.rs` — components, instances, variants and slots. +- `crates/devup-mcp-devup-ui/src/codegen/responsive.rs` — breakpoint grouping/merging. +- `crates/devup-mcp-devup-ui/src/codegen/assets.rs` — SVG/PNG/image/mask decisions. +- `crates/devup-mcp-devup-ui/src/theme/aliases.rs` — variable alias graph and cycle handling. +- `crates/devup-mcp-devup-ui/src/theme/styles.rs` — typography and shadow style projection. + +### Modify + +- `Cargo.toml` — add workspace `insta` only as a test dependency consumer. +- `crates/devup-mcp-devup-ui/Cargo.toml` — `insta` dev dependency with `glob,json`. +- `crates/devup-mcp-devup-ui/src/codegen/mod.rs` — export the decomposed codegen pipeline. +- `crates/devup-mcp-devup-ui/src/codegen/component.rs` — delegate to NodeTree/component/render units. +- `crates/devup-mcp-devup-ui/src/codegen/layout.rs` — move or replace minimal rules. +- `crates/devup-mcp-devup-ui/src/codegen/style.rs` — move or replace minimal rules. +- `crates/devup-mcp-devup-ui/src/codegen/text.rs` — move or replace minimal rules. +- `crates/devup-mcp-devup-ui/src/theme/devup_json.rs` — mode/theme/treeshaking output. +- `crates/devup-mcp-devup-ui/src/theme/tokens.rs` — stable token naming and aliases. +- `crates/devup-mcp-devup-ui/src/theme/mod.rs` — export new theme units. +- `.github/workflows/ci.yml` — install `cargo-insta` and run snapshot check. +- `README.md` — fixture authoring and snapshot review. +- `.changepacks/*.md` — parity change record. + +--- + +### Task 1: Freeze Fixture Types from the Live Payload Contract + +**Files:** +- Create: `crates/devup-mcp-devup-ui/tests/support/mod.rs` +- Create: `crates/devup-mcp-devup-ui/tests/compat_fixtures.rs` +- Create: `fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json` +- Modify: `Cargo.toml` +- Modify: `crates/devup-mcp-devup-ui/Cargo.toml` + +**Interfaces:** +- Consumes: finalized `devup_mcp_figma::CollectedPayload` from the prerequisite plan. +- Produces: test-only `FixtureCase { schema_version, id, operation, source, request, payload: CollectedPayload }`. +- Produces: `FixtureOperation::{Tsx, ResponsiveTsx, DevupJson, Snapshot, Error}`. +- Produces: `load_case(path) -> Result` and `run_case(case) -> Result`. + +- [ ] **Step 1: Add insta and write a failing one-case loader test** + +```rust +#[test] +fn production_shaped_json_runs_through_the_converter() { + let case = support::load_case(fixture("codegen/live-shape-smoke.json")).unwrap(); + assert_eq!(case.schema_version, 1); + let output = support::run_case(&case).unwrap(); + insta::assert_json_snapshot!(case.id, output); +} +``` + +The JSON must be generated by serializing a redacted synthetic `CollectedPayload` accepted by the live contract test, not handwritten against the design document. + +- [ ] **Step 2: Run and confirm the missing loader fails** + +Run: `cargo test -p devup-mcp-devup-ui --test compat_fixtures` + +Expected: compile failure for the support module/types. + +- [ ] **Step 3: Implement the envelope and dispatcher** + +Use `#[serde(deny_unknown_fields)]` on the envelope and request, but preserve unknown node fields through `CollectedPayload`. Validate schema version 1, non-empty unique IDs, source commit format, root existence and operation-required data before invoking production functions. + +```rust +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct FixtureCase { + schema_version: u32, + id: String, + operation: FixtureOperation, + source: FixtureSource, + request: FixtureRequest, + payload: CollectedPayload, +} +``` + +- [ ] **Step 4: Run the test and inspect the first insta snapshot** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures` + +Run: `cargo insta review` + +Expected: exactly one reviewed smoke snapshot whose output is generated by the production converter. + +- [ ] **Step 5: Commit** + +```bash +git add Cargo.toml Cargo.lock crates/devup-mcp-devup-ui/Cargo.toml crates/devup-mcp-devup-ui/tests fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json fixtures/devup-figma-plugin/snapshots +git commit -m "test: add production-shaped json fixtures" +``` + +### Task 2: Manifest, Ledger and One-to-One Corpus Validator + +**Files:** +- Create: `fixtures/devup-figma-plugin/manifest.json` +- Create: `fixtures/devup-figma-plugin/ledger.json` +- Create: `crates/devup-mcp-devup-ui/tests/compat_manifest.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/support/mod.rs` + +**Interfaces:** +- Produces: `FixtureManifest { repository, commit, schema_version, baseline, cases, files }`. +- Produces: `LedgerEntry { test_id, classification, fixture_id, rust_test, rationale }`. +- Produces: `validate_corpus(root) -> Result>`. + +- [ ] **Step 1: Write failing validator tests with deliberately broken temporary corpora** + +Test duplicate case ID, orphan JSON, orphan `.snap`, missing ledger entry, nonexistent fixture reference, missing rationale for `out_of_scope_write`, wrong checksum, wrong baseline counts and unsupported schema version. + +- [ ] **Step 2: Run and confirm validator interfaces are missing** + +Run: `cargo test -p devup-mcp-devup-ui --test compat_manifest` + +Expected: compile failure. + +- [ ] **Step 3: Implement deterministic recursive discovery and checksums** + +Use `std::fs::read_dir` recursively and sort normalized `/`-separated relative paths. Hash exact committed bytes with SHA-256. Require ledger classifications to be one of `rust_snapshot`, `rust_assertion`, `contract`, `out_of_scope_write`, `upstream_runtime_only` and apply the spec's required fields per class. + +```rust +fn validate_corpus(root: &Path) -> Result> { + let discovered = discover_sorted_files(root)?; + let manifest = load_manifest(root.join("manifest.json"))?; + let ledger = load_ledger(root.join("ledger.json"))?; + validate_sets_and_checksums(&discovered, &manifest, &ledger) +} +``` + +- [ ] **Step 4: Seed the pinned baseline inventory** + +Populate manifest evidence with source SHA, 54 test files, 978 passed, 0 failed, 268 snapshots and 1,974 assertions. Populate ledger entries from all pinned upstream test IDs before adding classifications. At this step unclassified entries must intentionally fail with a count of 978, proving the completeness gate is active. + +Run the already-Bun-based source project only for this one-time inventory; this does not add a runtime or CI dependency to `devup-mcp`. + +```powershell +$pluginRepo = 'C:\Users\owjs3\Desktop\projects\devup-figma-plugin' +$junitPath = Join-Path ([System.IO.Path]::GetTempPath()) 'devup-figma-plugin-junit.xml' +Push-Location -LiteralPath $pluginRepo +bun run test +bun test --reporter=junit --reporter-outfile=$junitPath +Pop-Location +[xml]$junit = Get-Content -Raw -LiteralPath $junitPath +$testIds = $junit.SelectNodes('//testcase') | ForEach-Object { "$($_.classname) > $($_.name)" } +$testIds.Count +Remove-Item -LiteralPath $junitPath +``` + +Expected: the source suite remains 978 pass / 0 fail and `$testIds.Count` is 978. Use the expanded IDs, including parameterized names, as the initial ledger set. + +- [ ] **Step 5: Classify only the smoke case and run the validator** + +Run: `cargo test -p devup-mcp-devup-ui --test compat_manifest` + +Expected: failure reports the exact remaining unclassified count and no duplicate IDs. + +- [ ] **Step 6: Commit the validator and baseline inventory** + +```bash +git add fixtures/devup-figma-plugin/manifest.json fixtures/devup-figma-plugin/ledger.json crates/devup-mcp-devup-ui/tests/support/mod.rs crates/devup-mcp-devup-ui/tests/compat_manifest.rs +git commit -m "test: track the complete plugin test corpus" +``` + +### Task 3: Migrate All 268 Existing Golden Snapshots + +**Files:** +- Create: `fixtures/devup-figma-plugin/cases/codegen/*.json` +- Create: `fixtures/devup-figma-plugin/cases/responsive/*.json` +- Create: `fixtures/devup-figma-plugin/snapshots/codegen/*.snap` +- Create: `fixtures/devup-figma-plugin/snapshots/responsive/*.snap` +- Modify: `fixtures/devup-figma-plugin/manifest.json` +- Modify: `fixtures/devup-figma-plugin/ledger.json` + +**Interfaces:** +- Consumes: pinned upstream snapshots: codegen 256, viewport 2, render 3, responsive 3 and root codegen 4. +- Produces: 268 JSON inputs and 268 ID-matched insta golden snapshots. + +- [ ] **Step 1: Migrate the five upstream snapshot files in fixed batches** + +For every snapshot export, locate the originating test/parameter case, normalize its node graph through the finalized `CollectedPayload` serde type, and create one JSON. Use these required batch totals: `codegen.test.ts.snap=256`, `codegen-viewport.test.ts.snap=2`, `render.test.ts.snap=3`, `ResponsiveCodegen.test.ts.snap=3`, `code.test.ts.snap=4`. + +- [ ] **Step 2: Preserve expected strings exactly** + +Convert each upstream snapshot entry into insta metadata plus body. Change only CRLF to LF. Retain whitespace, quote style, import order, JSX formatting and comments. + +- [ ] **Step 3: Run corpus validation before codegen parity** + +Run: `cargo test -p devup-mcp-devup-ui --test compat_manifest` + +Expected: no orphan/checksum errors for the 268 cases; remaining ledger entries may still be unclassified. + +- [ ] **Step 4: Run all migrated cases and keep mismatches failing** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures` + +Expected: failures enumerate unsupported Rust codegen behavior. Do not accept Rust-produced `.snap.new` over imported upstream golden files. + +- [ ] **Step 5: Commit inputs and goldens without claiming parity** + +```bash +git add fixtures/devup-figma-plugin +git commit -m "test: import plugin codegen json goldens" +``` + +### Task 4: Implement Core NodeTree, Props and Rendering Parity + +**Files:** +- Create: `crates/devup-mcp-devup-ui/src/codegen/node_tree.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/render.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/props/mod.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/props/layout.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/props/visual.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/props/typography.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/props/variables.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/mod.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/{layout,style,text}.rs` + +**Interfaces:** +- Produces: `NodeTree { component, props, children, node_type, node_name, is_component, is_slot, condition, text_children, leading_comment }`. +- Produces: `build_tree(payload, root_id, options) -> Result`. +- Produces: `render_tree(tree, depth) -> RenderedNode { jsx, imports, used_tokens, diagnostics }`. + +- [ ] **Step 1: Select the smallest failing core cases** + +Run only JSON IDs for simple Frame, clipped Frame, Auto Layout row/column, free layout, fixed/fill/hug sizing, Text, solid/gradient fill, border/radius, shadow, transform and bound variable. Confirm each fails against the imported upstream golden. + +- [ ] **Step 2: Implement NodeTree construction and deterministic renderer** + +Use `BTreeMap` for deterministic prop/import ordering only where upstream sorts; preserve source child order. Render Box/Flex/Grid/Text/Image, self-closing versus child JSX, multiline indentation, comments, token `$name` values and diagnostic locations exactly as the corresponding goldens specify. + +```rust +pub struct NodeTree { + pub component: String, + pub props: Vec<(String, PropValue)>, + pub children: Vec, + pub node_type: String, + pub node_name: String, + pub condition: Option, + pub text_children: Vec, +} +``` + +- [ ] **Step 3: Implement property modules one behavior at a time** + +For each selected case: run the single snapshot, implement the minimal typed-field rule, rerun, then run the entire core category. Include auto layout/wrap/alignment/gap/padding, constraints/position/sizing/min-max, fills/gradients/image, borders/radii, opacity/blend/effects, transform/overflow, typography/styled segments/ellipsis/text stroke, and bound variables. + +- [ ] **Step 4: Run core compatibility and existing unit tests** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures -- codegen` + +Run: `cargo test -p devup-mcp-devup-ui --test codegen` + +Expected: all core-category goldens pass without snapshot updates. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-devup-ui/src/codegen crates/devup-mcp-devup-ui/tests fixtures/devup-figma-plugin +git commit -m "feat: port core devup figma codegen rules" +``` + +### Task 5: Implement Components, Responsive Behavior and Assets + +**Files:** +- Create: `crates/devup-mcp-devup-ui/src/codegen/components.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/responsive.rs` +- Create: `crates/devup-mcp-devup-ui/src/codegen/assets.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/node_tree.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/render.rs` + +**Interfaces:** +- Produces: component definitions/usages, variant metadata and import metadata. +- Produces: responsive breakpoint arrays and duplicate-collapse rules. +- Produces: asset references `{kind: Svg|Png, path, mask_color, dimensions}`. + +- [ ] **Step 1: Run the component/viewport/asset golden subsets and record exact failures** + +Include component, component set, instance reference/inline, Pure Code, boolean/text/instance-swap/native slots, selectors, reactions/keyframes, viewport variants, non-viewport variants, SVG/PNG, masks, image scale modes and wrapper collapse. + +- [ ] **Step 2: Implement component and slot semantics** + +Resolve `mainComponentId`, default variant IDs and component property definitions from the payload. Implement single native slot as `children`, multiple slots as named `React.ReactNode`, boolean conditions, text bindings and instance-swap placeholders. + +```rust +fn build_instance( + payload: &CollectedPayload, + node: &RawNode, + options: &CodegenOptions, +) -> Result; +``` + +- [ ] **Step 3: Implement responsive merging and asset decisions** + +Match upstream breakpoint boundaries and collapse duplicate responsive values. Preserve token replacement for box/text shadow. Classify assets only using captured node fields; produce explicit diagnostics when required binary/vector data is unavailable. + +- [ ] **Step 4: Run all 268 imported goldens** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures` + +Expected: all 268 imported upstream snapshots pass without accepting Rust-generated replacements. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-devup-ui/src/codegen crates/devup-mcp-devup-ui/tests fixtures/devup-figma-plugin +git commit -m "feat: port component responsive and asset codegen" +``` + +### Task 6: Implement devup.json Variable and Style Parity + +**Files:** +- Create: `crates/devup-mcp-devup-ui/src/theme/aliases.rs` +- Create: `crates/devup-mcp-devup-ui/src/theme/styles.rs` +- Create: `fixtures/devup-figma-plugin/cases/devup-json/*.json` +- Create: `fixtures/devup-figma-plugin/snapshots/devup-json/*.snap` +- Modify: `crates/devup-mcp-devup-ui/src/theme/devup_json.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/tokens.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/mod.rs` +- Modify: `fixtures/devup-figma-plugin/manifest.json` +- Modify: `fixtures/devup-figma-plugin/ledger.json` + +**Interfaces:** +- Produces: cycle-safe alias resolution per collection mode. +- Produces: colors, typography, length and shadow theme projections with breakpoint mapping and treeshaking. + +- [ ] **Step 1: Convert all export-devup read cases to JSON before changing theme code** + +Cover colors, color aliases, modes/themes, FLOAT lengths, breakpoint maps, typography, effect/text shadows, local/library bound variables, treeshaking, missing colors, empty buckets, theme replication and conflict diagnostics. Write current JavaScript expected objects as initial insta JSON snapshots. + +- [ ] **Step 2: Run and confirm current theme projection mismatches** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures -- devup-json` + +Expected: failures for aliases, scope, styles, treeshaking and replication. + +- [ ] **Step 3: Implement alias/style/mode projection** + +Detect alias cycles by variable ID and mode, prefer WEB `codeSyntax`, use deterministic fallback token normalization, preserve original names in diagnostics, filter node/page scope by actual bindings, and never report `full-local-plus-used-remote` unless completeness flags justify it. + +```rust +fn resolve_alias( + variables: &BTreeMap, + variable_id: &str, + mode_id: &str, + visiting: &mut BTreeSet<(String, String)>, +) -> Result; +``` + +- [ ] **Step 4: Run theme compatibility and unit tests** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures -- devup-json` + +Run: `cargo test -p devup-mcp-devup-ui --test theme` + +Expected: all devup-json cases pass without snapshot replacement. + +- [ ] **Step 5: Commit** + +```bash +git add crates/devup-mcp-devup-ui/src/theme crates/devup-mcp-devup-ui/tests fixtures/devup-figma-plugin +git commit -m "feat: port devup json export parity" +``` + +### Task 7: Account for the Remaining 978-Test Ledger + +**Files:** +- Create: additional `fixtures/devup-figma-plugin/cases/{snapshot,errors}/*.json` +- Create: additional `fixtures/devup-figma-plugin/snapshots/{snapshot,errors}/*.snap` +- Modify: `fixtures/devup-figma-plugin/manifest.json` +- Modify: `fixtures/devup-figma-plugin/ledger.json` +- Modify: Rust unit/contract tests referenced by ledger entries. + +**Interfaces:** +- Consumes: every pinned upstream test ID. +- Produces: zero unclassified, duplicate, orphan or unjustified ledger entries. + +- [ ] **Step 1: Process remaining tests by source area** + +Use the pinned 54-file inventory and finish in this order: `src/codegen` 26 files, `src/utils` 13 files, `src/commands` 12 files, root `src/__tests__` 3 files. Conversion/helper inputs become JSON snapshots or Rust assertions. MCP/file boundary behavior maps to contract tests. + +- [ ] **Step 2: Classify intentional non-converter behavior narrowly** + +Only Figma mutation/import tests may use `out_of_scope_write`; link each to the read-only allowlist test. Only plugin bootstrap, iframe/download transport or JavaScript module lifecycle may use `upstream_runtime_only`; require a written rationale and the closest Rust boundary test. Do not classify codegen, variable, style, asset or export semantics out of scope. + +- [ ] **Step 3: Run the completeness gate until it reaches exact baseline counts** + +Run: `cargo test -p devup-mcp-devup-ui --test compat_manifest` + +Expected: 54 source files, 978 ledger IDs, 268 imported upstream snapshots, zero unclassified IDs, zero orphan files and valid checksums. + +- [ ] **Step 4: Run every JSON fixture** + +Run: `cargo insta test -p devup-mcp-devup-ui --test compat_fixtures` + +Expected: all cases pass and `cargo insta pending-snapshots` reports none. + +- [ ] **Step 5: Commit** + +```bash +git add fixtures/devup-figma-plugin crates/devup-mcp-figma/tests crates/devup-mcp-devup-ui/tests crates/devup-mcp/tests +git commit -m "test: complete plugin parity ledger" +``` + +### Task 8: CI, Documentation, Changepack and Full Verification + +**Files:** +- Modify: `.github/workflows/ci.yml` +- Modify: `README.md` +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` + +**Interfaces:** +- Produces: Cargo-only offline fixture CI and documented JSON authoring/review workflow. + +- [ ] **Step 1: Add snapshot CI without JavaScript setup** + +Install `cargo-insta` 1.48.0 in CI and run `cargo insta test --workspace --all-features`. Fail on `.snap.new` files and run the manifest test before the broader suite. + +```yaml +- run: cargo install cargo-insta --version 1.48.0 --locked +- run: cargo test -p devup-mcp-devup-ui --test compat_manifest +- run: cargo insta test --workspace --all-features +``` + +- [ ] **Step 2: Document fixture authoring** + +Document that new fixtures must be serialized from `CollectedPayload`, must use synthetic values, require source provenance, and are reviewed with `cargo insta review`. State that changing snapshots is an output-contract change. + +- [ ] **Step 3: Add the changepack** + +Record minor changes for `devup-mcp-devup-ui` and any public payload-type change in `devup-mcp-figma`. + +- [ ] **Step 4: Run all verification commands** + +Run: `cargo fmt --all -- --check` + +Run: `cargo clippy --workspace --all-targets --all-features -- -D warnings` + +Run: `cargo insta test --workspace --all-features` + +Run: `cargo test --workspace --all-features` + +Run: `cargo build --workspace --release` + +Expected: all exit 0 and there are no pending snapshots. + +- [ ] **Step 5: Verify the project remains Cargo-only and fixtures are synthetic** + +Run: `rg --files -g 'package.json' -g 'bun.lock*' -g 'node_modules/**'` + +Expected: no output. + +Run: `rg -n "85CgSws3o5XsLv7aAwWJyS|3879:35481" fixtures` + +Expected: no output. + +- [ ] **Step 6: Commit** + +```bash +git add .github/workflows/ci.yml README.md .changepacks/changepack_log_figma_remote_mcp.json Cargo.toml Cargo.lock crates/devup-mcp-devup-ui/Cargo.toml +git commit -m "ci: enforce json fixture parity" +``` diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-asset-output-hardening.md b/docs/superpowers/plans/2026-09-01-devup-mcp-asset-output-hardening.md new file mode 100644 index 0000000..d9b188a --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-asset-output-hardening.md @@ -0,0 +1,201 @@ +# Devup MCP Asset and Output Hardening Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Reject mismatched cached asset captures and make every explicit filesystem output confined, staged, and rollback-safe. + +**Architecture:** Preserve `AssetSelection` through handoff, artifact capability validation, manifest lookup, and output mapping instead of reducing it to an ID. Route all writes through a startup-configured `OutputPolicy` and one `OutputTransaction` that validates and stages every output before replacing targets. + +**Tech Stack:** Rust 2024, rmcp 3.1.4, cap-std, Tokio, Serde, existing Devup error model. + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md` + +## Global Constraints + +- Product runtime and default CI remain Cargo-only; no Bun or Node dependency. +- Default allowed write root is the canonical server startup current directory. +- Additional roots are startup-only repeatable `--allow-write-root ` arguments. +- A failed validation, strict gate, parse gate, staging operation, or commit performs no successful new output and restores replaced targets on runtime error. +- Figma remains read-only and no credential, design text, URL, token value, or asset ID enters logs/cache stats. + +## File map + +- `crates/devup-mcp/src/server/artifacts.rs`: internal captured-asset capability and public redacted summary. +- `crates/devup-mcp/src/server/handoff.rs`: preserve exact requested captures across continuation. +- `crates/devup-mcp/src/server/output.rs`: confined path resolution and staged transaction. +- `crates/devup-mcp/src/server/tools.rs`: unchanged public asset request shape. +- `crates/devup-mcp/src/server/mod.rs`: validate capture tuples and commit one output transaction. +- `crates/devup-mcp/src/lib.rs`: construct server with `ServerConfig`. +- `crates/devup-mcp/src/main.rs`: parse `--allow-write-root` and `--version` without accepting unknown arguments. +- `crates/devup-mcp/tests/artifact_cache.rs`: redacted capability and exact reuse tests. +- `crates/devup-mcp/tests/composite_export.rs`: URL/artifact capture tuple integration tests. +- `crates/devup-mcp/tests/output_policy.rs`: traversal, symlink/junction, atomic replacement and rollback tests. +- `crates/devup-mcp/tests/cli.rs`: CLI root parsing tests. +- `README.md`: write confinement and exact asset reuse contract. + +--- + +### Task 1: Preserve exact asset captures + +**Files:** +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Test: `crates/devup-mcp/tests/artifact_cache.rs` +- Test: `crates/devup-mcp/tests/composite_export.rs` + +**Interfaces:** +- Consumes: `devup_mcp_figma::AssetSelection` and `AssetManifestEntry`. +- Produces: `ArtifactCapabilities::supports_assets(&[AssetSelection]) -> Result<(), DevupError>` and `PendingOperation::Export { asset_captures: Vec, ... }`. + +- [ ] **Step 1: Write failing artifact capability tests** + +Add tests that build a design artifact captured with `AssetSelection { asset_id: "hero", format: Png, scale: 1 }`. Assert PNG 1x succeeds and SVG 1x, PNG 2x, and an unknown ID each return `DEVUP_FIGMA_HANDOFF_INVALID`. Serialize `artifact_metadata` and assert it contains `assetCaptureCount: 1` but not `hero`. + +- [ ] **Step 2: Run the focused tests and confirm the ID-only implementation fails** + +Run: `cargo test -p devup-mcp --test artifact_cache asset_capability -- --nocapture` + +Expected: FAIL because `ArtifactCapabilities` has no captured tuple and the serialized summary cannot report the count. + +- [ ] **Step 3: Add internal/public capability types** + +Implement an internal capability with `asset_captures: Vec` sorted by `(asset_id, format, scale)`. Give it a manually serialized/public `ArtifactCapabilitySummary { kind, collection_scope, resource_scope, asset_capture_count }`; do not serialize the capture vector. Implement exact set containment in `supports_assets` and use the existing handoff-invalid error code with only requested/captured counts in details. + +- [ ] **Step 4: Preserve captures through PendingOperation** + +Replace `asset_ids` with `asset_captures`. Keep the existing duplicate-ID public validation. During manifest validation, require an `Exported` entry whose `asset_id`, `format == Some(request.format)`, and `scale == Some(request.scale)` all match. Treat exported entries missing format/scale as incompatible instead of defaulting them. + +- [ ] **Step 5: Run asset tests** + +Run: `cargo test -p devup-mcp --test artifact_cache --test composite_export asset -- --nocapture` + +Expected: PASS, including zero upstream calls and zero writes for every incompatible artifact reuse case. + +- [ ] **Step 6: Commit** + +```text +git add crates/devup-mcp/src/server/artifacts.rs crates/devup-mcp/src/server/handoff.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/artifact_cache.rs crates/devup-mcp/tests/composite_export.rs +git commit -m "fix: validate exact figma asset captures" +``` + +### Task 2: Add confined output policy + +**Files:** +- Modify: `Cargo.toml` +- Modify: `crates/devup-mcp/Cargo.toml` +- Create: `crates/devup-mcp/src/server/output.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Test: `crates/devup-mcp/tests/output_policy.rs` + +**Interfaces:** +- Produces: `OutputPolicy::from_roots(Vec) -> Result`, `OutputPolicy::resolve(&str) -> Result`, `OutputTransaction::stage(OutputTarget, &[u8])`, and `OutputTransaction::commit() -> Result, DevupError>`. + +- [ ] **Step 1: Write failing path resolution tests** + +Use a temporary directory as the only root. Assert `component.tsx` and an absolute child succeed. Assert empty paths, the root directory itself, `../escape.tsx`, sibling absolute paths, duplicate normalized targets, and Windows drive/UNC/alternate-data-stream paths fail. On platforms that permit symlink/junction creation, create a link inside the root pointing outside and assert resolution fails before a file is created. + +- [ ] **Step 2: Run and confirm the module is missing** + +Run: `cargo test -p devup-mcp --test output_policy resolves_only_inside_preopened_roots -- --nocapture` + +Expected: FAIL because `server::output::OutputPolicy` does not exist. + +- [ ] **Step 3: Implement capability-relative resolution** + +Add `cap-std` to workspace and crate dependencies. Open each canonical root once with ambient authority at server construction, but resolve all request paths relative to the resulting `cap_std::fs::Dir`. Reject lexical parent components and platform prefixes before traversal; use capability metadata/open operations to prevent symlink or junction escape. Return a display path assembled from the trusted canonical root and normalized relative components. + +- [ ] **Step 4: Run path tests** + +Run: `cargo test -p devup-mcp --test output_policy resolves_only_inside_preopened_roots -- --nocapture` + +Expected: PASS with no file outside the temporary root. + +- [ ] **Step 5: Commit** + +```text +git add Cargo.toml Cargo.lock crates/devup-mcp/Cargo.toml crates/devup-mcp/src/server/output.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/output_policy.rs +git commit -m "feat: confine devup output paths" +``` + +### Task 3: Stage and rollback multi-output writes + +**Files:** +- Modify: `crates/devup-mcp/src/server/output.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Test: `crates/devup-mcp/tests/output_policy.rs` +- Test: `crates/devup-mcp/tests/composite_export.rs` + +**Interfaces:** +- Consumes: validated `OutputTarget` values. +- Produces: a transaction that stages named text/binary outputs and publishes paths only after complete commit. + +- [ ] **Step 1: Add transaction fault tests** + +Create two existing files with known bytes. Inject failures after temp write, after first backup, and after first target replacement through a test-only `OutputFs` fault point. Assert both original files are restored, result contains no output paths, and no `.devup-tmp-*` or `.devup-bak-*` remains after normal error handling. Assert two successful replacements return canonical display paths and exact bytes. + +- [ ] **Step 2: Run and confirm direct writes fail rollback assertions** + +Run: `cargo test -p devup-mcp --test output_policy transaction -- --nocapture` + +Expected: FAIL because the existing implementation writes each file immediately. + +- [ ] **Step 3: Implement staged commit** + +Create exclusive random temp files in each target directory, write and `sync_all`, move existing targets to exclusive backups, rename all temps, then remove backups. On runtime error, reverse completed replacements and restore backups. Keep crash recovery scoped to internal names created by this process and never delete arbitrary matching user paths. + +- [ ] **Step 4: Integrate one transaction into export** + +Build all text and decoded binary entries only after capability/quality validation. Resolve every path before staging any bytes. Commit once, then set manifest `outputPath`, remove returned asset base64, and publish `outputPaths`. Delete `write_output` and `write_binary_output`. + +- [ ] **Step 5: Run output and export tests** + +Run: `cargo test -p devup-mcp --test output_policy --test composite_export -- --nocapture` + +Expected: PASS; strict/capability/base64/path failure creates or modifies zero target files. + +- [ ] **Step 6: Commit** + +```text +git add crates/devup-mcp/src/server/output.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/output_policy.rs crates/devup-mcp/tests/composite_export.rs +git commit -m "feat: commit devup outputs transactionally" +``` + +### Task 4: Wire startup root configuration and document migration + +**Files:** +- Modify: `crates/devup-mcp/src/main.rs` +- Modify: `crates/devup-mcp/src/lib.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/cli.rs` +- Modify: `README.md` + +**Interfaces:** +- Produces: `ServerConfig { allowed_write_roots: Vec }`, `run_stdio_with_config(ServerConfig)`, and CLI parsing for `--allow-write-root`. + +- [ ] **Step 1: Add CLI tests** + +Assert `--version` still prints only the version; no arguments selects current directory; repeated `--allow-write-root A --allow-write-root B` preserves order; missing values, unknown flags, and non-directory roots fail before stdio starts. + +- [ ] **Step 2: Run CLI tests** + +Run: `cargo test -p devup-mcp --test cli -- --nocapture` + +Expected: FAIL for the new flag. + +- [ ] **Step 3: Implement config wiring** + +Parse arguments into `ServerConfig`, construct `OutputPolicy` once, store it in `DevupServer`, and retain `DevupServer::default()` for tests by using canonical current directory. Do not allow a tool request to add a root. + +- [ ] **Step 4: Update README and run verification** + +Document exact asset reuse, current-directory default, the repeated CLI flag, runtime rollback and crash-atomic limitation. Run `cargo fmt --all -- --check`, `cargo clippy -p devup-mcp --all-targets --all-features -- -D warnings`, and `cargo test -p devup-mcp --all-features`. + +Expected: all commands exit 0. + +- [ ] **Step 5: Commit** + +```text +git add crates/devup-mcp/src/main.rs crates/devup-mcp/src/lib.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/cli.rs README.md +git commit -m "docs: secure devup output configuration" +``` diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-fidelity-visual-modules.md b/docs/superpowers/plans/2026-09-01-devup-mcp-fidelity-visual-modules.md new file mode 100644 index 0000000..46140e6 --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-fidelity-visual-modules.md @@ -0,0 +1,272 @@ +# Devup MCP Fidelity, Visual, and Module Boundaries Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Prevent syntactically invalid or semantically untraceable TSX, provide deterministic Rust image comparison, and leave the MCP server split into focused modules. + +**Architecture:** Replace diagnostic-code whitelists with typed fidelity impact, parse every generated TSX in Rust, and validate AST/source-map coverage through a projection trace. Add a Figma-independent image comparator crate and a consumer renderer contract, then finish moving orchestration responsibilities out of the router. + +**Tech Stack:** Rust 2024, MSRV 1.88, oxc_parser compatible with MSRV, image decoding/encoding crate, Serde, insta, existing source-map types. + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md` + +## Global Constraints + +- No JavaScript runtime or browser is a product/default-test dependency. +- Every returned/published/written TSX parses as TypeScript JSX first. +- Unknown codegen warning/error diagnostics cannot silently produce `projection=exact`. +- Browser pixel fidelity is opt-in through a consumer-owned renderer; the server never executes arbitrary commands. +- Existing 268 plugin golden outputs remain reviewed and WQUW-151 typography/token/text assertions remain exact. + +## File map + +- `crates/devup-mcp-figma/src/snapshot.rs`: additive `FidelityImpact` on Diagnostic. +- `crates/devup-mcp-devup-ui/src/validation.rs`: TSX parse and semantic coverage validation. +- `crates/devup-mcp-devup-ui/src/provenance.rs`: `ProjectionTrace` and `FidelityReport`. +- `crates/devup-mcp-devup-ui/src/codegen/*`: populate trace and typed impacts. +- `crates/devup-mcp/src/server/quality.rs`: aggregate typed impacts. +- `crates/devup-mcp/src/server/projection.rs`: projection orchestration and validation gate. +- `crates/devup-mcp/src/server/validation.rs`: artifact/output strict validation. +- `crates/devup-mcp/src/server/delivery.rs`: delivery only. +- `crates/devup-mcp/src/server/mod.rs`: router/wiring only. +- `crates/devup-mcp-visual/`: pure Rust PNG comparator library/CLI. +- `crates/devup-mcp-devup-ui/tests/validation.rs`: syntax and semantic coverage. +- `crates/devup-mcp-visual/tests/compare.rs`: deterministic image fixtures. +- `docs/visual-renderer-contract.md`: consumer adapter schema and command sequence. + +--- + +### Task 1: Replace diagnostic string matching with fidelity impact + +**Files:** +- Modify: `crates/devup-mcp-figma/src/snapshot.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/devup_json.rs` +- Modify: `crates/devup-mcp/src/server/quality.rs` +- Modify: `crates/devup-mcp/tests/composite_export.rs` + +**Interfaces:** +- Produces: `FidelityImpact::{None, Approximated, Lossy, Failed}` and `Diagnostic::fidelity_impact()`. + +- [ ] **Step 1: Write failing quality matrix tests** + +Assert absolute fallback maps to approximated, mask/effect to lossy, projection failure to failed, and info to none. Create an unknown codegen warning and error and assert they map to at least approximated and failed. Assert collector warning remains governed by acquisition, and `includeDiagnostics=false` does not change quality. + +- [ ] **Step 2: Run quality tests** + +Run: `cargo test -p devup-mcp --test composite_export quality -- --nocapture` + +Expected: FAIL because quality matches three code strings. + +- [ ] **Step 3: Add typed impact and fallback registry** + +Add optional serialized `fidelityImpact`. Set it at every codegen diagnostic producer. Implement a domain-aware legacy registry for deserialized diagnostics without the field; codegen warning defaults to approximated and codegen error to failed, while collector diagnostics do not change projection quality. + +- [ ] **Step 4: Aggregate by maximum impact and test** + +Replace code string matching in `projection_quality`. Run `cargo test -p devup-mcp --test composite_export quality -- --nocapture` and `cargo test -p devup-mcp-devup-ui --all-features`. + +Expected: PASS. + +- [ ] **Step 5: Commit** + +```text +git add crates/devup-mcp-figma/src/snapshot.rs crates/devup-mcp-devup-ui/src/codegen/component.rs crates/devup-mcp-devup-ui/src/theme/devup_json.rs crates/devup-mcp/src/server/quality.rs crates/devup-mcp/tests/composite_export.rs +git commit -m "fix: classify projection fidelity structurally" +``` + +### Task 2: Parse every generated TSX in Rust + +**Files:** +- Modify: `Cargo.toml` +- Modify: `crates/devup-mcp-devup-ui/Cargo.toml` +- Create: `crates/devup-mcp-devup-ui/src/validation.rs` +- Modify: `crates/devup-mcp-devup-ui/src/lib.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Create: `crates/devup-mcp-devup-ui/tests/validation.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/compat_fixtures.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs` + +**Interfaces:** +- Produces: `validate_tsx(source: &str) -> Result` and a parse gate in every public generator. + +- [ ] **Step 1: Select and pin the parser version** + +Use `cargo info oxc_parser` and its Cargo metadata to select the newest release whose `rust-version` is at most 1.88. Add the exact compatible version to workspace dependencies so a later incompatible MSRV update is explicit. + +- [ ] **Step 2: Write failing syntax tests** + +Assert valid nested DevupUI TSX parses. Assert unclosed tags, malformed attribute quotes and invalid expression children return codegen projection failure with byte ranges but without logging the surrounding Korean text. + +- [ ] **Step 3: Run the missing validator test** + +Run: `cargo test -p devup-mcp-devup-ui --test validation syntax -- --nocapture` + +Expected: FAIL because `validate_tsx` does not exist. + +- [ ] **Step 4: Implement parser gate** + +Parse with TypeScript+JSX source type, collect all parser errors, return a content-redacted error containing byte ranges and parser categories, and call the validator before `CodegenOutput` leaves each component/component-set path. + +- [ ] **Step 5: Parse the entire fixture corpus** + +Extend compatibility and WQUW tests to call `validate_tsx` for every one of the 268 snapshot cases and all ten WQUW frames. Run `cargo test -p devup-mcp-devup-ui --all-features` and `cargo insta test -p devup-mcp-devup-ui --all-features --check`. + +Expected: PASS with no unreviewed snapshots. + +- [ ] **Step 6: Commit** + +```text +git add Cargo.toml Cargo.lock crates/devup-mcp-devup-ui/Cargo.toml crates/devup-mcp-devup-ui/src/validation.rs crates/devup-mcp-devup-ui/src/lib.rs crates/devup-mcp-devup-ui/src/codegen/component.rs crates/devup-mcp-devup-ui/tests/validation.rs crates/devup-mcp-devup-ui/tests/compat_fixtures.rs crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs +git commit -m "feat: validate generated devup tsx syntax" +``` + +### Task 3: Produce and enforce semantic fidelity reports + +**Files:** +- Modify: `crates/devup-mcp-devup-ui/src/provenance.rs` +- Modify: `crates/devup-mcp-devup-ui/src/validation.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/text.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/style.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/layout.rs` +- Modify: `crates/devup-mcp/src/server/quality.rs` +- Modify: `crates/devup-mcp/tests/composite_export.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/provenance.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/wquw_151.rs` + +**Interfaces:** +- Produces: `ProjectionTrace`, `FidelityCoverage`, `FidelityReport`, and `validate_fidelity(&Snapshot, &CodegenOutput)`. + +- [ ] **Step 1: Write failing provenance coverage tests** + +Build fixtures for visible emitted nodes, intentional flattening, ignored hidden nodes, styled text segments, token/style bindings, resolved fallback, image placeholder and absolute-layout fallback. Assert every source item receives exactly one trace disposition and coverage percentages/impact counts are deterministic. Remove one trace entry and assert strict validation fails. + +- [ ] **Step 2: Run provenance tests** + +Run: `cargo test -p devup-mcp-devup-ui --test provenance fidelity -- --nocapture` + +Expected: FAIL because source maps do not contain complete disposition/coverage data. + +- [ ] **Step 3: Populate ProjectionTrace during generation** + +Record node disposition, text segment ranges/order, variable/style/asset provenance and layout mapping kind while fragments are emitted. Keep trace separate from TSX so golden runtime output remains unchanged. + +- [ ] **Step 4: Validate AST and trace** + +Use parsed TSX spans plus trace/source map to compute node, text, token, typography, asset and layout coverage. Require visible items to be emitted, flattened, or ignored-with-reason exactly once. Return `FidelityReport` in export metadata without source text/token values. + +- [ ] **Step 5: Integrate strict gate and WQUW assertions** + +Require syntax success, 100% requested coverage, failed=0 and lossy=0 for strict export. Assert WQUW nested `[1. 이름]`, all typography styles/tokens and footer stroke have direct trace entries. + +- [ ] **Step 6: Run tests and commit** + +Run: `cargo test -p devup-mcp-devup-ui --test provenance --test wquw_151 -- --nocapture` and `cargo test -p devup-mcp --test composite_export strict -- --nocapture`. + +Expected: PASS. + +```text +git add crates/devup-mcp-devup-ui/src/provenance.rs crates/devup-mcp-devup-ui/src/validation.rs crates/devup-mcp-devup-ui/src/codegen crates/devup-mcp/src/server/quality.rs crates/devup-mcp/tests/composite_export.rs crates/devup-mcp-devup-ui/tests/provenance.rs crates/devup-mcp-devup-ui/tests/wquw_151.rs +git commit -m "feat: report devup projection fidelity" +``` + +### Task 4: Add pure Rust visual comparator and adapter contract + +**Files:** +- Modify: `Cargo.toml` +- Create: `crates/devup-mcp-visual/Cargo.toml` +- Create: `crates/devup-mcp-visual/src/lib.rs` +- Create: `crates/devup-mcp-visual/src/main.rs` +- Create: `crates/devup-mcp-visual/tests/compare.rs` +- Create: `crates/devup-mcp-visual/tests/fixtures/exact-reference.png` +- Create: `crates/devup-mcp-visual/tests/fixtures/changed-actual.png` +- Create: `docs/visual-renderer-contract.md` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/composite_export.rs` + +**Interfaces:** +- Produces: `compare_png(reference, actual, CompareOptions) -> VisualReport`, CLI `devup-mcp-visual compare`, and Figma `referencePng` output through existing screenshot acquisition. + +- [ ] **Step 1: Write failing comparator tests** + +Generate tiny deterministic PNG fixtures in the test setup using the image crate. Assert exact images report zero changed pixels, a known changed rectangle reports exact count/ratio and a diff PNG, dimension mismatch reports invalid dimensions, and anti-aliased one-channel differences under configured tolerance are ignored. + +- [ ] **Step 2: Run the missing-crate test** + +Run: `cargo test -p devup-mcp-visual --test compare -- --nocapture` + +Expected: FAIL because the crate is not a workspace member. + +- [ ] **Step 3: Implement comparator library and CLI** + +Decode to normalized RGBA8, compare dimensions, calculate per-channel absolute delta and changed-pixel ratio, render opaque diff pixels, serialize a content-free `VisualReport`, and exit nonzero when dimensions differ or ratio exceeds the requested threshold. Default threshold is 0.5% and is always included in the report. + +- [ ] **Step 4: Expose reference screenshot output** + +Add `referencePng` as an explicit export output. Acquire it through the existing read-only screenshot request only when selected, deliver it via Resource/output transaction, and exclude bytes from cache keys/logs. It does not make server strict depend on pixel comparison. + +- [ ] **Step 5: Document consumer renderer contract** + +Specify JSON fields for TSX/resource manifest, viewport, theme, asset directory, output PNG, renderer/version, DevupUI version and font manifest. Provide exact consumer sequence: export resources, build/type-check in consumer, render at viewport, write PNG, invoke `devup-mcp-visual compare`, and reject `environment-invalid` metadata before treating metrics as pass. + +- [ ] **Step 6: Run tests and commit** + +Run: `cargo test -p devup-mcp-visual --all-features`, `cargo test -p devup-mcp --test composite_export reference_png -- --nocapture`, and `cargo build -p devup-mcp-visual --release`. + +Expected: PASS without Bun/Node. + +```text +git add Cargo.toml Cargo.lock crates/devup-mcp-visual docs/visual-renderer-contract.md crates/devup-mcp/src/server/tools.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/composite_export.rs +git commit -m "feat: compare figma visual references in rust" +``` + +### Task 5: Complete server module boundaries and final verification + +**Files:** +- Create: `crates/devup-mcp/src/server/projection.rs` +- Create: `crates/devup-mcp/src/server/validation.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `README.md` +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` + +**Interfaces:** +- `mod.rs` retains tool router, `ServerHandler`, shared state construction and delegates all behavior. + +- [ ] **Step 1: Add module boundary checks** + +Move projection and validation tests with their implementation modules. Add a source-level test that `server/mod.rs` contains no direct `std::fs` call, no TSX/theme generator call and no resource URI parser, while public tool names and schemas remain unchanged. + +- [ ] **Step 2: Move orchestration without behavior changes** + +Move TSX/theme/source-map/asset-manifest generation into `projection.rs`; move artifact capability, quality, syntax, fidelity and strict decisions into `validation.rs`; leave delivery/output/acquisition in their named modules. Keep `mod.rs` as routing/wiring and retain existing error JSON shapes. + +- [ ] **Step 3: Update docs and changepack** + +Document fidelity fields, syntax gate, reference screenshot, comparator CLI, adapter limitation and server module ownership. Extend the existing minor changepack summary without adding a second conflicting version entry. + +- [ ] **Step 4: Run complete verification** + +Run: + +```text +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace --all-features +cargo insta test --workspace --all-features --check +cargo build --workspace --release +``` + +Expected: all commands exit 0, 268/268 plugin goldens and all WQUW-151 fixtures pass, and no pending snapshots exist. + +- [ ] **Step 5: Commit** + +```text +git add crates/devup-mcp/src/server README.md .changepacks/changepack_log_figma_remote_mcp.json +git commit -m "refactor: separate devup mcp server boundaries" +``` + +- [ ] **Step 6: Push, update PR and reinstall Codex MCP** + +Push `owjs3901/figma-remote-mcp`, update PR #1 with Korean test/security/limitation details, build the release binary, update the existing Codex MCP command to the new binary path without embedding secrets, restart/reconnect it, and run `tools/list` plus a read-only fixture smoke. Record final commit SHA, PR URL and installed binary version. diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-figma-correctness-and-reuse.md b/docs/superpowers/plans/2026-09-01-devup-mcp-figma-correctness-and-reuse.md new file mode 100644 index 0000000..0ce391a --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-figma-correctness-and-reuse.md @@ -0,0 +1,704 @@ +# devup-mcp Figma Correctness and Reuse Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Make Figma acquisition auditable and reusable, resolve theme conflicts deterministically without aborting useful output, export Section-contained screens, preserve provenance and large values, and reduce the pinned plugin ledger to zero `not_ported` entries. + +**Architecture:** Keep the existing three-crate workspace. `devup-mcp-figma` owns raw acquisition, graph/resource completeness, large-value transport and target classification; `devup-mcp-devup-ui` owns deterministic TSX/theme projection and source spans; `devup-mcp` owns bounded in-memory artifacts, composite export and public MCP compatibility wrappers. + +**Tech Stack:** Rust 2024, rmcp, Tokio, Serde/serde_json, SHA-256, cargo-insta, compiled read-only Figma Plugin API scripts. + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-figma-correctness-and-reuse-design.md` + +## Global Constraints + +- Apply strict red-green-refactor. No production behavior changes before a test has failed for the intended reason. +- Keep the public product/install name `devup-mcp`; do not add an IR/auth/cache/server crate. +- Never accept arbitrary JavaScript or add a Figma write tool. +- Do not persist credentials, live snapshots, screenshots or cache entries by default. +- Preserve existing MCP tool inputs and outputs additively unless a bug requires a status correction. +- Keep the 268 imported golden snapshots unchanged unless the approved output contract explicitly requires a reviewed change. +- Every new diagnostic and stat must avoid design text, credential values and Figma account information. +- Each task ends with focused tests and a focused commit. + +## Task 1: Add Graph Completeness and Structured Diagnostics + +**Files:** + +- Modify: `crates/devup-mcp-figma/src/snapshot.rs` +- Modify: `crates/devup-mcp-figma/src/payload.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Modify: `crates/devup-mcp-figma/tests/snapshot.rs` +- Modify: `crates/devup-mcp-figma/tests/payload_contract.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/downstream_integration.rs` + +### Step 1: Write the graph-audit RED tests + +Add literal snapshots covering: + +- a root whose declared child is absent; +- a child with a conflicting in-scope `parentId`; +- an orphan node unreachable from every root; +- a valid hidden child and expanded instance child; +- an observed `childCount` that differs from `childrenIds`; +- a `$truncated` value and a field error. + +Assert a wished-for `Snapshot::audit()` result containing explicit graph/field states and literal counts. The production mutation caught is “missing children or truncated fields are treated as complete.” + +Run: + +```text +cargo test -p devup-mcp-figma --test snapshot audit -- --nocapture +``` + +Expected RED: the audit API/type does not exist. + +### Step 2: Implement the minimal audit types and traversal + +Add serializable types equivalent to: + +```rust +pub enum CompletenessState { Complete, Partial, Failed } + +pub struct SnapshotAudit { + pub state: CompletenessState, + pub root_count: usize, + pub preserved_node_count: usize, + pub reachable_node_count: usize, + pub orphan_node_ids: Vec, + pub declared_child_count: usize, + pub exported_child_count: usize, + pub missing_children: Vec, + pub parent_mismatches: Vec, + pub truncated_fields: Vec, + pub field_error_count: usize, +} +``` + +Traverse roots in declared child order. A missing requested root is failed; missing descendants, count mismatches, field errors and truncation are partial. Hidden children remain reachable. + +### Step 3: Verify GREEN and add payload aggregation RED + +Run the focused snapshot tests, then add payload tests asserting graph audit and unresolved-resource state combine into one `CompletenessReport`. + +Run: + +```text +cargo test -p devup-mcp-figma --test snapshot audit -- --nocapture +cargo test -p devup-mcp-figma --test payload_contract completeness -- --nocapture +``` + +Expected: snapshot tests pass; payload test first fails because report aggregation is absent. + +### Step 4: Implement payload completeness and public status + +Replace the coarse payload completeness derivation with an additive report containing graph, fields and resources. Keep the legacy enum for compatibility but derive it from the report. + +In `complete_operation`, return: + +- `status: "complete"` only when the report is complete; +- `status: "partial"` for usable degraded output; +- the complete report under `completenessReport`. + +Do not reject partial output yet; strict behavior belongs to the composite export task. + +### Step 5: Verify and commit + +Run: + +```text +cargo test -p devup-mcp-figma --test snapshot +cargo test -p devup-mcp-figma --test payload_contract +cargo test -p devup-mcp --test downstream_integration +cargo test -p devup-mcp --test source_orchestration +``` + +Commit: + +```text +feat(figma): audit snapshot completeness +``` + +## Task 2: Make Theme Projection Deterministic, Non-Fatal and Scope-Aware + +**Files:** + +- Modify: `crates/devup-mcp-devup-ui/src/theme/devup_json.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/tokens.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/mod.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/theme.rs` +- Create: `crates/devup-mcp-devup-ui/tests/fixtures/theme-conflicts.json` +- Modify: `crates/devup-mcp-figma/src/resources.rs` +- Modify: `crates/devup-mcp-figma/src/payload.rs` + +### Step 1: Write deterministic conflict RED tests + +Construct two snapshots with identical variables in reversed input order. Use literal local/remote candidates that normalize to the same token but have different mode values. + +Assert: + +- byte-identical `devup.json` for both orders; +- explicit WEB syntax wins over normalized name; +- local wins over used remote when both are otherwise equal; +- the losing candidates appear in `conflicts` diagnostics; +- serialization still succeeds and no `DEVUP_THEME_CONFLICT` error is returned. + +Run: + +```text +cargo test -p devup-mcp-devup-ui --test theme conflict -- --nocapture +``` + +Expected RED: current HashMap iteration changes the winner or conflict metadata is absent. + +### Step 2: Implement sorted candidates and conflict records + +Replace `HashMap::values()` projection with stable candidate vectors sorted by: + +1. explicit WEB syntax; +2. local before remote; +3. collection name; +4. variable name; +5. variable ID. + +Deduplicate equal values. Emit one winner into the existing devup.json schema and return all non-equal candidates as structured conflict metadata. Reserve `DevupThemeConflict` for unrecoverable output serialization/schema errors only. + +### Step 3: Write alias fallback and scope RED tests + +Add tests for: + +- an alias cycle alongside independent valid tokens; +- a missing collection alongside valid tokens; +- node scope excluding an unused local variable; +- page scope retaining used alias dependencies; +- file scope retaining all available local variables and used remote variables; +- raw resolved color/length fallback without invented token names. + +The production mutations caught are “one bad resource aborts all theme output” and “scope argument is ignored.” + +### Step 4: Implement explicit source and usage sets + +Extend resource data enough to retain local/remote origin and binding occurrences. Change `generate_devup_json` to accept a projection context containing scope and used resource IDs instead of ignoring `_scope`. + +Resolve aliases per `(variable_id, mode_id)` and keep valid independent branches. Missing/cyclic candidates add diagnostics and unresolved records, never remove unrelated output. + +### Step 5: Verify snapshots and commit + +Run: + +```text +cargo test -p devup-mcp-devup-ui --test theme +cargo test -p devup-mcp-devup-ui --test compat_fixtures +cargo test -p devup-mcp-devup-ui --test wquw_151 +cargo insta pending-snapshots +``` + +Commit: + +```text +fix(theme): resolve conflicts without aborting export +``` + +## Task 3: Introduce Reusable Acquisition Artifacts and Composite Export + +**Files:** + +- Create: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/lib.rs` +- Create: `crates/devup-mcp/tests/artifact_cache.rs` +- Create: `crates/devup-mcp/tests/composite_export.rs` +- Modify: `crates/devup-mcp/tests/stdio_tools.rs` +- Modify: `crates/devup-mcp/tests/source_orchestration.rs` + +### Step 1: Write bounded-cache RED tests + +Test a real in-memory store API using deterministic fake time and literal payloads. Assert: + +- the same request key reuses one artifact; +- expired entries miss; +- `refresh` bypasses an entry; +- LRU eviction respects item and aggregate byte limits; +- concurrent same-key insertions use one acquisition result; +- credential-like input fields do not appear in serialized stats or keys. + +Run: + +```text +cargo test -p devup-mcp --test artifact_cache -- --nocapture +``` + +Expected RED: artifact store module/API is absent. + +### Step 2: Implement the minimal memory-only ArtifactStore + +Use Tokio synchronization and standard collections; avoid a new dependency unless profiling proves necessary. Store an `Arc` plus safe metadata. Generate opaque random artifact IDs and a SHA-256 content hash from canonical payload bytes. + +Enforce TTL, per-entry bytes, aggregate bytes and entry count. Do not write to disk. + +### Step 3: Write composite export RED tests + +Add a test upstream that returns a production-shaped fast envelope. Invoke the wished-for `devup_figma_export` with outputs `tsx`, `devupJson`, `rawSnapshot` and `sourceMap`. + +Assert: + +- one acquisition call; +- both TSX and used-token devup.json come from the same payload; +- a returned `artifactId` can produce a second projection with zero new calls; +- `strict: true` rejects a partial completeness report; +- `refresh: true` makes one new call; +- compatibility wrappers still work. + +### Step 4: Implement composite export and compatibility wrappers + +Add public input fields equivalent to: + +```text +url | artifactId +outputs[] +scope +rootLayout +strict +refresh +outputPath(s) +sourcePolicy +``` + +Keep `devup_figma_to_ui` and `devup_figma_to_json` registered. Route both through shared artifact acquisition/projection code. + +Return safe collection stats including `cacheHit`, `artifactId`, timestamps and actual tool-call counts. + +### Step 5: Verify and commit + +Run: + +```text +cargo test -p devup-mcp --test artifact_cache +cargo test -p devup-mcp --test composite_export +cargo test -p devup-mcp --test source_orchestration +cargo test -p devup-mcp --test stdio_tools +``` + +Commit: + +```text +feat(server): reuse figma acquisitions across exports +``` + +## Task 4: Add One-Call Full Theme Fast Path + +**Files:** + +- Create: `crates/devup-mcp-figma/src/scripts/fast_theme.js` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/envelope.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Modify: `crates/devup-mcp-figma/tests/collector.rs` +- Modify: `crates/devup-mcp-figma/tests/envelope.rs` +- Modify: `crates/devup-mcp/tests/live_figma_contract.rs` + +### Step 1: Write read-only script contract RED tests + +Assert the new built-in script: + +- calls only async local collection/variable/style read APIs; +- emits the same versioned PNG envelope integrity fields as node fast snapshot; +- records local/remote source, mode and code syntax; +- never reads user JS, private data or mutation APIs. + +Expected RED: `FastTheme` script kind does not exist. + +### Step 2: Implement fast theme script and decoder + +Collect file-local theme data in one `use_figma` execution and encode bounded chunks. Reuse envelope CRC/hash/schema checks. Decode directly to the production resource snapshot contract. + +### Step 3: Write collector atomic-fallback RED tests + +Assert a variables-only file request: + +- completes in one call on valid fast theme output; +- discards the entire fast result and restarts catalog/batch legacy collection on corruption or size overflow; +- reports `transport`, `fallbackUsed`, reason and cumulative call count correctly. + +### Step 4: Implement collector branch and verify + +Add fast-theme eligibility only for file-scope theme acquisition. Preserve the existing legacy 89-call-capable path for oversized or changed contracts. + +Run: + +```text +cargo test -p devup-mcp-figma --test upstream_contract fast_theme +cargo test -p devup-mcp-figma --test envelope theme +cargo test -p devup-mcp-figma --test collector theme +cargo test -p devup-mcp --test source_orchestration +``` + +Commit: + +```text +perf(figma): collect full theme in one fast call +``` + +## Task 5: Classify Section Targets and Export Multiple Frames + +**Files:** + +- Modify: `crates/devup-mcp-figma/src/explore.rs` +- Modify: `crates/devup-mcp-figma/src/snapshot.rs` +- Modify: `crates/devup-mcp-figma/src/scripts/explore.js` +- Modify: `crates/devup-mcp-figma/tests/explore.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/figma_explore.rs` +- Create: `crates/devup-mcp/tests/section_export.rs` +- Modify: `crates/devup-mcp/tests/fixtures/wquw-151-neighborhood.json` + +### Step 1: Write target-classification RED tests + +Using a literal Section with nested frames, assert classifications for file/page/section/screen/component/other and verify candidates preserve visual order, visibility, bounds, breadcrumb, child count and canonical URL. + +Expected RED: target kind and full candidate metadata are absent. + +### Step 2: Implement additive classification + +Add `TargetKind` and candidate fields without changing existing search/explore fields. Exact screen links remain a one-candidate result. Section links return direct/nested screen candidates without treating annotations as screens. + +### Step 3: Write multi-frame export RED tests + +Assert: + +- a Section URL without selection returns `selection_required`, not a giant Section TSX; +- `frameIds` exports exactly those frames in requested order; +- `allScreens` exports all classified screen candidates in visual order; +- invalid/out-of-section IDs fail safely; +- shared Section acquisition is reused where the artifact contains each selected subtree. + +### Step 4: Implement section export orchestration + +Extend composite export selection with `frameIds` and `allScreens`. Name generated components deterministically and report a per-frame completeness/source map result. + +### Step 5: Verify and commit + +Run: + +```text +cargo test -p devup-mcp-figma --test explore +cargo test -p devup-mcp --test figma_explore +cargo test -p devup-mcp --test section_export +``` + +Commit: + +```text +feat(figma): export screens from section links +``` + +## Task 6: Generate TSX and Theme Provenance Sidecars + +**Files:** + +- Modify: `crates/devup-mcp-devup-ui/src/codegen/mod.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/style.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/text.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/devup_json.rs` +- Create: `crates/devup-mcp-devup-ui/src/provenance.rs` +- Modify: `crates/devup-mcp-devup-ui/src/lib.rs` +- Create: `crates/devup-mcp-devup-ui/tests/provenance.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/wquw_151.rs` +- Create: `crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap` + +### Step 1: Write source-range RED tests + +For a small hand-checked frame, assert literal TSX byte ranges map to the expected node ID, input field and variable/style ID. Assert root/component/text/prop entries and fallback kinds. + +The mutation caught is “generated code changes but provenance silently points to the wrong node/property.” + +Expected RED: codegen output has no source map. + +### Step 2: Implement fragment spans + +Have rendered fragments carry local provenance before concatenation. The final renderer adjusts UTF-8 byte offsets as imports, component wrapper and indentation are assembled. Do not inject debug props/comments into TSX. + +### Step 3: Add theme JSON pointer provenance + +Write a failing test mapping `/theme/colors/default/primary` and typography entries to variable/style IDs and resolution/fallback kinds. Implement provenance next to deterministic theme insertion. + +### Step 4: Verify WQUW source map and commit + +Snapshot the WQUW source map without embedding text content. Assert representative heading, nested placeholder typography and footer border map back to exact Figma nodes/resources. + +Run: + +```text +cargo test -p devup-mcp-devup-ui --test provenance +cargo test -p devup-mcp-devup-ui --test wquw_151 +cargo insta pending-snapshots +``` + +Commit: + +```text +feat(devup-ui): trace generated output to figma sources +``` + +## Task 7: Preserve Large Fields and Export Requested Assets + +**Files:** + +- Modify: `crates/devup-mcp-figma/src/snapshot.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/scripts/snapshot.js` +- Modify: `crates/devup-mcp-figma/src/scripts/fast_snapshot.js` +- Create: `crates/devup-mcp-figma/src/scripts/large_value.js` +- Create: `crates/devup-mcp-figma/src/scripts/assets.js` +- Create: `crates/devup-mcp-figma/src/assets.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Create: `crates/devup-mcp-figma/tests/large_values.rs` +- Create: `crates/devup-mcp-figma/tests/assets.rs` +- Modify: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` + +### Step 1: Write large-value descriptor/reassembly RED tests + +Assert an inline-overflow field creates a descriptor with node ID, field, byte length, hash and cursor; multiple out-of-order/duplicate/missing fragments are respectively reassembled or rejected. Use a literal large value and hand-computed expected hash. + +Expected RED: descriptor and reassembly APIs are absent. + +### Step 2: Implement bounded continuation + +Replace size-only terminal truncation for readable fields with a descriptor. Add a compiled script that reads only the named descriptor field and byte range. Validate file/version/node/field/hash before replacing the marker. + +Keep upstream getter errors as explicit `unsupported-by-upstream`; do not loop on them. + +### Step 3: Write asset manifest/export RED tests + +Use production-shaped image/vector nodes. Assert manifest entries include source node, field, image hash/export settings and requested format. Assert only explicit requested assets execute read-only export; failures preserve layout output and add diagnostics. + +### Step 4: Implement safe asset output + +Add `assetManifest` projection and optional bounded output-path export. Validate paths with the same output safety rules, avoid implicit repository writes and never include binary bytes in diagnostics/stats. + +### Step 5: Verify and commit + +Run: + +```text +cargo test -p devup-mcp-figma --test large_values +cargo test -p devup-mcp-figma --test assets +cargo test -p devup-mcp-figma --test upstream_contract +cargo test -p devup-mcp --test composite_export +``` + +Commit: + +```text +feat(figma): preserve large fields and requested assets +``` + +## Task 8: Complete WQUW-151 Section and Ten-Frame Regression Coverage + +**Files:** + +- Create: `crates/devup-mcp/tests/fixtures/wquw-151-section.json` +- Create: `crates/devup-mcp-devup-ui/tests/fixtures/wquw-151-frames/` +- Create: `crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs` +- Create: `crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__*.snap` +- Modify: `crates/devup-mcp/tests/live_figma_contract.rs` +- Modify: `README.md` + +### Step 1: Capture/validate actual read-only shapes + +Use the authenticated official host MCP flow. Do not print or persist credentials. Record only approved design payload fields and scrub user/account metadata before committing. + +Verify the Section is `4217:7743`, contains the expected ten screen candidates, and that the proofread target remains `3879:35518` unless live Figma evidence shows a versioned change. + +### Step 2: Write failing Section/frame contract tests + +Before changing production code for any newly observed field, add literal fixture assertions for node counts, full child reachability, text segment preservation, variable/style IDs, frame order and diagnostic state. + +### Step 3: Add per-frame TSX snapshots + +Generate standalone and embedded snapshots as relevant. Review differences against the actual Devup plugin copy result. Any intentional transformation must be documented by node/property and reason. + +### Step 4: Add opt-in live call-count contract + +Assert: + +- exact proofread composite export: one normal host call; +- repeated projection by artifact ID: zero additional calls; +- Section exploration and selected exports report truthful counts; +- fast full-theme path uses one call when under the bound. + +### Step 5: Verify and commit + +Run: + +```text +cargo test -p devup-mcp --test section_export +cargo test -p devup-mcp-devup-ui --test wquw_151 +cargo test -p devup-mcp-devup-ui --test wquw_151_frames +cargo insta pending-snapshots +``` + +Commit: + +```text +test: cover all wquw 151 figma screens +``` + +## Task 9: Reduce the Plugin Corpus Ledger to Zero `not_ported` + +**Files:** + +- Modify: `fixtures/devup-figma-plugin/ledger.json` +- Modify: `fixtures/devup-figma-plugin/manifest.json` only if fixture files change +- Create/Modify: `fixtures/devup-figma-plugin/cases/{codegen,responsive,devup-json,snapshot,errors}/*.json` +- Create/Modify: `fixtures/devup-figma-plugin/snapshots/{codegen,responsive,devup-json,snapshot,errors}/*.snap` +- Modify: `crates/devup-mcp-devup-ui/tests/compat_fixtures.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/compat_manifest.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/support/mod.rs` +- Modify: focused production files only when a newly ported test first fails +- Modify: `fixtures/devup-figma-plugin/README.md` + +### Step 1: Add the zero-not-ported RED gate + +Change the manifest test to require zero `not_ported` classifications. Print only IDs/categories, not fixture contents. + +Run: + +```text +cargo test -p devup-mcp-devup-ui --test compat_manifest coverage_registry -- --nocapture +``` + +Expected RED: exactly 137 entries remain. + +### Step 2: Classify and port in focused batches + +Process the 137 IDs by source file and behavior: + +1. codegen/layout/style/text/variant; +2. variable/theme/export-devup; +3. snapshot/serialization/error paths; +4. search/plugin boundary helpers. + +For each behavior, add a production-shaped JSON case or focused Rust assertion, run it RED, then implement the smallest production change. Do not relabel read/transform semantics as runtime-only to satisfy the count. + +Only genuine plugin bootstrap/module lifecycle can become `upstream_runtime_only`, and each such entry must cite a concrete Rust boundary test. Mutation remains `out_of_scope_write` and cites the read-only allowlist test. + +### Step 3: Recompute manifest hashes only after reviewed changes + +Use the existing Rust support utilities or a repository script that canonicalizes LF. Do not hand-edit checksums. Review all snapshot diffs before acceptance. + +### Step 4: Verify exact inventory and commit + +Run: + +```text +cargo test -p devup-mcp-devup-ui --test compat_manifest +cargo test -p devup-mcp-devup-ui --test compat_fixtures +cargo insta pending-snapshots +``` + +Expected: 978 ledger IDs, 268 or more reviewed fixture cases, zero orphan files, zero `not_ported`. + +Commit in behavior-focused batches, ending with: + +```text +test: complete devup figma plugin parity ledger +``` + +## Task 10: Final Verification, Release Metadata, Installation and PR Update + +**Files:** + +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` +- Modify: `README.md` +- Modify: `.github/workflows/ci.yml` only if local commands are not represented +- Modify: `Cargo.lock` only if dependencies changed + +### Step 1: Run formatting and static checks + +Run: + +```text +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +``` + +Expected: both exit 0 with no warnings. + +### Step 2: Run all deterministic tests and snapshot checks + +Run: + +```text +cargo test --workspace +cargo insta pending-snapshots +cargo build --workspace --release +``` + +Expected: all tests pass, no pending snapshots, release build succeeds. + +### Step 3: Run authenticated read-only live contracts + +Using the official host MCP result path without reading or printing its token, run the WQUW-151 exact-node, Section and full-theme probes. Record only counts, hashes, transport, fallback and call totals. + +If live access requires a human browser action, request only that action and resume from the same handoff session. + +### Step 4: Security/privacy audit + +Check tracked changes for: + +- tokens, OAuth codes, verifier, registration secrets; +- account/user identifiers; +- `.env` or keyring material; +- unapproved live screenshots or raw payloads; +- binary envelope/debug dumps; +- arbitrary JavaScript or write-tool additions. + +Confirm cache is memory-only and diagnostics/stats do not contain design text. + +### Step 5: Update changepack and documentation + +Document: + +- exact-node and full-theme fast call expectations; +- cache freshness and `refresh` semantics; +- complete/partial/failed meanings; +- Section selection/batch export; +- source map and asset behavior; +- direct OAuth catalog limitation and host fallback; +- zero-not-ported corpus status and exact test counts. + +### Step 6: Install the release binary into Codex + +Build the release binary, locate the configured Codex MCP command, replace only the devup-mcp executable/configured path, and verify `devup-mcp --version` plus MCP tool listing. Do not modify unrelated Codex servers. + +### Step 7: Commit, push and update PR #1 + +Run final `git status`, review every changed file, create the final focused documentation/release commit, then push `owjs3901/figma-remote-mcp`. + +Update PR #1 with: + +- requirement and architecture summary; +- file/feature groups; +- exact local command outcomes; +- live Figma counts and call totals; +- commit SHAs; +- privacy/security review; +- intentional Figma-to-TSX differences; +- assumptions and remaining upstream constraints. + +Do not describe disabled/cost-paused CI as an implementation failure; report remote CI state separately from local verification. + +## Execution Checkpoints + +After Tasks 1–2, re-run the WQUW proofread snapshot before proceeding to cache changes. After Tasks 3–5, validate the public MCP schema and one-call assertions. After Tasks 6–9, run the complete parity and snapshot suite before release work. Never continue from a red checkpoint by weakening a completeness or security assertion. diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-output-correctness.md b/docs/superpowers/plans/2026-09-01-devup-mcp-output-correctness.md new file mode 100644 index 0000000..6c900fd --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-output-correctness.md @@ -0,0 +1,206 @@ +# Devup MCP Output Correctness Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make DevupUI TSX, theme output, completion status, strict mode, and artifact reuse share one truthful correctness contract. + +**Architecture:** Keep the existing three-crate workspace. Canonical token naming and attribute serialization stay inside `devup-mcp-devup-ui`; output-quality orchestration stays in a focused server module; artifact capabilities travel with the existing in-memory cache entry. + +**Tech Stack:** Rust 1.88, serde/schemars, rmcp 3.1, Tokio, cargo test, insta fixtures + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-output-correctness-design.md` + +## Global Constraints + +- The runtime remains pure Rust; no Bun or Node runtime dependency is introduced. +- Figma access remains read-only and no design content is added to logs or metadata. +- Existing public fields remain compatible; new quality and capability fields are additive. +- Each production behavior is preceded by a failing test and verified independently. +- Section multi-root acquisition, MCP resources, safe filesystem roots, and visual diffing are not part of this increment. + +--- + +### Task 1: Canonical Token Identity and JSX Attribute Escaping + +**Files:** +- Modify: `crates/devup-mcp-devup-ui/src/theme/tokens.rs` +- Modify: `crates/devup-mcp-devup-ui/src/theme/mod.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/component.rs` +- Modify: `crates/devup-mcp-devup-ui/src/codegen/text.rs` +- Test: `crates/devup-mcp-devup-ui/tests/codegen.rs` +- Test: `crates/devup-mcp/tests/downstream_integration.rs` + +**Interfaces:** +- Consumes: Figma variable `name` and optional `codeSyntax.WEB` from `UpstreamResult`. +- Produces: crate-visible `normalize_token`, `variable_token`, and `render_static_attribute(name, value) -> String` used by all static TSX prop emission. + +- [ ] **Step 1: Write a failing token integration test** + +Extend `converts_a_figma_link_to_structured_devup_ui` to assert that a bound variable named `Color/Primary` with `codeSyntax.WEB = "primary"` emits `bg="$primary"` and never `$colorPrimary`. + +- [ ] **Step 2: Run the token test and verify RED** + +Run: `cargo test -p devup-mcp --test downstream_integration converts_a_figma_link_to_structured_devup_ui -- --exact` + +Expected: FAIL because current codegen emits `$colorPrimary`. + +- [ ] **Step 3: Implement shared token resolution** + +Expose the existing theme normalization functions crate-wide and change `named_tokens` so variables call `variable_token(name, codeSyntax.WEB)` while styles call `normalize_token(name)`. + +- [ ] **Step 4: Run the token test and verify GREEN** + +Run the exact command from Step 2; expected PASS. + +- [ ] **Step 5: Write a failing JSX attribute escaping test** + +Add `escapes_static_jsx_attribute_values` using a TEXT node whose font family is `A&B\"Font` and assert `fontFamily="A&B"Font<UI>"`. + +- [ ] **Step 6: Run the escaping test and verify RED** + +Run: `cargo test -p devup-mcp-devup-ui --test codegen escapes_static_jsx_attribute_values -- --exact` + +Expected: FAIL because current component and styled-segment renderers interpolate raw values. + +- [ ] **Step 7: Implement the central static attribute renderer** + +Add one renderer in `component.rs`, use it from `render_props`, and call it from the nested text segment renderer. Preserve attribute ordering and quoted output. + +- [ ] **Step 8: Run focused and crate tests** + +Run: `cargo test -p devup-mcp-devup-ui --test codegen && cargo test -p devup-mcp --test downstream_integration` + +Expected: PASS with no warnings. + +- [ ] **Step 9: Commit Task 1** + +Commit message: `fix: unify figma tokens and escape tsx props` + +### Task 2: Output-Aware Quality and Strict Semantics + +**Files:** +- Create: `crates/devup-mcp/src/server/quality.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Test: `crates/devup-mcp/tests/composite_export.rs` +- Test: `crates/devup-mcp/tests/figma_explore.rs` +- Test: `crates/devup-mcp/tests/downstream_integration.rs` + +**Interfaces:** +- Consumes: `PayloadCompletenessReport`, codegen diagnostics, theme conflicts/unresolved values, requested asset results. +- Produces: serializable `OutputQuality`, per-axis enums, `status()`, and `strict_violation()`. + +- [ ] **Step 1: Write failing quality tests** + +Add assertions that a simple UI result contains exact/complete quality axes, an intentionally shallow Explore result has top-level `status = "complete"` and `acquisition = "expected-projection"`, and strict TSX export rejects a mask/effect fallback even with a complete snapshot. + +- [ ] **Step 2: Run focused tests and verify RED** + +Run: `cargo test -p devup-mcp --test downstream_integration --test figma_explore --test composite_export` + +Expected: FAIL because `quality` does not exist, Explore is partial, and strict ignores projection diagnostics. + +- [ ] **Step 3: Implement quality types and classification** + +Create `quality.rs` with operation-relative acquisition classification, diagnostic-code projection classification, theme and asset classification, top-level status derivation, and strict validation. + +- [ ] **Step 4: Integrate quality into every completed operation** + +Compute diagnostics regardless of `includeDiagnostics`, attach `quality`, derive `status` after requested outputs are projected, and move strict validation after projection. Preserve `selection_required` and `needs_figma` workflow results. + +- [ ] **Step 5: Run focused tests and verify GREEN** + +Run the exact command from Step 2; expected PASS. + +- [ ] **Step 6: Commit Task 2** + +Commit message: `fix: report output-aware figma quality` + +### Task 3: Artifact Capability Validation + +**Files:** +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Test: `crates/devup-mcp/tests/artifact_cache.rs` +- Test: `crates/devup-mcp/tests/composite_export.rs` + +**Interfaces:** +- Consumes: `CollectionRequest`, requested outputs, requested theme scope. +- Produces: `ArtifactCapabilities { kind, collection_scope, resource_scope }` on every `ArtifactLookup` and `validate_artifact_projection(...)` before reuse. + +- [ ] **Step 1: Write failing cache capability test** + +Assert that inserted design, theme-only, search, and explore requests return the expected non-sensitive capability metadata. + +- [ ] **Step 2: Run the cache test and verify RED** + +Run: `cargo test -p devup-mcp --test artifact_cache artifact_lookup_preserves_capture_capabilities -- --exact` + +Expected: compilation failure because artifact capabilities do not exist. + +- [ ] **Step 3: Implement immutable artifact capabilities** + +Derive capabilities from `ArtifactRequestKey`, store them in cache entries, propagate them through hits and singleflight results, and expose them in artifact metadata. + +- [ ] **Step 4: Write failing incompatible reuse tests** + +Acquire a node design artifact and assert that reusing it for file-scoped `devupJson` fails; assert that compatible embedded TSX reuse remains zero-call. + +- [ ] **Step 5: Run reuse tests and verify RED** + +Run: `cargo test -p devup-mcp --test composite_export` + +Expected: the incompatible file-theme request currently succeeds or projects incomplete data. + +- [ ] **Step 6: Implement projection compatibility validation** + +Validate capture kind, collection scope, and resource scope before `complete_operation`. Return `DEVUP_FIGMA_HANDOFF_INVALID` with capability enum details only. + +- [ ] **Step 7: Run artifact tests and verify GREEN** + +Run: `cargo test -p devup-mcp --test artifact_cache --test composite_export` + +Expected: PASS and compatible reuse still performs zero upstream calls. + +- [ ] **Step 8: Commit Task 3** + +Commit message: `fix: validate cached figma artifact capabilities` + +### Task 4: Documentation and Full Verification + +**Files:** +- Modify: `README.md` +- Modify: `docs/superpowers/specs/2026-09-01-devup-mcp-output-correctness-design.md` only if implementation names differ while preserving the approved behavior. + +**Interfaces:** +- Consumes: finalized public quality and artifact capability JSON fields. +- Produces: user-facing contract examples and verified release binary. + +- [ ] **Step 1: Document the additive response contract** + +Add concise README examples for `quality`, strict rejection, canonical variable token naming, and artifact reuse restrictions without publishing real Figma content. + +- [ ] **Step 2: Run formatting and lint verification** + +Run: `cargo fmt --all -- --check` and `cargo clippy --workspace --all-targets --all-features -- -D warnings`. + +Expected: both exit 0 with no warnings. + +- [ ] **Step 3: Run complete test and snapshot verification** + +Run: `cargo test --workspace --all-features` and `cargo insta test --workspace --all-features --check`. + +Expected: all default tests pass, the two stdin live tests remain ignored, and no unreviewed snapshot changes exist. + +- [ ] **Step 4: Build the release binary** + +Run: `cargo build --workspace --release`. + +Expected: exit 0. + +- [ ] **Step 5: Commit Task 4** + +Commit message: `docs: describe figma output quality guarantees` + +- [ ] **Step 6: Review, push, and update the existing pull request** + +Inspect the focused diff and commit list, push `owjs3901/figma-remote-mcp`, and update PR #1 with the new correctness guarantees and exact verification commands. diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-resource-delivery.md b/docs/superpowers/plans/2026-09-01-devup-mcp-resource-delivery.md new file mode 100644 index 0000000..68882b9 --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-resource-delivery.md @@ -0,0 +1,185 @@ +# Devup MCP Resource Delivery Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Deliver large generated text and binary through bounded standard MCP Resources without changing small inline results. + +**Architecture:** Attach projected output blobs to the acquisition artifact entry, expose manifest/chunk URIs through rmcp resources, and select inline/resource delivery through a deterministic policy. Publish resources only after projection, strict validation and optional filesystem transaction all succeed. + +**Tech Stack:** Rust 2024, rmcp 3.1.4 Resources API, Serde, SHA-256, base64, bounded in-memory LRU/TTL artifact store. + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md` + +## Global Constraints + +- `delivery` is `auto`, `inline`, or `resource`; default `auto` inlines each output up to 256 KiB and all outputs up to 1 MiB. +- Each resource raw chunk is at most 256 KiB. +- URI paths contain only random/opaque IDs and output names, never Figma file/node/asset IDs or design names. +- Attached output resources expire and evict atomically with their acquisition artifact. +- Small auto responses preserve existing inline output fields. + +## File map + +- `crates/devup-mcp/src/server/delivery.rs`: delivery enum, thresholds, output staging and response assembly. +- `crates/devup-mcp/src/server/resources.rs`: URI parsing, resource manifest/chunk model, list/read handlers. +- `crates/devup-mcp/src/server/artifacts.rs`: attached resource storage, byte accounting and projection-option cache. +- `crates/devup-mcp/src/server/tools.rs`: `delivery` input. +- `crates/devup-mcp/src/server/mod.rs`: resource capability and handler wiring. +- `crates/devup-mcp/tests/resource_delivery.rs`: boundary, hash, TTL/LRU and protocol tests. +- `crates/devup-mcp/tests/stdio_tools.rs`: advertised capabilities and end-to-end Resource Link tests. +- `README.md`: client examples. + +--- + +### Task 1: Model delivery and attached resource blobs + +**Files:** +- Create: `crates/devup-mcp/src/server/delivery.rs` +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Create: `crates/devup-mcp/tests/resource_delivery.rs` + +**Interfaces:** +- Produces: `DeliveryMode::{Auto, Inline, Resource}`, `ProjectedOutput`, `AttachedOutput`, `ArtifactStore::attach_outputs`, and `ArtifactStore::read_output_chunk`. + +- [ ] **Step 1: Write failing delivery boundary tests** + +Assert auto inlines an output of exactly 256 KiB, resources one byte above, and resources otherwise-small outputs when aggregate size exceeds 1 MiB. Assert explicit inline above the hard response limit errors and explicit resource always attaches. Verify serialization accepts only `auto`, `inline`, and `resource`. + +- [ ] **Step 2: Write failing store tests** + +Attach text and binary outputs, assert acquisition content hash is unchanged, output hashes match bytes, raw chunks never exceed 256 KiB, encoded bytes count toward store limits, and artifact eviction/expiry removes all attached output reads. + +- [ ] **Step 3: Run focused tests** + +Run: `cargo test -p devup-mcp --test resource_delivery model store -- --nocapture` + +Expected: FAIL because delivery/attached output types do not exist. + +- [ ] **Step 4: Implement model and store** + +Parse delivery with Serde-backed enum defaults. Stage `ProjectedOutput { name, mime_type, bytes, is_binary }`, compute SHA-256, split into fixed raw chunks, generate independent random output/capture IDs, and attach all outputs under a projection option hash while holding the artifact store lock. Include output raw/encoded allocation in LRU limits without changing acquisition content hash. + +- [ ] **Step 5: Run tests and commit** + +Run: `cargo test -p devup-mcp --test resource_delivery model store -- --nocapture` + +Expected: PASS. + +```text +git add crates/devup-mcp/src/server/delivery.rs crates/devup-mcp/src/server/tools.rs crates/devup-mcp/src/server/artifacts.rs crates/devup-mcp/tests/resource_delivery.rs +git commit -m "feat: store bounded devup output resources" +``` + +### Task 2: Implement MCP manifest and chunk resources + +**Files:** +- Create: `crates/devup-mcp/src/server/resources.rs` +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/resource_delivery.rs` +- Modify: `crates/devup-mcp/tests/stdio_tools.rs` + +**Interfaces:** +- Produces: `ResourceAddress::parse`, paginated manifest listing, template listing, and `ServerHandler::{list_resources,list_resource_templates,read_resource}`. + +- [ ] **Step 1: Add resource protocol tests** + +Initialize the server and assert tools plus resources are advertised while subscribe/list-changed are absent. Attach an output and assert `resources/list` returns only its top-level manifest with cursor pagination, templates describe output/asset manifest/chunk URIs, manifest read returns MIME/size/hash/chunk count/expiry, and every chunk round-trips to the original bytes. + +- [ ] **Step 2: Add negative protocol tests** + +Assert malformed URI, unknown artifact/output, invalid chunk index, modified opaque ID, expired artifact and evicted artifact return MCP resource-not-found without leaking whether a Figma ID exists. + +- [ ] **Step 3: Run and confirm capability/handlers are missing** + +Run: `cargo test -p devup-mcp --test resource_delivery protocol --test stdio_tools resource -- --nocapture` + +Expected: FAIL because the server advertises tools only. + +- [ ] **Step 4: Implement resources module and handlers** + +Parse only the documented `devup://artifact/...` URI grammar. Generate `Resource`, `ResourceTemplate`, `ReadResourceResult`, text `ResourceContents`, and blob `ResourceContents` through rmcp 3.1.4. Use bounded pagination and list manifests only. Map every missing/expired component to the same resource-not-found error. + +- [ ] **Step 5: Advertise resource capability** + +Change `get_info` to `ServerCapabilities::builder().enable_resources().enable_tools().build()` without subscribe/list-changed. Route reads to the artifact store and touch artifact LRU on a successful read. + +- [ ] **Step 6: Run tests and commit** + +Run: `cargo test -p devup-mcp --test resource_delivery --test stdio_tools -- --nocapture` + +Expected: PASS. + +```text +git add crates/devup-mcp/src/server/resources.rs crates/devup-mcp/src/server/artifacts.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/resource_delivery.rs crates/devup-mcp/tests/stdio_tools.rs +git commit -m "feat: expose devup artifacts as mcp resources" +``` + +### Task 3: Integrate auto/resource delivery with export and outputPath + +**Files:** +- Modify: `crates/devup-mcp/src/server/delivery.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/composite_export.rs` +- Modify: `crates/devup-mcp/tests/resource_delivery.rs` + +**Interfaces:** +- Consumes: validated projected outputs and committed output transaction hashes. +- Produces: inline fields or Resource Links plus manifest metadata. + +- [ ] **Step 1: Add export delivery tests** + +Generate small TSX/JSON and assert default auto preserves current fields. Generate large raw snapshot/text and assert auto omits duplicated content, returns Resource Links, and reading chunks reconstructs exact output. Assert resource mode works for small content, inline hard-limit error writes/publishes nothing, and `outputPath + resource` produces identical SHA-256 values. + +- [ ] **Step 2: Run focused tests** + +Run: `cargo test -p devup-mcp --test composite_export delivery --test resource_delivery export -- --nocapture` + +Expected: FAIL because export ignores delivery. + +- [ ] **Step 3: Thread delivery through handoff and projection** + +Preserve `DeliveryMode` in every pending export/wrapper. Convert TSX, devup JSON, raw snapshot, source map, manifest and asset bytes into `ProjectedOutput` values. Run capability/quality/syntax checks, stage filesystem transaction, decide delivery, commit files, then attach resources and build response. If any step fails, publish neither files nor resources. + +- [ ] **Step 4: Cache projection outputs** + +Hash component name, outputs, root layout, scope, selected roots, diagnostics flag and asset captures into a projection key. Reuse attached outputs for the same key without codegen or upstream calls. Do not reuse output paths as part of resource identity. + +- [ ] **Step 5: Run integration tests and commit** + +Run: `cargo test -p devup-mcp --test composite_export --test resource_delivery -- --nocapture` + +Expected: PASS and existing small-response assertions remain unchanged. + +```text +git add crates/devup-mcp/src/server/delivery.rs crates/devup-mcp/src/server/handoff.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/composite_export.rs crates/devup-mcp/tests/resource_delivery.rs +git commit -m "feat: deliver large figma outputs as resources" +``` + +### Task 4: Document and verify Resource delivery + +**Files:** +- Modify: `README.md` +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` + +**Interfaces:** +- Documents: `delivery`, thresholds, URI lifetime, outputPath interaction and privacy. + +- [ ] **Step 1: Update documentation and changepack** + +Add JSON examples for auto/resource/inline, describe 256 KiB/1 MiB thresholds, TTL/LRU expiry, manifest/chunk reads, and explicit inline rejection. Add a minor changepack entry for resource delivery and secure output behavior using the existing changepack schema. + +- [ ] **Step 2: Run focused and workspace checks** + +Run: `cargo fmt --all -- --check`, `cargo clippy -p devup-mcp --all-targets --all-features -- -D warnings`, `cargo test -p devup-mcp --all-features`, and `cargo build -p devup-mcp --release`. + +Expected: all commands exit 0. + +- [ ] **Step 3: Commit** + +```text +git add README.md .changepacks/changepack_log_figma_remote_mcp.json +git commit -m "docs: describe mcp resource delivery" +``` diff --git a/docs/superpowers/plans/2026-09-01-devup-mcp-section-multi-root.md b/docs/superpowers/plans/2026-09-01-devup-mcp-section-multi-root.md new file mode 100644 index 0000000..f8ed114 --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-devup-mcp-section-multi-root.md @@ -0,0 +1,193 @@ +# Devup MCP Section Multi-Root Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Discover Section screens without collecting their full fields, then acquire selected Frames in deterministic bounded multi-root batches. + +**Architecture:** Add a compact `SectionIndex` acquisition kind and a multi-root collector state machine. Store selected roots as a composite artifact with version-checked resource deduplication, while retaining the existing single-node and already-collected full Section paths. + +**Tech Stack:** Rust 2024, existing compiled-in Figma scripts, official Figma MCP handoff/direct sources, Serde, Tokio. + +**Spec:** `docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md` + +## Global Constraints + +- Discovery returns only bounded candidate metadata; selected root acquisition preserves every accessible field using the existing exhaustive serializer. +- Exact Frame requests retain the existing normal single-call path. +- Batches are deterministic in visual order, default maximum concurrency is 2, and version drift never produces a complete artifact. +- Figma scripts remain compiled-in, read-only, input-validated, and never accept user JavaScript. +- WQUW-151 Section `4217:7743` and its ten checked-in Frame fixtures remain the live/golden contract. + +## File map + +- `crates/devup-mcp-figma/src/section.rs`: SectionIndex, candidate estimate, visual ordering, batch plan, composite merge. +- `crates/devup-mcp-figma/src/upstream.rs`: upstream request variants for section index and multi-root snapshot. +- `crates/devup-mcp-figma/src/collector.rs`: multi-root continuation state and compiled scripts. +- `crates/devup-mcp-figma/src/payload.rs`: single/composite payload types and completeness aggregation. +- `crates/devup-mcp-figma/src/lib.rs`: exports. +- `crates/devup-mcp/src/server/acquisition.rs`: URL/artifact workflow planner. +- `crates/devup-mcp/src/server/artifacts.rs`: section-index/composite cache key and payload. +- `crates/devup-mcp/src/server/handoff.rs`: pending index and batch operations. +- `crates/devup-mcp/src/server/mod.rs`: route to acquisition planner and existing projection. +- `crates/devup-mcp-figma/tests/section.rs`: ordering, packing, merge and drift unit contracts. +- `crates/devup-mcp/tests/section_export.rs`: MCP workflow and WQUW fixture integration. + +--- + +### Task 1: Model and test SectionIndex + +**Files:** +- Create: `crates/devup-mcp-figma/src/section.rs` +- Modify: `crates/devup-mcp-figma/src/lib.rs` +- Create: `crates/devup-mcp-figma/tests/section.rs` + +**Interfaces:** +- Produces: `SectionIndex`, `SectionCandidate`, `build_section_index(&Snapshot, &FigmaTarget)`, and `plan_batches(&SectionIndex, &[String], BatchLimits)`. + +- [ ] **Step 1: Write failing index tests** + +Build a fixture with hidden nodes, notes, three screen-like Frames at different x/y positions, and nested non-screen Frames. Assert candidates contain ID/name/type/visible/bounds/breadcrumb/direct child count/subtree count/estimated bytes/reasons/canonical URL and are sorted by y row then x. Assert only requested valid IDs are selected, duplicates and foreign IDs fail, and `allScreens` returns visual order. + +- [ ] **Step 2: Run the missing-module test** + +Run: `cargo test -p devup-mcp-figma --test section index -- --nocapture` + +Expected: FAIL because `section` and `SectionIndex` do not exist. + +- [ ] **Step 3: Implement compact indexing and batch packing** + +Reuse screen classification rules from `explore.rs`, but emit a dedicated schema. Count descendants and estimate serialized bytes without cloning full descendant fields into the index. Implement first-fit-in-order packing constrained by maximum estimated bytes and nodes; a single oversized root forms its own continuation-capable batch. + +- [ ] **Step 4: Run index tests** + +Run: `cargo test -p devup-mcp-figma --test section index batch -- --nocapture` + +Expected: PASS with stable candidate and batch order. + +- [ ] **Step 5: Commit** + +```text +git add crates/devup-mcp-figma/src/section.rs crates/devup-mcp-figma/src/lib.rs crates/devup-mcp-figma/tests/section.rs +git commit -m "feat: index figma section screens" +``` + +### Task 2: Collect multiple roots with bounded continuation + +**Files:** +- Modify: `crates/devup-mcp-figma/src/upstream.rs` +- Modify: `crates/devup-mcp-figma/src/collector.rs` +- Modify: `crates/devup-mcp-figma/src/section.rs` +- Test: `crates/devup-mcp-figma/tests/collector.rs` +- Test: `crates/devup-mcp-figma/tests/upstream_contract.rs` +- Test: `crates/devup-mcp-figma/tests/section.rs` + +**Interfaces:** +- Produces: `CollectionRequest::section_index`, `CollectionRequest::multi_root`, `MultiRootCollectorSession`, and `CompositePayload::merge`. + +- [ ] **Step 1: Add compiled-script contract tests** + +Assert section-index script requests only fixed read-only APIs, embeds IDs as JSON literals, emits schema/version/root counts, and excludes descendant `fields`. Assert multi-root script accepts only validated IDs, emits root-delimited chunks, stops before the response budget, and returns completed root IDs plus continuation. + +- [ ] **Step 2: Add merge/drift tests** + +Feed chunks with shared byte-identical resources and assert one merged resource. Feed a duplicate node/resource ID with different canonical bytes, missing chunk, repeated chunk, file-key mismatch, and source-version mismatch; assert each result is partial/failed and never cacheable complete. + +- [ ] **Step 3: Run focused tests** + +Run: `cargo test -p devup-mcp-figma --test collector --test upstream_contract --test section multi_root -- --nocapture` + +Expected: FAIL because the new request/session/merge types are absent. + +- [ ] **Step 4: Implement collector session** + +Add index and multi-root upstream request variants and allowlist entries. Execute planned batches with at most two outstanding calls. Resume only an unfinished oversized root; preserve completed roots. Merge roots in index visual order, dedupe resources by ID plus canonical hash, and compute root-level and aggregate completeness. + +- [ ] **Step 5: Run collector tests** + +Run: `cargo test -p devup-mcp-figma --test collector --test upstream_contract --test section -- --nocapture` + +Expected: PASS and existing exact-node single-call tests remain unchanged. + +- [ ] **Step 6: Commit** + +```text +git add crates/devup-mcp-figma/src/upstream.rs crates/devup-mcp-figma/src/collector.rs crates/devup-mcp-figma/src/section.rs crates/devup-mcp-figma/src/payload.rs crates/devup-mcp-figma/tests/collector.rs crates/devup-mcp-figma/tests/upstream_contract.rs crates/devup-mcp-figma/tests/section.rs +git commit -m "feat: collect figma roots in bounded batches" +``` + +### Task 3: Add index-first MCP orchestration and composite artifact reuse + +**Files:** +- Create: `crates/devup-mcp/src/server/acquisition.rs` +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/handoff.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/tests/section_export.rs` +- Modify: `crates/devup-mcp/tests/artifact_cache.rs` + +**Interfaces:** +- Produces: `AcquisitionPlan::{Single, SectionIndex, SectionRoots}`, `ArtifactKind::SectionIndex`, and `ArtifactPayload::{Single, Composite}`. + +- [ ] **Step 1: Write failing orchestration tests** + +For a Section URL without selection, assert one compact index call, `selection_required`, and zero exhaustive subtree calls. With one, many, and `allScreens`, assert selected roots only, minimal planned batch count, visual-order `frames[]`, and zero extra Figma calls when reusing the resulting artifact. Assert a SectionIndex artifact cannot project TSX. + +- [ ] **Step 2: Run section MCP tests** + +Run: `cargo test -p devup-mcp --test section_export index_first -- --nocapture` + +Expected: FAIL because current code acquires the full Section before selection. + +- [ ] **Step 3: Implement acquisition planning** + +Move URL/request classification out of the router into `acquisition.rs`. For Section exports involving TSX, acquire/reuse `SectionIndex` first. Return its candidates when no selection exists; otherwise start the multi-root collector with validated selected IDs. Keep direct projection from a previously cached full Section design artifact. + +- [ ] **Step 4: Implement composite artifact projection adapter** + +Teach artifact store byte accounting, metadata and capability checks about single/composite payloads. Project each composite root with shared token/resources, retain root completeness and current `frames[]` shape, and reject source-map/raw/theme scopes not covered by the composite. + +- [ ] **Step 5: Run section and cache tests** + +Run: `cargo test -p devup-mcp --test section_export --test artifact_cache -- --nocapture` + +Expected: PASS, including the existing full Section artifact compatibility test. + +- [ ] **Step 6: Commit** + +```text +git add crates/devup-mcp/src/server/acquisition.rs crates/devup-mcp/src/server/artifacts.rs crates/devup-mcp/src/server/handoff.rs crates/devup-mcp/src/server/mod.rs crates/devup-mcp/tests/section_export.rs crates/devup-mcp/tests/artifact_cache.rs +git commit -m "feat: acquire selected figma section roots" +``` + +### Task 4: Verify WQUW-151 batching and document behavior + +**Files:** +- Modify: `crates/devup-mcp/tests/section_export.rs` +- Modify: `crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs` +- Modify: `README.md` + +**Interfaces:** +- Consumes: checked-in WQUW-151 ten-frame JSON fixtures. + +- [ ] **Step 1: Add WQUW contract assertions** + +Assert Section `4217:7743` yields the known ten Frame IDs in visual order, the planner uses fewer than ten exhaustive calls, and every generated snapshot/TSX preserves current text, child, variable, typography and footer-stroke assertions. + +- [ ] **Step 2: Run WQUW tests** + +Run: `cargo test -p devup-mcp --test section_export wquw -- --nocapture` and `cargo test -p devup-mcp-devup-ui --test wquw_151_frames -- --nocapture`. + +Expected: PASS with no snapshot update. + +- [ ] **Step 3: Update README and verify crates** + +Document index-first selection, compact discovery, batching/continuation, composite cache reuse and version-drift failure. Run `cargo fmt --all -- --check`, `cargo clippy -p devup-mcp-figma -p devup-mcp --all-targets --all-features -- -D warnings`, and `cargo test -p devup-mcp-figma -p devup-mcp --all-features`. + +Expected: all commands exit 0. + +- [ ] **Step 4: Commit** + +```text +git add crates/devup-mcp/tests/section_export.rs crates/devup-mcp-devup-ui/tests/wquw_151_frames.rs README.md +git commit -m "test: verify wquw section batching" +``` diff --git a/docs/superpowers/plans/2026-09-01-figma-explore-cache-optimization.md b/docs/superpowers/plans/2026-09-01-figma-explore-cache-optimization.md new file mode 100644 index 0000000..5497c58 --- /dev/null +++ b/docs/superpowers/plans/2026-09-01-figma-explore-cache-optimization.md @@ -0,0 +1,101 @@ +# Figma Explore Cache Optimization Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make compatible repeated Figma exploration local, refreshable, observable, concurrency-safe, and measurably faster. + +**Architecture:** Extend `ArtifactRequestKey` compatibility and `ArtifactLookup` provenance rather than introducing a second cache. Exact, completed-related, superset, and compatible direct in-flight reuse all converge on the existing bounded artifact store; projection uses the requested target while the artifact retains its acquisition target. + +**Tech Stack:** Rust 1.88, Tokio watch channels, rmcp, serde/schemars, Bun/Node test runner. + +**Spec:** `docs/superpowers/specs/2026-09-01-figma-explore-cache-optimization-design.md` + +## Global Constraints + +- Use Bun for repository JavaScript commands. +- Keep cache memory-only with the existing ten-minute TTL and byte/entry bounds. +- Never share an artifact unless the requested node exists in its snapshot. +- Never share incomplete host handoff call IDs. +- `refresh=true` bypasses all reuse paths. +- Preserve existing public fields while making top-level `collection` current-request accurate. + +--- + +### Task 1: Refresh and Superset Cache Selection + +**Files:** +- Modify: `crates/devup-mcp/src/server/tools.rs` +- Modify: `crates/devup-mcp/src/server/mod.rs` +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Test: `crates/devup-mcp/tests/figma_explore.rs` +- Test: `crates/devup-mcp/tests/stdio_tools.rs` + +**Interfaces:** +- Consumes: `ArtifactRequestKey::from_collection`, `ExploreReadOptions`. +- Produces: `FigmaExploreInput.refresh: bool` and compatible exact/related/superset lookup. + +- [ ] **Step 1: Write failing public integration tests** for refresh bypass and larger-projection reuse of a smaller related request. +- [ ] **Step 2: Run the focused tests** and confirm cache miss/upstream count failures. +- [ ] **Step 3: Implement minimal compatibility selection** with exact-first and smallest-sufficient projection ordering. +- [ ] **Step 4: Run `cargo test -p devup-mcp --test figma_explore`** and confirm green. + +### Task 2: Cache Provenance and Current Request Statistics + +**Files:** +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Modify: `crates/devup-mcp/src/server/projection.rs` +- Test: `crates/devup-mcp/tests/artifact_cache.rs` +- Test: `crates/devup-mcp/tests/figma_explore.rs` + +**Interfaces:** +- Produces: `CacheReuseKind`, lookup age/TTL, avoided-call count, `cache.originCollection`, and zero current `collection` on hits. + +- [ ] **Step 1: Write failing response assertions** for `reuseKind`, age, TTL, avoided calls, origin statistics, and current statistics. +- [ ] **Step 2: Run focused tests** and verify missing-field and stale-stat failures. +- [ ] **Step 3: Add typed lookup provenance** and serialize it from the shared cache metadata helper. +- [ ] **Step 4: Re-run artifact and explore tests** and confirm green. + +### Task 3: Compatible Direct In-Flight Reuse + +**Files:** +- Modify: `crates/devup-mcp/src/server/artifacts.rs` +- Test: `crates/devup-mcp/tests/artifact_cache.rs` + +**Interfaces:** +- Consumes: explore compatibility from Task 1. +- Produces: compatible follower waiting with node-coverage validation and independent fallback. + +- [ ] **Step 1: Write failing concurrent tests** proving a related request shares one acquisition and an uncovered request performs its own acquisition. +- [ ] **Step 2: Run the focused tests** and confirm the related upstream count is two before implementation. +- [ ] **Step 3: Track in-flight request keys** and wait for a compatible owner before exact acquisition. +- [ ] **Step 4: Re-run cancellation, concurrency, and cache tests** and confirm green. + +### Task 4: Dirty Build Identity + +**Files:** +- Modify: `crates/devup-mcp/build.rs` +- Modify: `crates/devup-mcp/src/lib.rs` +- Test: `crates/devup-mcp/tests/cli.rs` + +**Interfaces:** +- Produces: testable build-ID composition and `-dirty` for modified Git worktrees. + +- [ ] **Step 1: Write failing helper tests** for clean, dirty, unsafe, and source-unknown identities. +- [ ] **Step 2: Run CLI tests** and confirm the dirty expectation fails. +- [ ] **Step 3: Implement Git status detection and safe composition** without reading credentials or file contents. +- [ ] **Step 4: Re-run CLI and stdio smoke tests** and confirm green. + +### Task 5: Full Verification and WQUW-151 Measurement + +**Files:** +- Modify: `.changepacks/changepack_log_figma_remote_mcp.json` +- Modify: `README.md` + +**Interfaces:** +- Consumes: completed cache behavior and installed release binary. +- Produces: documented diagnostics and measured cold/exact/related/superset comparison. + +- [ ] **Step 1: Document refresh and cache diagnostics** with safe restart guidance. +- [ ] **Step 2: Run formatting, Clippy, full workspace tests, Node script tests, and snapshot checks.** +- [ ] **Step 3: Install the release binary and run `--self-check`.** +- [ ] **Step 4: Measure WQUW-151** and report duration, cache kind, and Figma-call savings for every path. diff --git a/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md new file mode 100644 index 0000000..b2465a0 --- /dev/null +++ b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md @@ -0,0 +1,335 @@ +# devup-mcp Figma Remote MCP 설계 + +> 이 문서는 최초 직접 연결 설계를 기록한 역사 문서다. Catalog 제약 대응과 +> `devup-figma-plugin` 전수 호환성 설계는 +> `2026-08-31-figma-host-fallback-parity-design.md`가 대체한다. + +## 상태 + +- 작성일: 2026-08-30 +- 범위: Figma 읽기 기능 1차 완성 +- 구현 언어: Rust +- 제품명, 실행 파일, Cargo package: `devup-mcp` +- 저장소: `dev-five-git/devup-mcp` +- 범위 외: Vespera 및 Figma 이외의 Devup 기능 + +## 목표 + +사용자가 `devup-mcp` 하나를 MCP 클라이언트에 설치한 뒤 최초 한 번 Figma OAuth를 승인하면, 이후에는 Figma 링크만으로 다음 결과를 얻는다. + +1. 선택한 Figma 노드를 DevupUI React/TypeScript 코드로 변환한다. +2. 노드, 페이지 또는 파일 범위의 Figma 변수와 스타일을 `devup.json`으로 변환한다. +3. 사용자에게 Figma OAuth 앱 생성, PAT 발급 또는 client secret 배포를 요구하지 않는다. +4. Figma 파일은 읽기 전용으로 다룬다. +5. Figma Desktop 실행 여부와 관계없이 동작한다. + +## 핵심 결정 + +### Figma Remote MCP를 upstream으로 사용한다 + +`devup-mcp`는 로컬에서 stdio MCP 서버로 실행되는 동시에 Figma Remote MCP의 Streamable HTTP 클라이언트 역할을 한다. + +```text +Codex / Orca / Claude Code + │ stdio MCP + ▼ + devup-mcp + │ Streamable HTTP MCP + OAuth + ▼ +https://mcp.figma.com/mcp + │ + ▼ + Figma +``` + +직접 Figma REST API를 주 데이터 소스로 사용하지 않는다. 이 결정은 다음 문제를 없앤다. + +- 사용자가 PAT를 발급하고 전달하는 과정 +- DevFive가 고정 Figma client secret을 앱에 내장하는 문제 +- 별도 token exchange 서비스를 운영하는 문제 +- REST Variables API의 Enterprise 플랜 제한 +- Figma Desktop과 현재 열린 파일에 의존하는 문제 + +### Cargo workspace와 책임별 crate로 구성한다 + +제품과 설치 이름은 계속 `devup-mcp` 하나로 유지하되, Figma 연동과 DevupUI 변환은 독립적으로 발전할 수 있도록 Cargo workspace로 나눈다. OAuth는 Figma 외에는 쓸모가 없으므로 별도 `devup-auth` crate로 분리하지 않고 `devup-mcp-figma`에 포함한다. 원본 보존 모델도 Figma snapshot 계약의 일부이므로 별도 `devup-ir` crate를 만들지 않으며, stdio 서버만을 위한 `devup-mcp-server` 이름도 만들지 않는다. + +```text +devup-mcp/ +├─ Cargo.toml +└─ crates/ + ├─ devup-mcp/ + │ └─ src/ # stdio MCP executable와 tool orchestration + ├─ devup-mcp-figma/ + │ └─ src/ # URL, OAuth, keyring, upstream MCP, raw snapshot + └─ devup-mcp-devup-ui/ + └─ src/ + ├─ codegen/ # DevupUI TSX projection + └─ theme/ # devup.json projection +``` + +의존 방향은 `devup-mcp -> devup-mcp-devup-ui -> devup-mcp-figma`이며 실행 crate도 `devup-mcp-figma`를 직접 조합한다. 세 crate 사이에 순환 의존은 없다. + +## OAuth 설계 + +Figma Remote MCP는 표준 OAuth discovery와 동적 클라이언트 등록을 제공한다. + +- Protected Resource Metadata: `https://mcp.figma.com/.well-known/oauth-protected-resource/mcp` +- Authorization Server Metadata: `https://mcp.figma.com/.well-known/oauth-authorization-server` +- Authorization endpoint: `https://www.figma.com/oauth/mcp` +- Token endpoint: `https://api.figma.com/v1/oauth/token` +- Dynamic registration endpoint: `https://api.figma.com/v1/oauth/mcp/register` +- Scope: `mcp:connect` +- PKCE: `S256` + +인증 순서는 다음과 같다. + +1. loopback listener를 `127.0.0.1`의 사용 가능한 포트에 바인딩한다. +2. 정확한 callback URI로 OAuth client를 동적 등록한다. +3. `state`, PKCE verifier 및 challenge를 CSPRNG로 생성한다. +4. 시스템 기본 브라우저에서 authorization endpoint를 연다. +5. localhost callback에서 code와 state를 받고 state를 constant-time 비교한다. +6. code와 verifier로 토큰을 교환한다. +7. refresh token, access token 및 동적 등록 credential을 OS Credential Manager에 저장한다. +8. access token 만료 전에 refresh하고, refresh 실패 시 사용자에게 재인증 절차를 반환한다. + +callback HTTP 서버는 인증 중에만 실행하며 성공, 실패 또는 timeout 이후 즉시 종료한다. 토큰과 verifier, client secret은 stdout, stderr, tracing field 또는 MCP 오류 본문에 기록하지 않는다. + +## Downstream MCP 도구 + +### `devup_figma_auth` + +Figma 연결 상태를 확인하거나 명시적으로 로그인·로그아웃한다. + +```json +{ + "action": "status | login | logout" +} +``` + +로그인은 브라우저 OAuth를 시작한다. 변환 도구가 인증되지 않은 상태에서 호출되면 동일한 인증 흐름을 자동으로 시작할 수 있다. + +### `devup_figma_to_ui` + +```json +{ + "url": "https://www.figma.com/design//?node-id=", + "componentName": "OptionalName", + "includeDiagnostics": true +} +``` + +반환값: + +- DevupUI TSX +- 필요한 `@devup-ui` import +- 사용된 Figma 변수 및 스타일 +- 지원하지 않는 속성 또는 fallback 목록 +- source file key, node id 및 Figma version 정보가 제공될 경우 version + +### `devup_figma_to_json` + +```json +{ + "url": "https://www.figma.com/design//?node-id=", + "scope": "node | page | file", + "includeDiagnostics": true +} +``` + +반환값: + +- DevupUI가 소비할 수 있는 `devup.json` 문자열 +- 수집한 페이지, 노드, 변수, 스타일 수 +- 완전성 등급 +- 충돌 및 미해결 alias 경고 + +`devup.json`은 현재 DevupUI schema에 맞춰 다음 항목을 생성한다. + +- `theme.colors..` +- `theme.typography.` +- `theme.length..` +- `theme.shadow..` + +Figma mode 이름은 안정적인 JSON key로 정규화하되 원래 이름을 diagnostics에 유지한다. WEB `codeSyntax`가 존재하면 토큰 이름의 우선 소스로 사용하고, 없으면 Figma 변수 이름을 결정적으로 정규화한다. + +## Upstream 도구 사용 + +`devup-mcp`는 Figma Remote MCP의 읽기 관련 도구만 allowlist한다. + +- `get_metadata`: 파일의 페이지와 큰 노드의 구조 탐색 +- `get_variable_defs`: 선택 범위에서 사용된 로컬·외부 변수 및 스타일 조회 +- `get_design_context`: snapshot만으로 부족한 컴포넌트 의미와 Code Connect 보조 정보 +- `get_code_connect_map`: 연결된 코드 컴포넌트 확인 +- `get_screenshot`: 선택적 시각 검증 자료 +- `use_figma`: 고정된 읽기 전용 전체 snapshot script 실행 + +`use_figma`, `generate_figma_design`, `upload_assets`, `add_code_connect_map` 등 쓰기 가능 도구를 일반적으로 노출하지 않는다. `use_figma`는 예외적으로 호출하지만 Devup이 빌드 시 내장한 읽기 전용 script template만 실행한다. + +## Figma 전체 데이터 snapshot + +실제 검증 결과 Remote `use_figma`에서는 Plugin API typings에 존재하는 `node.exportAsync({ format: "JSON_REST_V1" })`가 `JSON_REST_V1 export format is not supported in this context`로 거부됐다. 따라서 REST JSON을 그대로 요청하지 않는다. + +대신 고정된 읽기 전용 Plugin API script가 Figma Plugin API에서 공개되고 읽을 수 있는 디자인 필드를 손실 최소화 snapshot으로 직렬화한다. 현재 코드생성이 사용하지 않는 필드도 버리지 않고 raw JSON field로 보존한다. + +snapshot은 Figma Plugin API typings에서 node type과 mixin별 데이터 property manifest를 생성해 다음 데이터를 포함한다. + +- 공통: id, type, name, visible, opacity, rotation +- 트리: parent id, child ids 및 순서 +- 크기와 위치: x, y, width, height, constraints +- Auto Layout: direction, wrap, alignment, gap, padding, sizing +- Paint: solid, gradient, image reference, opacity, blend mode +- Border와 effect: stroke, radius, shadow, blur +- Text: characters, styled segments, font family, size, weight, line height, letter spacing, alignment +- Component: instance, main component, variant properties, Code Connect key +- Variable: bound variable ids, explicit mode ids, resolved current value +- 확장 데이터: Dev resources, annotations, measurements, reactions, export settings +- 미지원 신규 데이터: `extra` map과 `fieldErrors`에 원본 값 또는 읽기 실패 정보 + +Rust는 node의 모든 field를 `serde_json::Map`로 먼저 보존하고, DevupUI codegen에서 필요한 property만 typed view로 해석한다. 새 Figma field를 Rust codegen이 아직 이해하지 못하더라도 snapshot에서는 소실되지 않는다. + +전체 snapshot에서도 다음 항목은 JSON으로 직접 표현하지 않는다. + +- 함수와 메서드 +- 순환 참조 객체: `parent`는 `parentId`, node 참조는 node id로 치환 +- 원본 이미지·동영상 bytes: asset id와 metadata를 보존하고 별도 asset 도구로 조회 +- 접근할 수 없는 타 plugin의 private data +- 읽기 자체가 오류를 일으키는 getter: 오류 문자열을 `fieldErrors`에 기록 + +공식 Plugin API typings가 갱신됐는데 serializer manifest에 없는 공개 data property가 생기면 CI contract test를 실패시킨다. runtime에서 열거 가능한 미지의 property는 `extra`에 보존한다. + +임의 JavaScript를 사용자 입력으로 받지 않는다. file key와 node id는 파싱·검증한 후 JSON literal로만 script에 삽입한다. + +### 크기 제한과 청크 처리 + +Figma MCP 응답과 대형 선택 영역의 한계를 피하기 위해 다음 순서를 사용한다. + +1. `get_metadata`로 대상 구조를 얻는다. +2. 작은 노드는 한 번에 전체 snapshot을 수집한다. +3. 예상 크기가 큰 Frame, Section 또는 Page는 직계 자식 단위로 분할한다. +4. bounded concurrency로 snapshot tool call을 실행한다. +5. Rust에서 node id와 child order를 기준으로 재조립한다. +6. 동일 파일 version 내 결과만 병합한다. version이 달라지면 일관성 오류로 재시도를 요청한다. + +페이지 또는 파일 전체 수집은 페이지당 한 번만 page context를 설정하고 페이지 호출을 병렬 fan-out한다. + +## 변수와 `devup.json` 완전성 + +### 로컬 변수 + +Plugin API의 `getLocalVariableCollectionsAsync`와 `getLocalVariablesAsync`를 collection 단위로 청크 호출한다. 따라서 파일에 정의됐지만 노드에 사용되지 않은 로컬 변수와 mode도 수집 대상이다. + +### 외부 라이브러리 변수 + +모든 노드의 variable binding을 수집한 뒤 `get_variable_defs`와 variable id 조회를 사용한다. 파일에서 실제 사용한 외부 변수는 이름과 현재 값을 보존한다. 구독만 했지만 어느 노드에도 사용하지 않은 외부 라이브러리 변수 전체는 수집을 보장하지 않는다. + +완전성 등급: + +- `full-local-plus-used-remote`: 모든 로컬 변수와 실제 사용된 외부 변수 +- `used-tokens`: 선택 범위에서 사용된 변수만 확보 +- `resolved-values-only`: 토큰 의미를 찾지 못해 계산값만 확보 + +Devup은 누락된 정보를 추측해 토큰을 만들지 않고 diagnostics에 명시한다. + +## DevupUI 코드 생성 + +기존 `devup-figma-plugin`의 검증된 변환 규칙을 참고하되 JavaScript runtime 의존성 없이 Rust로 이식한다. + +1. Auto Layout을 `Flex`, 일반 컨테이너를 `Box`, 텍스트를 `Text`로 매핑한다. +2. theme token을 찾으면 `$token`을 우선 사용한다. +3. token을 찾지 못하면 계산된 CSS 값을 사용한다. +4. component 이름은 유효한 TypeScript identifier로 정규화한다. +5. 절대 배치, mask, vector, image 및 미지원 effect는 명시적 fallback과 diagnostics를 남긴다. +6. 결과는 formatter를 거쳐 결정적인 문자열로 만든다. + +`get_design_context`가 반환한 React/Tailwind 코드를 다시 파싱해 주 데이터로 사용하지 않는다. snapshot만으로 부족한 의미 정보와 Code Connect 보조 자료로만 사용한다. + +## 오류 모델 + +오류는 안정적인 code와 사용자용 한국어/영어 message, retry 가능 여부 및 안전한 details를 가진다. + +- `DEVUP_AUTH_REQUIRED` +- `DEVUP_AUTH_CALLBACK_TIMEOUT` +- `DEVUP_AUTH_STATE_MISMATCH` +- `DEVUP_FIGMA_PERMISSION_DENIED` +- `DEVUP_FIGMA_RATE_LIMITED` +- `DEVUP_FIGMA_NODE_NOT_FOUND` +- `DEVUP_FIGMA_UNSUPPORTED_FILE` +- `DEVUP_FIGMA_RESPONSE_TOO_LARGE` +- `DEVUP_FIGMA_VERSION_CHANGED` +- `DEVUP_SNAPSHOT_UNSUPPORTED` +- `DEVUP_CODEGEN_FAILED` +- `DEVUP_THEME_CONFLICT` + +401은 refresh 후 한 번만 재시도한다. 429는 upstream retry hint가 있을 때만 bounded retry한다. snapshot 오류는 더 작은 subtree로 한 단계 분할한 뒤 한 번 재시도하고, 반복 실패하면 해당 node id와 field 오류를 diagnostics에 남긴다. + +## 보안과 개인정보 + +- downstream은 stdio만 사용하며 stdout에는 MCP frame 외 데이터를 쓰지 않는다. +- tracing은 stderr로만 보내고 token, OAuth code, verifier, secret, Figma 사용자 이메일을 redact한다. +- credential은 OS keyring에 저장하고 평문 설정 파일 fallback을 제공하지 않는다. +- localhost callback은 loopback에만 bind한다. +- OAuth state와 PKCE를 필수 검증한다. +- Figma URL host, file type, file key 및 node id를 엄격히 검증한다. +- upstream `use_figma`에는 고정된 읽기 전용 script만 전달한다. +- Figma 원본 디자인 JSON과 스크린샷을 기본적으로 디스크에 저장하지 않는다. +- 테스트 fixture는 합성·비식별 데이터만 저장한다. +- logout은 credential만 삭제하며 Figma 파일이나 프로젝트 파일을 변경하지 않는다. + +## 테스트 전략 + +### 단위 테스트 + +- Figma URL parser 및 branch URL 처리 +- OAuth discovery, DCR, PKCE, state, refresh 및 timeout +- credential redaction +- 전체 snapshot JSON deserialize, unknown field 보존과 청크 재조립 +- Plugin API typings와 serializer property manifest의 누락 검출 +- 색상, 길이, typography, shadow 및 mode의 `devup.json` 매핑 +- component identifier 정규화 +- Auto Layout, text, fills, effects 및 token fallback 코드생성 +- 충돌과 미지원 속성 diagnostics + +### 계약 테스트 + +- mock Streamable HTTP MCP server로 initialize, tools/list, tools/call 검증 +- OAuth metadata와 dynamic registration fixture 검증 +- upstream allowlist 밖의 write tool이 호출되지 않는지 검증 +- 대형 응답 분할과 version 변경 검증 + +### 통합 테스트 + +- Figma OAuth는 수동 opt-in live test로 분리한다. +- 제공된 파일 `85CgSws3o5XsLv7aAwWJyS`, node `3879:35481`을 smoke fixture로 사용하되 반환 디자인 데이터는 저장하지 않는다. +- 반환 TSX를 parser/formatter로 검증한다. +- 생성 `devup.json`을 DevupUI schema/parser로 검증한다. +- stdio MCP client로 실제 도구 목록과 호출 결과를 검증한다. + +## 배포 + +- Rust 단일 바이너리로 배포한다. +- Windows, macOS, Linux를 지원한다. +- GitHub Actions에서 fmt, clippy `-D warnings`, test 및 release build를 실행한다. +- 플랫폼별 keyring backend를 사용한다. +- Figma Remote MCP endpoint는 기본값으로 고정하되 테스트에서만 주입 가능하게 한다. + +## 단계별 구현 + +1. Rust package, CI, tracing 및 stdio MCP skeleton +2. upstream Streamable HTTP MCP client와 OAuth discovery/DCR/PKCE/keyring +3. URL parser와 Figma read-only tool allowlist +4. 전체 snapshot protocol, typings 기반 property manifest와 청크 재조립 +5. `devup_figma_to_ui` Rust codegen +6. 변수 수집과 `devup_figma_to_json` +7. 실제 Figma OAuth 및 제공 노드 통합 검증 +8. 설치 문서, changelog 및 release packaging + +## 남은 위험 + +- Figma Remote MCP의 도구 목록과 응답 shape는 발전 중이므로 tool contract fixture와 capability negotiation이 필요하다. +- generic Rust MCP client에서 `use_figma`가 동일하게 노출되는지는 실제 OAuth 연결 후 재검증해야 한다. +- Figma MCP 또는 `use_figma`의 응답 크기 제한은 대형 파일에서 많은 호출을 유발할 수 있다. +- 외부 라이브러리의 사용되지 않은 변수 전체는 수집하지 못할 수 있다. +- 기존 TypeScript plugin과 완전히 같은 코드 출력을 내려면 변환 규칙의 fixture parity 작업이 필요하다. + +이 위험은 정확하지 않은 결과를 조용히 생성하지 않고 capability, completeness 및 diagnostics로 사용자에게 노출한다. diff --git a/docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md b/docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md new file mode 100644 index 0000000..05aff26 --- /dev/null +++ b/docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md @@ -0,0 +1,503 @@ +# devup-mcp Figma 폴백 및 전수 호환성 설계 + +## 상태와 기준선 + +- 작성일: 2026-08-31 +- 상태: 구현 전 승인 명세 +- 대체 문서: `2026-08-30-figma-remote-mcp-design.md` +- 구현 저장소: `dev-five-git/devup-mcp` +- 기준 JavaScript 저장소: `dev-five-git/devup-figma-plugin` +- 기준 JavaScript commit: `243db650f1d635ab5385546a2a297eae4ea93515` +- 기준 테스트 결과: 54개 파일, 978 pass, 0 fail, 268 snapshots, 1,974 assertions +- 제품 언어와 배포 형태: Rust 단일 바이너리 `devup-mcp` + +이 명세는 승인된 두 가지 요구를 하나의 완료 조건으로 묶는다. + +1. Figma Remote MCP에 직접 연결할 수 있으면 이를 최적 경로로 사용하고, + Catalog 승인 또는 OAuth/capability 문제로 직접 연결할 수 없으면 MCP host에 이미 + 설치된 공식 Figma MCP를 통해 동일 데이터를 받는다. +2. 기존 JavaScript 플러그인의 코드 생성과 `devup.json` 출력 규칙을 Rust로 이식하고, + 원본 테스트 전체를 추적하는 고정 fixture corpus와 `cargo insta` snapshot gate를 + 통과한다. + +Vespera와 Figma 이외의 Devup 기능은 이번 범위에 포함하지 않는다. + +## 사용자 결과 + +사용자는 `devup-mcp` 하나를 설치하고 Figma 링크를 제공해 다음 결과를 얻는다. + +- 선택 노드, 페이지 또는 파일을 탐색한 완전성 정보가 있는 Figma snapshot +- `@devup-ui/react` 기반 React/TypeScript 코드와 컴포넌트 파일 +- 파일의 로컬 변수, 실제 사용한 외부 변수 및 스타일을 반영한 `devup.json` +- SVG/PNG asset 목록과 내보낼 수 없는 asset의 진단 +- 직접 연결 또는 공식 Figma MCP 중 실제 사용한 source 정보 +- 미지원 필드, 접근 실패 getter, 누락 token, 충돌 및 fallback 원인 + +기본 반환은 MCP 응답의 메모리 내 artifact다. 사용자가 `outputPath`를 명시한 경우에만 +검증된 workspace 하위 경로에 원자적으로 파일을 기록한다. + +## Cargo workspace와 책임 + +crate 구성은 유지하되 각 crate의 책임을 확장한다. + +```text +devup-mcp/ +├─ crates/ +│ ├─ devup-mcp/ # stdio MCP, source 선택, handoff session, export +│ ├─ devup-mcp-figma/ # URL, direct OAuth, upstream, collector, raw snapshot +│ └─ devup-mcp-devup-ui/ # NodeTree, codegen, responsive, theme projection +└─ fixtures/devup-figma-plugin/ # JSON inputs, insta snapshots, manifest/ledger +``` + +`devup-mcp` 저장소는 Cargo만으로 build/test하며 `package.json`, Bun lockfile, Node/Bun +script 또는 JavaScript test runtime을 두지 않는다. 기존 `devup-figma-plugin`의 inline +test input은 한 번 JSON으로 이전하고, 이후 fixture는 JSON을 단일 진실 공급원으로 +관리한다. Figma `use_figma`가 요구하는 고정 읽기 전용 JavaScript 문자열은 Rust +binary에 resource로 포함되어 Figma sandbox에서 실행될 뿐, 로컬 JavaScript runtime +의존성이 아니다. + +OAuth는 계속 `devup-mcp-figma` 내부에 둔다. 별도 `devup-auth`, `devup-ir`, +`devup-mcp-server` crate는 만들지 않는다. + +## 데이터 source 상태 기계 + +### 직접 경로 + +`devup-mcp`는 Figma Remote MCP의 Streamable HTTP endpoint에 직접 연결한다. 유효한 +keyring credential이 있으면 discovery, initialize, capability negotiation 후 읽기 +도구만 호출한다. 명시적인 `devup_figma_auth { "action": "login" }`만 browser OAuth를 +시작한다. 일반 변환 요청의 `auto` 모드는 예기치 않게 browser를 열지 않는다. + +직접 경로가 가능한 사용자는 별도 agent 왕복 없이 가장 빠른 결과를 얻는다. + +### host 공식 MCP 폴백 + +MCP 서버는 host가 연결한 다른 sibling MCP의 tool을 직접 호출하거나 그 token을 읽을 +수 없다. 따라서 폴백은 다음 handoff protocol로 수행한다. + +```text +agent/host ── devup_figma_to_* ──> devup-mcp + direct 실패 │ +agent/host <── needs_figma + calls ────┘ + │ + ├── 공식 Figma MCP tool 호출 + │ + └── devup_figma_continue(result) ──> 동일 Rust collector/converter +``` + +`devup-mcp`가 반환하는 call에는 server hint, 공식 tool 이름, 인자 및 Devup이 빌드 시 +내장한 고정 읽기 전용 `use_figma` script가 포함된다. agent/host는 이 call을 실행하고 +결과를 수정하지 않은 채 continuation tool에 돌려준다. 공식 Figma MCP가 설치되지 +않은 host에서는 설치 필요 진단과 재개 가능한 handoff를 반환한다. + +### source 정책 + +모든 변환 도구는 다음 정책을 받는다. + +- `auto`: 유효한 direct credential이 있고 capability가 맞으면 direct, 아니면 host handoff +- `direct`: direct만 허용하며 실패를 구조화해 반환 +- `host`: direct 시도 없이 즉시 host handoff + +다음 오류는 `auto`에서 폴백한다. + +- Catalog 미승인 또는 dynamic client registration 거부 +- OAuth/capability가 direct client에 제공되지 않음 +- direct identity의 permission 거부. host identity가 다를 수 있으므로 한 번 허용 + +잘못된 URL, 존재하지 않는 node, file version 충돌은 source를 바꿔도 해결되지 않으므로 +폴백하지 않는다. rate limit은 동일 사용자 quota일 가능성이 높으므로 자동 우회하지 +않고 retry hint를 전달한다. + +## MCP 도구 계약 + +기존 세 도구를 유지하고 검색과 continuation을 추가한다. + +### `devup_figma_auth` + +```json +{ "action": "status | login | logout" } +``` + +직접 연결 credential만 관리한다. 공식 Figma MCP의 token을 조회하거나 저장하지 않는다. + +### `devup_figma_to_ui` + +```json +{ + "url": "https://www.figma.com/design//?node-id=", + "scope": "node | page | file", + "componentName": "OptionalName", + "sourcePolicy": "auto | direct | host", + "includeDiagnostics": true, + "outputPath": "optional/workspace/path" +} +``` + +### `devup_figma_to_json` + +```json +{ + "url": "https://www.figma.com/design//?node-id=", + "scope": "node | page | file", + "sourcePolicy": "auto | direct | host", + "includeDiagnostics": true, + "outputPath": "optional/workspace/devup.json" +} +``` + +### `devup_figma_search` + +파일 전체에서 사용자가 말한 화면·캔버스를 이름으로 찾는다. Figma UI 용어와 사용자의 +표현이 항상 일치하지 않으므로 기본 검색 대상은 `PAGE`, `SECTION`, `FRAME`, +`COMPONENT_SET`, `COMPONENT`다. `nodeTypes`를 지정하면 제한할 수 있다. + +```json +{ + "url": "https://www.figma.com/design//", + "query": "A : STORY-F-PROOFREAD", + "nodeTypes": ["PAGE", "SECTION", "FRAME", "COMPONENT_SET"], + "match": "normalized", + "limit": 20, + "sourcePolicy": "auto | direct | host" +} +``` + +매칭 우선순위는 원문 exact, Unicode NFC·공백·대소문자 normalized exact, prefix, +contains 순이다. `fuzzy`는 요청에서 명시한 경우에만 적용한다. 결과는 score만 주지 않고 +node ID, type, page 이름, 전체 breadcrumb와 해당 node를 가리키는 canonical Figma URL을 +반환한다. 동일 이름이 여러 개면 조용히 하나를 선택하지 않는다. + +대표 agent 흐름은 다음과 같다. + +```text +사용자: "~를 구현하려는데 그런 화면이 있니?" +agent: devup_figma_search → 후보 이름/type/breadcrumb 목록 제시 +사용자: "맞아, 그 목록 다 구현해줘" +agent: 이전 응답의 canonical URL마다 devup_figma_to_ui 호출 → 전체 artifact 반환 +``` + +검색 결과 집합을 server session에 저장하거나 자연어 후속 발화를 MCP가 직접 해석하지 +않는다. agent가 대화 문맥의 구조화된 검색 결과를 유지하고 정확한 URL을 다시 전달한다. +따라서 여러 후보를 구현하는 경우도 숨은 상태 없이 재현할 수 있다. 첫 구현은 기존 +`devup_figma_to_ui`를 후보별로 bounded concurrency 호출하며 별도 batch API는 실제 +호출 비용이 문제로 확인되기 전에는 추가하지 않는다. + +### `devup_figma_continue` + +```json +{ + "sessionId": "opaque-session-id", + "callId": "opaque-call-id", + "result": {} +} +``` + +host call이 더 필요하면 다시 `needs_figma`, 수집이 끝나면 `complete`를 반환한다. + +```json +{ + "status": "needs_figma", + "sessionId": "opaque-session-id", + "expiresAt": "RFC3339", + "calls": [ + { + "callId": "opaque-call-id", + "server": "figma", + "tool": "use_figma", + "arguments": {} + } + ], + "resumeTool": "devup_figma_continue" +} +``` + +완료 응답은 artifact kind, content 또는 path, SHA-256, diagnostics, completeness, +Figma version 및 실제 source를 포함한다. call ID는 정확히 한 번만 소비하며 중복, +만료 또는 다른 session의 결과는 거부한다. + +## handoff session 안전성 + +- CSPRNG로 session ID와 call ID를 만든다. +- 기본 TTL은 10분이고 완료·취소·만료 시 즉시 메모리에서 제거한다. +- process당 활성 session 8개, call result당 16 MiB, 전체 64 MiB로 제한한다. +- 원본 Figma 결과를 disk나 log에 저장하지 않는다. +- continuation result는 기대한 tool별 schema, file key, node ID 및 version과 대조한다. +- 완료 artifact를 파일로 쓸 때는 workspace canonical path 검증과 임시 파일 rename을 쓴다. + +## 완전 수집기 + +collector는 source와 무관한 계획/병합 계층이다. direct transport와 host handoff는 같은 +`CollectionPlan`과 `SnapshotChunk`를 생산하므로 변환 결과가 source에 따라 달라지지 +않는다. + +1. `get_metadata` 또는 고정 snapshot script로 file/page/node 구조와 version을 얻는다. +2. node 범위는 해당 subtree, page 범위는 page 전체, file 범위는 모든 page를 계획한다. +3. 크기가 큰 Page, Section, Frame은 직계 자식 단위로 재귀 분할한다. +4. bounded concurrency로 chunk를 읽고 node ID와 child order로 결정적으로 병합한다. +5. 모든 chunk의 file key와 version이 같아야 한다. 도중 version 변경은 전체 결과를 폐기한다. +6. 같은 ID의 내용이 충돌하면 추측하지 않고 오류로 반환한다. + +이름 검색은 같은 collector가 만든 metadata/snapshot index를 순회한다. source가 direct든 +host handoff든 정규화와 정렬 결과가 같아야 하며, 검색을 위해 원본 node data를 별도로 +disk cache하지 않는다. + +### 실제 JSON 계약 고정 gate + +fixture schema를 collector보다 먼저 가정하지 않는다. direct transport, host handoff, +고정 serializer, chunk 병합과 변수/style 수집을 먼저 구현한 뒤 제공된 실제 Figma +file/node로 다음을 검증한다. + +- 공식 Figma MCP가 반환하는 tool result envelope와 structured/text content 형태 +- serializer가 만드는 node field, `extra`, `fieldErrors`, reference ID와 child order +- 변수 collection/mode/alias와 style의 실제 JSON 표현 +- 큰 subtree 분할 전후의 병합 shape와 version 정보 +- Rust deserialize → serialize round trip에서 unknown field가 보존되는지 + +Catalog 승인으로 direct live 연결이 불가능한 환경에서는 host fallback live 결과와 direct +mock contract를 대조한다. direct live 성공을 fixture 설계의 전제 조건으로 삼지 않는다. + +live 응답은 메모리에서만 검사하고 실제 이름, 텍스트, 디자인 값이나 전체 payload를 +repository에 저장하지 않는다. 검증된 key/type/reference 구조를 사용해 비식별 synthetic +sample을 만들고, 그 sample이 동일 Rust collector/parser를 통과한 뒤에만 fixture +schema version 1을 고정한다. + +고정 `use_figma` serializer는 공개된 모든 data property를 우선 raw JSON으로 보존한다. +함수, 순환 참조와 binary는 ID/metadata로 치환하고 읽기 실패 getter는 `fieldErrors`, +typed projection이 모르는 새 값은 `extra`에 둔다. Plugin API typings와 serializer +manifest가 어긋나면 CI를 실패시킨다. 사용자 JavaScript는 절대 실행하지 않는다. + +## 변수, 스타일과 devup.json + +file 범위에서는 모든 local variable collection, variable, paint/text/effect/grid style을 +수집한다. node/page 범위에서는 local 전체와 해당 범위에서 실제 binding된 remote +variable/style을 함께 수집하고 결과에서 scope를 구분한다. alias graph는 cycle을 +검출하면서 mode별로 해석한다. + +출력은 기존 JavaScript 플러그인의 규칙을 기준으로 한다. + +- `theme.colors..` +- `theme.typography.` +- `theme.length..` +- `theme.shadow..` +- breakpoint/mode mapping, theme replication, alias와 treeshaking +- WEB `codeSyntax` 우선 token 이름과 결정적인 fallback 정규화 + +로컬 전체를 얻지 못하면 `full`로 표시하지 않는다. 완전성은 최소한 +`full-local-plus-used-remote`, `used-tokens`, `resolved-values-only`를 구분한다. + +## DevupUI 변환 범위 + +Rust 변환기는 JavaScript `Codegen.buildTree()`의 NodeTree 의미와 render 규칙을 이식한다. + +- Box, Flex, Grid, Text, Image와 custom component 선택 +- auto layout, inferred layout, free/absolute layout, constraints와 responsive breakpoint +- fill/gradient/image, border, radius, opacity/blend, effect/shadow, transform, overflow +- typography, styled text segment, ellipsis/max line, text stroke/alignment +- local/remote bound variable와 token fallback +- component/instance/component set, variants, boolean/text/instance-swap/native slot +- selector, reactions/keyframes, cursor와 import metadata +- SVG/PNG asset 판정, mask와 component reference/inline mode +- Pure Code, component definition, usage 및 responsive output +- 결정적인 import 정렬, prop 직렬화, formatting과 file naming + +원본 JavaScript가 내는 의미 있는 문자열은 줄바꿈을 LF로 정규화한 뒤 byte-identical을 +목표로 한다. Rust formatter 취향으로 출력 계약을 임의 변경하지 않는다. + +## JSON fixture 및 JavaScript 전수 호환성 + +### 원칙 + +모든 변환 입력은 실행 가능한 TypeScript mock이 아니라 순수 JSON fixture다. Rust는 이 +JSON을 production과 같은 `serde_json` 경로로 읽고 TSX, `devup.json`, NodeTree 또는 +구조화 오류를 생성한다. `cargo insta`는 출력 snapshot gate로 사용하고 전수성은 +manifest/ledger가 보장한다. 일반 테스트 실행은 기대값을 자동으로 덮어쓰지 않는다. + +```text +fixtures/devup-figma-plugin/ +├─ manifest.json # source SHA, schema, case/snapshot 수, checksum +├─ ledger.json # 모든 upstream test ID와 fixture/분류/rationale +├─ cases/ +│ ├─ codegen/*.json # JSON -> TSX/component output +│ ├─ responsive/*.json # JSON -> responsive TSX +│ ├─ devup-json/*.json # JSON -> devup.json +│ ├─ snapshot/*.json # JSON -> merge/normalization result +│ └─ errors/*.json # JSON -> structured error +└─ snapshots/ + ├─ codegen/*.snap + ├─ responsive/*.snap + ├─ devup-json/*.snap + ├─ snapshot/*.snap + └─ errors/*.snap +``` + +모든 test ID는 `source-file + full suite path + parameterized case index`로 안정적으로 +식별한다. 이름이 같은 parameterized test도 index와 input checksum으로 구분한다. case +파일명은 사람이 읽을 수 있는 kebab-case이고 JSON의 `id`는 전체 corpus에서 유일하다. + +### fixture schema + +각 fixture는 자기완결적이며 `schemaVersion`, 전역 고유 `id`, `operation`, 원본 test +provenance, 변환 request와 실제 collector가 반환하는 payload를 가진다. payload 내부 +node/variable/style의 구체 JSON 표현은 앞 절의 실제 JSON 계약 고정 gate를 통과한 Rust +serde type에서 생성하며 이 설계 문서가 임의의 예시 값을 선행 정의하지 않는다. + +`operation`은 `tsx`, `responsive-tsx`, `devup-json`, `snapshot` 또는 `error` 중 하나다. +expected output은 JSON에 중복 저장하지 않고 같은 `id`의 insta snapshot 한 곳에만 둔다. + +fixture의 `snapshot`은 별도 test mock 형식이 아니라 실제 collector의 정규화 출력 +schema와 동일하다. TypeScript test에서 함수로 표현했던 값은 이전 시 다음처럼 data로 +평탄화한다. + +- `getMainComponentAsync()` 결과 → `mainComponentId` +- `getStyledTextSegments()` 결과 → `styledTextSegments` +- `getVariableByIdAsync()` 결과 → `variables`의 ID-indexed data +- `getStyleByIdAsync()` 결과 → `styles`의 ID-indexed data +- getter throw/rejection → 해당 node의 `fieldErrors` +- parent, child, default variant와 node 참조 → node ID +- `figma.mixed` → schema가 정의한 tagged JSON sentinel + +JSON에는 함수, Symbol, 순환 object 또는 executable code가 들어갈 수 없다. fixture +loader는 unknown field를 보존하지만 잘못된 참조, 중복 ID와 지원하지 않는 schema +version은 변환 전에 실패시킨다. + +### 최초 이전 + +실제 JSON 계약 고정 gate가 끝난 후 기준 commit의 inline TypeScript 입력을 같은 serde +type의 `cases/**/*.json`으로 이전한다. 기존 268개 JavaScript snapshot은 LF로만 +정규화해 동일 ID의 최초 insta golden으로 사용한다. +snapshot이 없던 변환 assertion은 기준 JavaScript 테스트의 실제 기대값을 snapshot으로 +옮긴다. 이전 완료 후 모든 변환 fixture는 JSON이 기준이며, Rust 프로젝트에는 변환용 +JavaScript exporter나 runner를 남기지 않는다. + +원본 54개 파일과 978개 test ID는 ledger에 전부 기록한다. 변환과 관련된 항목은 반드시 +fixture ID와 snapshot 또는 Rust assertion에 연결한다. plugin bootstrap, browser iframe, +Figma 쓰기처럼 JSON 변환 pipeline 자체가 아닌 항목만 근거와 대응 안전성 test를 가진 +범위 외 분류를 허용한다. + +### ledger 분류 + +원본 978개 각각은 다음 중 정확히 하나여야 한다. + +- `rust_snapshot`: Rust 공개 변환 결과가 JavaScript golden과 동일해야 함 +- `rust_assertion`: snapshot보다 구조/오류 assertion이 적절한 순수 규칙 +- `contract`: MCP, collector, 파일 export 경계의 Rust 계약 테스트 +- `out_of_scope_write`: Figma import/변경처럼 읽기 전용 제품이 의도적으로 제공하지 않음 +- `upstream_runtime_only`: Figma plugin UI, browser iframe 또는 JS module bootstrap 자체의 동작 + +마지막 두 분류도 삭제하거나 무시하지 않고 원본 ID, 이유, 대응 Rust 안전성 테스트를 +필수로 기록한다. `out_of_scope_write`는 쓰기 기능을 구현했다는 의미가 아니며, +읽기 전용 allowlist가 해당 동작을 불가능하게 한다는 테스트에 연결한다. +`upstream_runtime_only`는 가능한 경우 MCP/파일 export의 동등한 경계 테스트에 연결한다. + +ledger에는 분류별 최소 목표 수를 하드코딩하지 않는다. 대신 manifest에 기록한 기준 +commit의 upstream test ID 집합과 ledger ID 집합의 완전 일치, 모든 항목의 fixture 또는 +rationale/test reference 존재, 중복 없음, referenced file/checksum 존재를 검증한다. +이 규칙으로 불편한 테스트를 숫자 맞추기 없이 제외하는 것을 막는다. + +### insta 사용 + +`devup-mcp-devup-ui`의 compatibility integration test는 `cases/**/*.json`을 재귀적으로 +발견하고 manifest 순서와 무관하게 모든 case를 변환한다. + +- TSX, component definitions, imports: `insta::assert_snapshot!` +- NodeTree, devup.json, diagnostics: `insta::assert_json_snapshot!` +- case ID를 snapshot name과 상대 경로로 사용해 JSON과 원본 test까지 역추적 +- JSON은 object key 정렬, 문자열은 LF만 정규화 +- snapshot update는 `cargo insta review` 후 manifest checksum 재생성 필요 +- CI는 `cargo insta test`로 `.snap.new` 파일 존재와 unreviewed snapshot을 실패로 처리 + +테스트는 glob으로 발견한 JSON 집합, manifest case 집합과 snapshot 집합의 일대일 대응을 +검증한다. orphan JSON, orphan snapshot, 중복 ID, 잘못된 source test 또는 ledger에서 +분류되지 않은 upstream test가 하나라도 있으면 실패한다. + +### drift 관리 + +- manifest에 원본 repository URL, commit SHA, schema version, case count와 checksum 저장 +- Cargo integration test가 case ID, source test ID, snapshot과 모든 checksum 검증 +- fixture 갱신은 JSON과 insta snapshot diff를 함께 review하고 source commit을 명시적으로 갱신 +- `devup-mcp` CI는 network와 JavaScript runtime 없이 committed JSON/snapshot만 실행 +- production package와 개발 의존성에 corpus generator/Bun/Node를 포함하지 않음 + +## 테스트 게이트 + +### Rust 단위/계약 테스트 + +- URL, OAuth/PKCE/keyring redaction과 source 오류 분류 +- handoff session TTL, 크기/동시성, 중복 call, schema/file/version 검증 +- direct와 host input이 같은 `SnapshotChunk`와 최종 artifact를 만드는지 검증 +- 전체 node field 보존, 청크 분할/병합, version 충돌 +- 이름 검색의 Unicode NFC, 공백/대소문자, exact/prefix/contains 우선순위와 동명 node +- variable/style alias, mode, scope, completeness +- read-only allowlist와 고정 script hash +- outputPath traversal/symlink 방지와 원자적 기록 + +### 호환성 테스트 + +- Rust corpus manifest/checksum verifier +- manifest/ledger 전수성 테스트 +- 모든 `rust_snapshot`, `rust_assertion`, `contract` case +- 기준 SHA의 원본 268개 snapshot 전부 대응과 `cargo insta test` +- manifest에 기록한 원본 기준 실행 결과 978 pass / 0 fail과 source SHA 검증 + +기준 SHA의 숫자는 baseline이지 영구 상수는 아니다. SHA를 갱신하면 원본 test discovery +결과와 ledger/corpus를 함께 갱신한다. Rust CI는 원격 source를 실행하지 않지만, 갱신 +commit에 기록된 ID가 ledger/fixture/snapshot과 일치하지 않으면 실패한다. + +### 통합 및 live 테스트 + +- mock Streamable HTTP upstream과 mock host continuation의 동일 결과 +- 공식 Figma MCP가 설치된 환경의 opt-in host fallback smoke +- direct OAuth가 허용된 환경의 opt-in direct smoke +- 제공된 file `85CgSws3o5XsLv7aAwWJyS`, node `3879:35481`은 원본 디자인 + payload를 repository에 저장하지 않고 구조/완전성만 확인 +- 생성 TSX parse/type check와 생성 devup.json schema 검증 +- workspace 전체 `fmt`, `clippy -D warnings`, `test`, release build + +## 오류와 진단 + +기존 오류에 다음 안정적인 code를 추가한다. + +- `DEVUP_FIGMA_DIRECT_UNAVAILABLE` +- `DEVUP_FIGMA_CATALOG_REJECTED` +- `DEVUP_FIGMA_HOST_REQUIRED` +- `DEVUP_FIGMA_HANDOFF_EXPIRED` +- `DEVUP_FIGMA_HANDOFF_INVALID` +- `DEVUP_FIGMA_RESPONSE_TOO_LARGE` +- `DEVUP_COMPAT_CORPUS_DRIFT` + +모든 오류는 retry 가능 여부, source, 안전한 details를 포함한다. token, OAuth code, +verifier, Figma 사용자 정보, 원본 node 내용은 오류와 tracing에서 redact한다. + +## 구현 순서와 완료 기준 + +1. direct source 오류 분류, host handoff session과 `devup_figma_continue` +2. 완전 collector, 고정 serializer, chunk 병합과 node/page/file 수집 +3. variables/styles/assets 수집과 direct/host mock 계약 +4. 실제 공식 MCP live payload를 메모리에서 검증하고 JSON 계약 고정 gate 통과 +5. 검증된 serde type 기반 fixture envelope/schema와 Rust JSON loader/validator +6. 기준 plugin의 inline input을 JSON으로 이전하고 978개 ledger/268개 golden 연결 +7. `insta` compatibility runner와 JSON/snapshot 일대일 검증 +8. Rust NodeTree/prop/render/devup.json 규칙을 corpus 기반 TDD로 전수 이식 +9. JSON fixture 전체 gate 통과. 이 단계 전에는 검색 기능으로 넘어가지 않음 +10. `devup_figma_search`와 검색 결과별 `devup_figma_to_ui` 흐름 +11. workspace export, 전체 live 검증, lint/test/build, changepack, 문서와 배포 + +완료는 단순히 Rust test가 green인 상태가 아니다. pinned 원본의 모든 test ID가 ledger에 +있고, 모든 읽기/변환 케이스가 Rust snapshot/assertion/contract로 통과하며, 범위 밖 +항목도 이유와 읽기 전용 안전성 테스트가 있고, direct와 host 경로가 같은 artifact를 +내며, 관련 lint/test/build와 changepack이 통과해야 한다. + +## 개인정보, 보안과 남은 위험 + +- corpus에는 기준 저장소의 합성 mock만 포함하고 실제 사용자 Figma payload는 넣지 않는다. +- direct token은 OS keyring만 사용하며 공식 MCP token에는 접근하지 않는다. +- localhost callback은 명시적 direct login 중에만 loopback에 bind하고 즉시 종료한다. +- 사용자 JavaScript, upstream test code 또는 corpus executable code를 product에서 실행하지 않는다. +- Figma write tool은 direct allowlist와 host handoff 모두에서 생성하지 않는다. +- host가 반환한 result는 신뢰 경계 밖 입력으로 보고 크기/schema/context를 검증한다. + +가장 큰 남은 위험은 JavaScript의 Figma mock 함수와 plugin side effect를 손실 없이 +정규화된 JSON data로 이전하는 난이도, Remote MCP의 beta contract 변화, 대형 파일의 +호출 수와 quota다. 최초 이전에서 함수의 의미를 추측하지 않고 실제 기대값과 대조하며, +직렬화할 수 없는 경계는 ledger에 드러낸다. 대표 fixture가 기존 golden을 재현하지 +못하면 codegen 대량 이식을 계속하지 않고 fixture schema를 먼저 수정한다. diff --git a/docs/superpowers/specs/2026-08-31-figma-linked-screen-exploration-design.md b/docs/superpowers/specs/2026-08-31-figma-linked-screen-exploration-design.md new file mode 100644 index 0000000..5ed6739 --- /dev/null +++ b/docs/superpowers/specs/2026-08-31-figma-linked-screen-exploration-design.md @@ -0,0 +1,221 @@ +# Figma 링크 기반 화면 탐색과 사용 리소스 수집 설계 + +## 상태와 검증 기준선 + +- 작성일: 2026-08-31 +- 상태: 사용자 승인 +- 구현 저장소: dev-five-git/devup-mcp +- 기준 JavaScript 저장소: dev-five-git/devup-figma-plugin +- 승인된 접근: 명시적 탐색 후 정확한 node 변환(A안) +- 대상 실파일: 85CgSws3o5XsLv7aAwWJyS + +WQUW-151의 Jira 링크가 가리키는 3879:35481은 실제 화면이 아니라 +"[FR-026] 본연체"라는 4323×97 제목 frame이다. 공식 Figma MCP의 읽기 전용 +Plugin API로 확인한 결과, 같은 페이지의 제목 띠 아래에는 녹음, loading, +proofread 및 확인 상태를 나타내는 360px 화면 frame들이 배치되어 있다. + +사용자가 Figma Code 패널에서 확인한 전체 proofread 코드는 +3879:35518("A : STORY-F-PROOFREAD", 360×740)과 정확히 일치한다. 해당 +화면은 h3, bodyXs, bodySmSemibold, caption, h5, body, bodySemibold 등의 +text style과 backgroundLight, containerBackground, text, primary, border, +gray300, textLight, background, primaryLight, innerBg, borderBold 등의 color +variable을 실제로 사용한다. + +현재 devup_figma_to_ui는 variable/style 수집을 요청하지 않아 위 이름 대신 hex와 +개별 font 속성을 출력한다. 또한 live snapshot이 getStyledTextSegments를 호출하지 +않아 "[1. 이름]" 같은 부분 스타일의 nested Text typography를 보존하지 못한다. + +## 목표 + +1. Jira, 문서 또는 대화에서 받은 Figma 링크가 제목 띠나 주석을 가리켜도 관련 + 화면 후보를 에이전트가 자율적으로 찾을 수 있게 한다. +2. 후보가 여러 개일 때 하나를 조용히 추측하지 않고 전체 후보와 선택 근거를 + 반환한다. +3. 선택된 화면을 변환할 때 실제 사용한 로컬 및 원격 variable/style만 정확히 + 수집해 DevupUI $token과 typography를 복원한다. +4. mixed text segment의 children, 줄바꿈, 색상 및 typography를 보존한다. +5. direct Figma MCP와 host 공식 Figma MCP handoff가 동일한 Rust collector와 + 결과 계약을 사용한다. + +## 비목표 + +- Jira 자연어를 MCP 서버 내부에서 해석하거나 상태로 저장하지 않는다. +- 여러 후보 중 제품 의미상 올바른 화면을 서버가 임의 선택하지 않는다. +- OAuth token, 공식 Figma MCP credential 또는 사용자 계정 정보를 읽거나 + fixture에 기록하지 않는다. +- 전체 페이지 subtree를 한 번에 snapshot하여 응답 한도를 소모하지 않는다. + +## 사용자 흐름 + +~~~text +Jira/Figma 링크 + -> devup_figma_explore + -> anchor와 공간적으로 연결된 화면 후보 + text preview + -> 에이전트가 Jira 요구사항과 후보를 대조 + -> 필요한 canonical URL 각각을 devup_figma_to_ui로 변환 + -> 사용된 variable/style이 반영된 DevupUI TSX +~~~ + +기존 devup_figma_search는 파일 전체에서 이름으로 화면을 찾는 용도로 유지한다. +devup_figma_explore는 이미 주어진 링크를 기준으로 주변 화면 묶음을 찾는 별도 +도구다. + +## devup_figma_explore 계약 + +~~~json +{ + "url": "https://www.figma.com/design//?node-id=", + "limit": 50, + "includeTextPreview": true, + "sourcePolicy": "auto | direct | host" +} +~~~ + +완료 응답은 다음 정보를 포함한다. + +- anchor: 링크 원본 node의 id, name, type, bounds, child count 및 분류 +- group: 탐지된 요구사항/화면 묶음의 bounds와 제목 +- candidates: canonical URL, node id, name, type, bounds, child count, + text preview, score 및 모든 selection reason +- truncated: projection 또는 limit 때문에 후보가 잘렸는지 여부 +- source와 diagnostics + +같은 이름의 후보와 여러 상태 화면을 모두 유지한다. 정렬은 group 안에서 위에서 +아래, 왼쪽에서 오른쪽, 마지막으로 node ID 순서로 결정해 source와 실행 순서에 +무관하게 동일하다. + +## 주변 context projection + +Figma Plugin API 접근에 필요한 JavaScript는 데이터를 읽는 projection만 담당하고, +분류와 ranking은 Rust가 담당한다. + +projection은 anchor와 ancestor page의 compact metadata, anchor의 가로 band와 +교차하는 bounded page sibling, 다음 peer requirement heading 후보, screen +후보마다 제한된 첫 text preview만 반환한다. 전체 node field 또는 전체 페이지 +subtree는 읽지 않는다. 반환 node 수와 text 길이는 고정 상한을 적용하고 초과 시 +truncated=true를 반환한다. + +Rust는 다음 신호로 anchor를 분류한다. + +- screen-like: 일반적인 화면 폭/높이, 충분한 높이와 descendants +- heading-like: 낮은 높이, 큰 aspect ratio, 소수 child, 요구사항/설명형 이름 +- annotation-like: TEXT/VECTOR 또는 작은 설명 frame +- container-like: SECTION/FRAME 안에 여러 screen-like child + +heading-like anchor에서는 가로 band 아래의 screen-like page sibling을 다음 peer +heading 전까지 하나의 group으로 묶는다. WQUW-151에서는 3879:35481을 anchor로 +두고 3879:35518을 포함한 관련 상태 화면 전체를 반환한다. + +## 리소스 수집 모드 + +기존 include_variables bool을 의미가 명확한 내부 정책으로 교체한다. + +~~~rust +enum ResourceScope { + None, + Used, + File, +} +~~~ + +- None: search/explore처럼 token 값이 필요 없는 compact projection +- Used: devup_figma_to_ui가 선택 subtree에서 실제 참조하는 리소스만 수집 +- File: devup_figma_to_json이 파일의 로컬 variable/style catalog를 수집 + +### Used 수집 + +1. node snapshot을 먼저 완성한다. +2. Rust가 snapshot의 모든 JSON field를 재귀적으로 검사한다. +3. 모든 boundVariables 하위 id와 styled segment binding을 variable ID 집합으로 + 수집한다. +4. textStyleId, fillStyleId, strokeStyleId, effectStyleId, gridStyleId, + backgroundStyleId를 type별 style ID 집합으로 수집한다. +5. ID를 정렬·중복 제거하고 bounded batch로 getVariableByIdAsync와 + getStyleByIdAsync를 호출한다. +6. 반환된 실제 id/name/remote/type으로 codegen token map을 구성한다. + +이 방식은 전체 파일의 모든 token을 읽지 않으면서도 선택 화면에 필요한 token을 +빠짐없이 얻는다. ID 직접 조회이므로 파일 로컬 token뿐 아니라 선택 node에 실제 +binding된 library/remote token도 처리한다. + +### File 수집 + +devup_figma_to_json은 기존의 local collection/style catalog를 유지한다. 사용된 +원격 리소스를 확인할 수 있는 node/page scope에서는 Used scanner 결과를 합친다. +전체 파일에서 원격 사용 여부를 완전 탐색하지 않은 경우 usedRemoteComplete=false를 +유지해 완전성을 과장하지 않는다. + +## 실패와 fallback + +- ID 조회가 성공하면 이름 기반 $token 또는 typography를 사용한다. +- binding은 있으나 권한, 삭제 또는 API 오류로 리소스를 읽지 못하면 token 이름을 + 추측하지 않는다. +- 해당 속성은 snapshot의 resolved hex/font 값으로 fallback하고 + DEVUP_RESOURCE_UNRESOLVED 진단에 node ID, field와 resource ID를 남긴다. +- 일부 batch 실패는 성공한 리소스를 버리지 않지만 completeness는 partial로 + 낮춘다. +- Figma version이 수집 도중 달라지면 기존 version guard와 동일하게 재시도 가능한 + 충돌로 처리한다. + +## styled text segment 수집과 codegen + +snapshot.js는 TEXT node마다 다음 필드를 요청한 getStyledTextSegments 결과를 +styledTextSegments로 저장한다. + +- characters/start/end +- fills/fillStyleId +- fontName/fontSize/fontWeight +- textStyleId +- textDecoration/textCase +- lineHeight/letterSpacing +- listOptions/indentation/hyperlink + +segment 필드 목록은 Rust binary에 포함되는 별도 manifest로 관리한다. raw node의 +일반 field 수집은 그대로 유지한다. + +codegen은 root Text와 nested Text에 동일한 text style map을 전달한다. segment의 +textStyleId가 해석되면 typography=""을 출력하고 중복되는 raw font +속성은 생략한다. style이 다른 segment만 nested Text로 감싸고 동일한 segment는 +기존 텍스트와 줄바꿈 구조를 유지한다. + +## 테스트 전략 + +### Rust 단위 테스트 + +- heading/screen/annotation 분류, 다음 heading 경계와 공간 group +- 후보 중복 보존과 안정 정렬 +- recursive bound variable 및 style reference 추출 +- local/remote/missing resource merge와 completeness +- mixed segment의 root/nested typography + +### collector 및 MCP 계약 테스트 + +- direct/host explore 결과 parity +- bounded projection과 truncation +- ToUI가 ResourceScope::Used를 계획하는지 검증 +- ToJson이 ResourceScope::File을 유지하는지 검증 +- unresolved resource가 raw fallback과 진단을 함께 반환하는지 검증 + +### 실제 회귀 fixture + +공식 Figma MCP에서 읽은 3879:35481 주변 compact projection과 3879:35518 +subtree/resource 결과를 비밀정보 없이 JSON fixture로 고정한다. snapshot은 다음을 +검증한다. + +- explore가 실제 관련 화면 묶음을 반환한다. +- 생성 TSX에 VStack children과 긴 이야기 본문이 존재한다. +- bg="$backgroundLight", color="$primary", typography="h3", + typography="body"가 존재한다. +- 부분 강조가 typography="bodySemibold" nested Text로 생성된다. + +기존 JavaScript plugin 268 fixture corpus와 모든 Rust test를 함께 통과해야 한다. + +## 보안과 개인정보 + +- Figma OAuth credential은 기존 keyring 경계 밖으로 노출하지 않는다. +- 공식 Figma MCP host credential은 계속 devup-mcp가 직접 읽지 않는다. +- fixture에는 access token, 사용자 email/handle, request header와 OAuth callback + payload를 기록하지 않는다. +- 실제 디자인 텍스트는 회귀에 필요한 최소 subtree만 저장하고 source file key와 + node ID 외 계정 식별정보는 제거한다. +- 모든 Figma 동작은 읽기 전용이다. diff --git a/docs/superpowers/specs/2026-08-31-figma-single-call-envelope-design.md b/docs/superpowers/specs/2026-08-31-figma-single-call-envelope-design.md new file mode 100644 index 0000000..cd941ea --- /dev/null +++ b/docs/superpowers/specs/2026-08-31-figma-single-call-envelope-design.md @@ -0,0 +1,310 @@ +# Figma 단일 호출 무손실 수집과 DevupUI 출력 호환성 설계 + +## 상태와 기준선 + +- 작성일: 2026-08-31 +- 상태: 사용자 승인 +- 승인된 접근: A안 — 단일 호출 binary envelope와 검증 실패 시 기존 수집기 자동 fallback +- 구현 저장소: `dev-five-git/devup-mcp` +- 기준 JavaScript 저장소: `dev-five-git/devup-figma-plugin` +- 기준 upstream commit: `243db650f1d635ab5385546a2a297eae4ea93515` +- 실제 회귀 대상: file `85CgSws3o5XsLv7aAwWJyS`, node `3879:35518` + +현재 `devup_figma_to_ui`의 정확한 WQUW-151 화면 수집은 metadata 1회, +약 20개의 text snapshot page, variable 2 batch, style 2 batch로 대략 25개의 +공식 Figma tool call을 사용한다. 수집 결과 자체는 children, mixed text, +variable 및 text style 이름을 복원하지만, 응답 크기를 맞추기 위한 cursor와 +field truncation 때문에 호출 수가 크고 완전성 판단도 여러 응답에 분산된다. + +공식 Figma Plugin API runtime을 읽기 전용으로 조사한 결과 +`CompressionStream`, `TextEncoder`, `Blob`, `Response`는 제공되지 않는다. +따라서 브라우저 gzip에 의존하는 설계는 사용할 수 없다. 반면 +`figma.io.write`로 반환한 PNG의 custom ancillary chunk는 공식 MCP의 +`image/png` content block에서 byte 단위로 보존됨을 실제 marker round-trip으로 +확인했다. + +## 목표 + +1. 정확한 node 링크의 전체 subtree와 실제 사용 variable/style을 정상 경로에서 + 공식 Figma tool call 1회로 수집한다. +2. 현재 snapshot이 보존하는 모든 public data field, unknown enumerable field, + getter error, styled text segment와 resource binding을 유지한다. +3. binary transport를 신뢰하기 전에 형식, 크기, CRC, root, node 수 및 resource + 참조를 Rust에서 검증한다. +4. fast path가 지원되지 않거나 단 하나라도 검증에 실패하면 partial 결과를 쓰지 + 않고 검증된 legacy cursor collector로 자동 fallback한다. +5. JavaScript 플러그인 복사 결과와 MCP 결과의 의도된 차이를 명시하고 실제 변환 + 오류인 mixed individual stroke 누락을 수정한다. +6. synthetic snapshot corpus뿐 아니라 실제 Figma proxy/runtime 차이를 여러 URL의 + read-only live regression으로 보강할 수 있는 입력 계약을 마련한다. + +## 비목표 + +- Figma 파일, node, variable, style 또는 plugin data를 수정하지 않는다. +- 사용자 JavaScript를 upstream으로 전달하지 않는다. 실행 코드는 계속 Rust + binary에 compile-in된 enum variant로만 선택한다. +- OAuth token, header, callback parameter, 사용자 email/handle을 envelope, + fixture, diagnostic 또는 log에 기록하지 않는다. +- binary envelope를 downstream 사용자에게 이미지 결과로 노출하지 않는다. +- 모든 978개 upstream JavaScript 테스트를 Rust에서 동일한 테스트 프레임워크로 + 재실행한다고 과장하지 않는다. + +## 고려한 접근 + +### A. PNG data envelope + legacy fallback — 채택 + +한 `use_figma` script가 subtree, styled segments와 사용 resource를 모두 읽고 +UTF-8 JSON envelope를 만든다. 1×1 PNG의 반복 가능한 private ancillary chunk에 +payload를 넣어 `figma.io.write`로 반환한다. Rust는 image content block을 직접 +검증·해제한다. + +장점은 일반 화면을 한 번에 무손실 수집하고, 공식 MCP의 text 응답 한도에 +의존하지 않는다는 점이다. PNG는 여기서 화면 캡처가 아니라 공식 `io.write` +data 반환 채널의 framing 형식이다. + +### B. text page 크기 확대와 resource batch 결합 + +기존 12KB page를 16KB로 늘리고 variable/style을 한 batch로 합치면 약 25회를 +15~17회로 줄일 수 있다. 변경 위험은 낮지만 화면 크기에 비례해 호출 수가 계속 +늘고, field truncation 문제를 해결하지 못한다. A안의 최종 fallback 최적화로만 +사용한다. + +### C. codegen 전용 field projection + +현재 TSX에 필요한 field만 반환하면 1~2회 호출도 가능하지만 새 Figma field와 +향후 변환 기능을 잃는다. “모든 field를 먼저 보존한다”는 제품 방향과 충돌하므로 +채택하지 않는다. + +## Fast path 수집 흐름 + +~~~text +exact Figma URL + -> Rust URL parser가 fileKey/nodeId 확정 + -> use_figma(FastSnapshotEnvelope) 1회 + -> getNodeByIdAsync(nodeId) + -> BFS subtree snapshot + styled text segments + -> snapshot 전체에서 variable/style ID 추출 + -> Promise.all로 exact ID resource 조회 + -> JSON envelope UTF-8 encode + -> PNG private chunks에 저장 + -> figma.io.write + -> Rust PNG/envelope 검증 + -> CollectedParts로 정규화 + -> 기존 DevupUI codegen +~~~ + +정확한 node ID가 이미 있으므로 별도 `get_metadata`는 호출하지 않는다. 존재 여부, +node type과 child completeness는 fast snapshot 자체에서 검증한다. Jira 링크처럼 +heading을 가리키면 기존 `devup_figma_explore` 1회 후 선택된 화면의 fast snapshot +1회가 필요하므로 전체 흐름은 2회다. + +## Envelope와 PNG framing + +envelope schema version 1은 다음 논리 값을 가진다. + +~~~json +{ + "schemaVersion": 1, + "source": { + "fileKey": "...", + "rootId": "..." + }, + "snapshot": { + "fileKey": "...", + "version": null, + "rootIds": ["..."], + "nodes": [], + "diagnostics": [] + }, + "resources": { + "collections": [], + "variables": [], + "styles": [], + "usedRemoteVariables": [], + "localComplete": false, + "usedRemoteComplete": true, + "unresolved": [] + }, + "integrity": { + "nodeCount": 0, + "variableRefCount": 0, + "styleRefCount": 0, + "utf8Bytes": 0 + } +} +~~~ + +- UTF-8 encoder는 surrogate pair와 잘못된 lone surrogate를 명시적으로 처리하는 + compile-in JavaScript 구현을 사용한다. +- PNG signature, 고정 1×1 IHDR/IDAT, IEND 사이에 `duVp` private ancillary chunk를 + 둔다. 큰 payload는 순서 번호와 총 chunk 수를 가진 여러 chunk로 나눈다. +- 각 PNG chunk CRC32를 Rust가 재계산한다. 누락, 중복, 순서 오류, CRC 오류는 모두 + fast path 실패다. +- Rust는 base64 decode 후 최대 raw PNG와 최대 envelope 크기를 검사한 다음 JSON을 + decode한다. 기본 상한은 기존 handoff 16MiB JSON 한도 안에서 base64 overhead를 + 고려해 정한다. +- text content block에는 schema, node/resource 수, payload byte 수와 chunk 수만 + 담고 디자인 text나 credential은 반복하지 않는다. Rust는 이 descriptor와 binary + envelope 값을 교차 검증한다. +- image content block은 수집 내부에서 소비하고 최종 MCP 응답에는 포함하지 않는다. + +## Snapshot 완전성과 resource 수집 + +fast script는 현재 `snapshot.js`의 serializer를 공유하되 정상 fast path에서는 +text 응답용 `maxFieldBytes`/`maxNodeBytes` 축소를 적용하지 않는다. function, +symbol, node reference, circular object와 binary value는 기존의 명시적 marker로 +표현한다. getter 실패는 `fieldErrors`에 보존한다. + +public Plugin API manifest와 runtime enumerable/prototype field를 합쳐 읽는다. +`strokeWeight === figma.mixed`인 frame/rectangle은 +`strokeTopWeight`, `strokeRightWeight`, `strokeBottomWeight`, +`strokeLeftWeight`를 명시적으로 읽는다. manifest에 새 public data property가 +추가되면 기존 d.ts coverage test가 실패해야 한다. + +snapshot을 완성한 뒤 serialized value 전체를 재귀적으로 검사해 variable ID와 +style ID를 정렬·중복 제거한다. `getVariableByIdAsync`와 `getStyleByIdAsync`는 하나의 +`Promise.all` fan-out에서 실행하고 결과를 같은 envelope에 포함한다. unresolved +ID는 누락시키지 않고 kind, ID와 안전한 error classification을 기록한다. + +## 실패와 fallback + +다음 조건 중 하나라도 만족하면 fast 결과 전체를 폐기하고 legacy collector를 +처음부터 실행한다. + +- `use_figma`, `figma.io.write` 또는 image content capability가 없음 +- image block 없음, MIME 불일치, base64/PNG/envelope parse 실패 +- size limit, chunk sequence, CRC 또는 descriptor 교차 검증 실패 +- fileKey/rootId/rootIds 불일치 +- declared node 수와 실제 map 수 불일치 +- root가 없거나 child ID가 snapshot map에 없음 +- resource reference가 결과 또는 unresolved 목록 어디에도 없음 +- unsupported schema version + +fallback은 기존 cursor semantics를 유지하되 variable/style ID를 가능한 한 하나의 +combined resource batch로 합치고 page payload를 안전한 최대치까지 사용한다. +legacy truncation이 발생하면 기존처럼 diagnostic과 partial completeness를 반환하며 +완전한 결과로 표시하지 않는다. fast 실패 원인은 secret이나 전체 payload 없이 +collection stats/diagnostic으로 남긴다. + +## DevupUI 출력 호환성 + +### 실제 수정 대상 + +WQUW-151 하단 `Header` node `3879:35564`는 live Plugin API에서 다음 값이다. + +- `strokeWeight === figma.mixed` +- `strokeTopWeight = 1` +- `strokeRightWeight = 0` +- `strokeBottomWeight = 0` +- `strokeLeftWeight = 0` + +따라서 올바른 출력은 `borderTop="solid 1px $border"`이다. mixed weight를 알 수 없는 +일반 `1px border`로 fallback하는 현재 동작은 제거한다. 개별 면 값이 정말 +수집되지 않은 경우 모든 면 border를 추측하지 않고 diagnostic과 raw-safe fallback을 +사용한다. + +### 의도적으로 유지하는 차이 + +- MCP는 import와 named component wrapper를 포함하고 Figma Code panel은 JSX + fragment만 반환한다. +- 기본 `standalone` root layout은 Figma frame의 `w="360px"`, `h="740px"`와 + absolute child의 containing block인 `pos="relative"`를 보존한다. +- 새 `embedded` root layout은 선택 root의 고정 width/height/position만 생략해 + Figma Code panel fragment와 동일한 embedding semantics를 제공한다. +- formatter의 indentation과 긴 text line wrapping은 의미 차이로 취급하지 않는다. + +기본값은 기존 사용자의 렌더링을 깨지 않는 `standalone`이다. + +## JavaScript plugin fixture 감사 + +현재 upstream `main` SHA와 local pinned SHA는 모두 +`243db650f1d635ab5385546a2a297eae4ea93515`다. + +- source test file: 54 +- upstream passing test: 978 +- JSON input/golden snapshot: 268/268 + - codegen 260 + - responsive 5 + - render/snapshot 3 +- ledger entry: 978 + - `rust_snapshot` 252 entries가 268개 fixture를 생성 + - `rust_assertion` 550 + - `contract` 137 + - `upstream_runtime_only` 21 + - `out_of_scope_write` 18 + +즉 upstream의 모든 snapshot-producing fixture는 JSON과 golden으로 수집되어 현재 +byte parity를 통과한다. 그러나 모든 978개 JavaScript test가 독립 실행 가능한 +Rust fixture로 이식된 것은 아니다. 특히 550개 `rust_assertion` ledger가 가리키는 +`compat_fixtures::upstream_ledger_mapping` 이름은 현재 실제 테스트 symbol이 아니므로 +“전체 테스트 parity”의 근거로 사용할 수 없다. + +이번 작업은 다음을 함께 수정한다. + +1. 문서 표현을 “268개 snapshot parity + 978개 test inventory”로 정확히 고친다. +2. ledger의 `rustTest`가 명시적 Rust coverage registry에 존재하는지 검사한다. +3. TSX 출력에 직접 영향을 주는 assertion은 실제 Rust unit/fixture test로 연결한다. +4. upstream runtime 또는 write-only test는 이유가 있는 분류로 유지하되 snapshot + parity 수치에 포함하지 않는다. + +## 추가 URL과 기대 결과 수집 + +사용자가 제공하는 여러 실제 URL과 Figma Code panel 결과는 synthetic fixture가 +잡지 못하는 proxy getter, library instance, remote variable, mixed text, individual +stroke와 대형 subtree 회귀를 검증하므로 가치가 크다. 구현을 시작하기 위한 +선행조건은 아니며 다음 형식이면 자동화하기 가장 좋다. + +- node가 포함된 Figma URL +- 같은 selection에서 Figma가 복사한 TSX 또는 기대하는 핵심 부분 +- `standalone`/`embedded` 중 비교할 root mode +- 비공개 text를 fixture에 보존해도 되는지 여부 + +각 URL은 read-only로 수집하고 개인정보·credential을 검사한 뒤, 공개 저장소에 +넣기 부적절한 실제 문구는 구조를 유지한 synthetic text로 sanitize한다. 원문을 +fixture에 커밋할 필요가 없으면 CI secret 기반 opt-in live contract로만 유지한다. + +## TDD와 검증 기준 + +### Binary transport + +- valid multi-chunk PNG envelope round-trip +- bad signature, invalid length, missing/duplicate/out-of-order chunk, CRC mismatch +- invalid UTF-8/JSON/schema, oversized image/envelope +- image 없는 text-only 응답이 legacy fallback을 시작함 +- fast/legacy가 동일한 `CollectedPayload`와 TSX를 생성함 + +### Collector + +- exact `to_ui` 정상 경로가 metadata/resource 추가 호출 없이 1 call로 완료됨 +- heading explore 후 exact 변환이 총 2 call임 +- capability/parse/integrity failure가 partial 값을 쓰지 않고 cursor 0부터 fallback함 +- fallback variable/style combined batch와 stable ordering +- direct 및 host handoff가 동일한 state machine과 결과를 사용함 + +### Snapshot/codegen + +- mixed individual stroke mock가 `borderTop`만 생성함 +- individual stroke 정보가 없을 때 all-side border를 추측하지 않음 +- WQUW-151 fixture가 144 node, 13 variable, 11 text style을 유지함 +- WQUW-151 TSX가 실제 Figma 복사본의 children/token/typography와 의미상 같고 + `borderTop`을 출력함 +- standalone root와 embedded root snapshot + +### Compatibility와 전체 검증 + +- 268/268 upstream JSON golden parity +- 978-entry inventory와 실제 coverage registry 정합성 +- crate별 focused test, workspace fmt/clippy/test/build +- live WQUW-151 one-call contract와 automatic fallback smoke test +- changepack, focused commit, push, 기존 PR 업데이트 및 Codex binary 재설치 + +## 관측성, 보안과 개인정보 + +최종 결과에 `figmaToolCalls`, `transport`, `fallbackUsed`, `nodeCount`, +`variableCount`, `styleCount`, `rawBytes`, `wireBytes`를 포함한다. 디자인 원문, +variable 값, OAuth token과 account identifier는 stats/log에 넣지 않는다. + +PNG/envelope parser는 untrusted upstream input으로 취급해 크기 상한, checked integer +연산, CRC와 schema 검증을 먼저 수행한다. 실패는 panic 없이 stable error 또는 +legacy fallback으로 처리한다. 모든 embedded JavaScript는 read-only API만 사용하며 +Figma document mutation API가 포함되지 않는지 source contract test로 검사한다. diff --git a/docs/superpowers/specs/2026-09-01-devup-mcp-figma-correctness-and-reuse-design.md b/docs/superpowers/specs/2026-09-01-devup-mcp-figma-correctness-and-reuse-design.md new file mode 100644 index 0000000..b8ecf7c --- /dev/null +++ b/docs/superpowers/specs/2026-09-01-devup-mcp-figma-correctness-and-reuse-design.md @@ -0,0 +1,397 @@ +# devup-mcp Figma 정확성·재사용 강화 설계 + +## 상태 + +- 승인일: 2026-09-01 +- 대상 branch: `owjs3901/figma-remote-mcp` +- 대상 PR: +- 선행 설계: + - `2026-08-31-figma-host-fallback-parity-design.md` + - `2026-08-31-figma-linked-screen-exploration-design.md` + - `2026-08-31-figma-single-call-envelope-design.md` + +이 문서는 기존 Figma Remote MCP 구현을 대체하지 않는다. 이미 구현된 Rust workspace, +read-only direct/host 수집, exact-node 단일 호출, JSON fixture parity와 화면 탐색 위에서 +정확성 계약, 재사용, 진단과 남은 corpus 이전을 강화한다. + +## 현재 기준선 + +현재 workspace는 다음 3개 crate로 구성된다. + +- `devup-mcp`: stdio MCP server, source orchestration, host handoff와 공개 tool +- `devup-mcp-figma`: URL, OAuth, upstream MCP, read-only script, snapshot과 resource 수집 +- `devup-mcp-devup-ui`: DevupUI TSX와 `devup.json` projection + +설계 승인 시점의 검증 결과는 다음과 같다. + +- `cargo test --workspace`: 116개 통과, 인증 입력이 필요한 opt-in live test 1개 제외 +- exact-node fast path: 공식 `use_figma` 호출 1회 +- WQUW-151 proofread fixture: 144개 node, 변수 참조 20개, text style 11개 +- pinned plugin corpus: 54개 test file, 978개 test ID, 268개 golden snapshot +- Rust golden parity: 268/268 +- ledger: `rust_snapshot` 252, `rust_assertion` 550, `not_ported` 137, + `upstream_runtime_only` 21, `out_of_scope_write` 18 + +## 문제 정의 + +기존 구현은 정상 exact-node 흐름에서는 충분히 빠르고 WQUW-151의 핵심 TSX를 재현한다. +그러나 다음 항목은 아직 성공 응답의 의미와 장기적인 Figma 변경 대응을 약하게 만든다. + +1. `ThemeScope`가 실제 variable/style filtering에 적용되지 않는다. +2. 동일 token key의 서로 다른 variable 후보가 결정적으로 충돌 해결되지 않는다. +3. UI, theme, raw snapshot을 연속 요청하면 같은 Figma 데이터를 다시 수집할 수 있다. +4. legacy snapshot 병합 후 전체 child graph 완전성을 별도 감사하지 않는다. +5. field truncation과 unsupported fallback이 `status: complete`와 명확히 분리되지 않는다. +6. Section 링크에서 내부 화면을 찾은 다음 다중 frame을 내보내는 계약이 분리돼 있다. +7. 생성 TSX의 prop이 어느 Figma node/field/resource에서 왔는지 추적하기 어렵다. +8. 매우 큰 computed field는 전체 값 대신 truncation marker로 끝날 수 있다. +9. upstream corpus의 137개 test ID가 `not_ported` 상태다. + +## 핵심 결정 + +### 기존 3개 crate 구조를 유지한다 + +새 `devup-ir`, `devup-auth`, `devup-cache`, `devup-mcp-server` crate를 만들지 않는다. +원본 보존과 완전성은 Figma snapshot 계약이고, projection은 DevupUI의 책임이며, 수집 +artifact의 수명과 MCP 재사용은 server의 책임이다. + +### 수집과 projection을 분리한다 + +모든 변환은 검증된 하나의 acquisition artifact를 입력으로 사용한다. + +```text +Figma URL + -> Target classification + -> Read-only acquisition + -> RawSnapshot + ResourceSnapshot + -> Completeness audit + -> In-memory artifact + -> TSX / devup.json / raw JSON / source map projections +``` + +동일 artifact에서 여러 projection을 만들 때 Figma를 다시 호출하지 않는다. + +### 정보 손실을 조용히 성공으로 처리하지 않는다 + +완전성 상태는 다음 3개로 고정한다. + +- `complete`: 요청한 범위의 node graph와 필수 projection field가 모두 보존됨 +- `partial`: 사용 가능한 결과를 생성했지만 누락, truncation 또는 unsupported fallback 존재 +- `failed`: 안전한 artifact를 생성할 수 없거나 strict 요구를 만족하지 못함 + +기본 모드는 복구 가능한 결과를 `partial`로 반환한다. `strict: true`이면 partial도 안정적인 +오류 code와 completeness report를 반환한다. 어떤 모드에서도 누락을 `complete`로 숨기지 않는다. + +## 데이터 계약 + +### AcquisitionArtifact + +server는 수집이 끝나면 다음 논리 구조를 등록한다. 실제 공개 Rust type 이름은 구현 계획에서 +테스트와 함께 확정하되 필드 의미는 이 계약을 따른다. + +```text +AcquisitionArtifact + artifact_id + target + source + transport + source_version + schema_hash + content_hash + snapshot + resources + completeness + diagnostics + stats +``` + +`artifact_id`는 credential이나 Figma 사용자 정보를 포함하지 않는 opaque ID다. +`content_hash`는 canonical snapshot/resource bytes에서 계산하며 응답에는 필요할 때만 노출한다. + +### CompletenessReport + +완전성 감사 결과에는 최소한 다음 항목이 들어간다. + +- requested root 수 +- preserved/reachable/orphan node 수 +- declared/exported child 수 +- missing child ID와 parent node ID +- parent-child 역참조 불일치 +- duplicate/conflicting node 수 +- field error 및 truncated field 수 +- unresolved variable/style/asset 수 +- graph, fields, resources 각각의 상태 + +root에서 `childrenIds`를 순서대로 순회하며 모든 child가 존재하는지 확인한다. child의 +`parentId`가 수집 범위 안에서 확인 가능하면 역참조도 검증한다. 숨겨진 node와 instance의 +실제 children도 일반 child와 동일하게 보존한다. + +`childCount`가 제공되면 `childrenIds` 수와 비교한다. Figma API가 해당 필드를 제공하지 않는 +경우 count를 추측하지 않고 `not-observed`로 기록한다. + +### Diagnostic + +기존 `code`, `message`, `nodeId`를 유지하면서 다음 필드를 additive하게 추가한다. + +- `severity`: `info`, `warning`, `error` +- `property`: 관련 Figma field 또는 생성 prop +- `resourceKind`, `resourceId` +- `fallback`: 적용한 fallback 종류 +- `recoverable` +- `details`: 원문 디자인 값과 secret을 포함하지 않는 구조화 정보 + +token, OAuth code, verifier, 사용자 정보와 실제 text 내용은 diagnostic/tracing에 넣지 않는다. + +## 변수, style과 theme 충돌 + +### 결정적 후보 처리 + +variable은 `HashMap::values()` 순회 결과로 projection하지 않는다. 모든 후보를 안정적으로 +정렬하고 token/mode별 후보 집합을 만든다. + +후보 값이 같으면 하나로 병합하고 provenance에 모든 source ID를 남긴다. 값이 다르면 다음 +우선순위로 winner를 선택한다. + +1. 명시적인 `codeSyntax.WEB` token +2. local variable +3. 실제 node에서 사용된 remote variable +4. 정규화된 Figma variable name +5. collection name, variable name, variable ID의 lexical order + +마지막 lexical order는 의미 우선순위가 모두 같은 경우의 결정성만 보장한다. + +충돌은 `DEVUP_THEME_TOKEN_CONFLICT` warning으로 반환하고 모든 후보의 collection, mode, +raw name, resource ID와 값 hash를 결과 metadata에 보존한다. devup.json에는 winner 하나만 +기록해 기존 schema를 깨지 않는다. 전체 원본 후보는 acquisition artifact에서 손실 없이 +유지된다. + +### alias와 fallback + +- alias는 variable ID와 mode ID 쌍으로 순환을 감지한다. +- alias 대상 mode가 없으면 collection default mode를 안전하게 확인한다. +- 실제 resolved value가 있으면 color/length로 projection한다. +- node-bound raw paint 또는 실제 text/style 값이 있으면 TSX에 hex/px fallback을 사용할 수 있다. +- 존재하지 않는 token 이름이나 값을 추측해서 만들지 않는다. +- collection/mode가 없는 후보는 중단하지 않고 `unresolvedVariables`와 diagnostic에 남긴다. + +### scope + +- `node`: 선택 subtree에서 실제 참조된 variable/style만 포함 +- `page`: page subtree에서 실제 참조된 항목과 필요한 alias dependency만 포함 +- `file`: 수집 가능한 local 전체와 실제 사용된 remote variable 포함 + +응답의 completeness가 해당 범위를 증명하지 못하면 `full-local-plus-used-remote`를 반환하지 +않는다. + +## 호출 최적화와 artifact cache + +### 복수 projection + +하나의 공개 export 흐름에서 다음 output을 복수 선택할 수 있게 한다. + +- `tsx` +- `devupJson` +- `rawSnapshot` +- `sourceMap` +- `assetManifest` + +기존 `devup_figma_to_ui`와 `devup_figma_to_json`은 호환 wrapper로 유지한다. + +### fast 수집 + +- exact node의 subtree와 used resources는 현재처럼 정상 경로 1회 호출을 유지한다. +- full theme는 크기 제한 안에서 variable collection, variable, style을 하나의 read-only + `use_figma` envelope로 수집하는 fast path를 추가한다. +- response가 제한을 넘거나 contract가 달라지면 같은 source의 cursor/batch legacy 경로를 + 0부터 원자적으로 재시작한다. +- direct source가 catalog/auth/capability 경계에서 실패하면 `auto` 정책이 host official MCP + handoff로 전환한다. +- rate limit, node not found, version conflict는 다른 source로 무조건 재시도하지 않는다. + +### cache 정책 + +cache는 `devup-mcp` process 내부에만 둔다. + +- request alias key: source policy, file key, node ID, scope와 acquisition option +- canonical key: source, file key, source version, schema hash와 content hash +- bounded LRU + TTL +- 전체/항목별 byte 상한 +- single-flight로 같은 동시 요청 병합 +- `refresh: true`로 강제 재수집 +- process 종료 시 자동 폐기 +- credential, screenshot과 binary asset bytes는 cache key나 stats에 포함하지 않음 + +source version을 새 API 호출 없이 확인할 방법은 없으므로 TTL 안의 reuse는 명시적인 freshness +정책이다. 응답에는 `cacheHit`, `artifactId`, `acquiredAt`, `expiresAt`과 call count를 포함한다. + +## Section, 검색과 다중 Frame export + +링크 target을 `file`, `page`, `section`, `screen-frame`, `component`, `other`로 분류한다. + +Section 또는 대형 container가 입력되면 단일 거대 TSX를 기본 생성하지 않는다. 먼저 하위 +screen candidate를 visual order로 반환한다. + +각 candidate는 다음을 포함한다. + +- node ID, name, type +- bounds, child count, visible state +- parent/breadcrumb +- screen classification 근거 +- canonical URL + +export는 다음 선택을 받는다. + +- 정확한 단일 frame ID +- frame ID 목록 +- `allScreens: true` + +기존 `search`는 파일 전체 이름 탐색에 사용하고, `explore`는 링크 주변/내부 화면 선택에 +사용한다. 공개 tool은 대상 분류와 artifact reuse를 additive하게 보강하며 기존 agent 흐름을 +깨지 않는다. + +## 대형 field와 asset + +### 대형 field + +inline 안전 상한을 넘는 field를 즉시 버리지 않고 descriptor를 반환한다. + +```text +LargeValueDescriptor + node_id + field + byte_length + content_hash + cursor +``` + +collector는 descriptor가 있는 field를 bounded continuation으로 읽어 content-addressed chunk로 +재조립한다. 청크 누락, 중복, hash 불일치는 전체 field를 partial로 표시하며 complete로 +승격하지 않는다. + +Figma runtime이 getter를 거절하거나 private plugin data처럼 읽을 권한이 없는 값은 +`unsupported-by-upstream`으로 구분한다. 접근 가능한 값의 단순 크기 문제와 권한 문제를 같은 +truncation으로 취급하지 않는다. + +### asset + +- image hash, export setting, vector/network reference와 source node를 asset manifest에 보존한다. +- read-only `exportAsync`가 허용되는 source에서는 요청된 asset만 SVG/PNG로 내보낸다. +- binary는 MCP 응답에 무제한 inline하지 않고 명시적 output path 또는 bounded resource로 제공한다. +- asset export 실패가 일반 layout/text subtree를 제거하지 않는다. +- 누락 asset은 node/property별 diagnostic과 placeholder provenance를 가진다. + +## Source map + +기본 TSX에는 `data-figma-node`나 debug comment를 강제로 삽입하지 않는다. runtime DOM과 기존 +golden 출력을 바꾸지 않는 별도 sidecar source map을 생성한다. + +각 entry는 다음을 연결한다. + +- 생성 artifact와 UTF-8 byte range 또는 JSON pointer +- Figma node ID +- 입력 field 목록 +- variable/style/asset ID +- direct mapping, normalized mapping, inferred layout 또는 fallback 종류 + +formatter 이후 range가 달라지지 않도록 codegen fragment가 source span을 함께 조립하고 최종 +렌더러가 offset을 확정한다. + +## 테스트 전략 + +### TDD 원칙 + +각 변경은 실패하는 작은 contract/snapshot test를 먼저 추가하고 구현 후 기존 전체 suite를 +재실행한다. snapshot은 자동 accept하지 않으며 의도한 출력 변경만 검토한다. + +### WQUW-151 실제 계약 + +- Section `4217:7743` 내부 frame 목록과 visual order +- proofread frame `3879:35518`의 144-node graph +- 모든 paragraph text와 nested `[1. 이름]` +- 20개 variable 참조, 11개 typography style +- individual footer top stroke +- standalone/embedded root layout +- TSX + used-token theme composite export의 정상 1-call 수집 +- 같은 artifact 재사용 시 추가 upstream call 0회 + +실제 fixture에는 token, OAuth credential, Figma 사용자 정보 또는 계정 식별자를 넣지 않는다. +디자인 원문을 repository에 보존하는 fixture는 현재 repository visibility와 사용 권한을 확인한 +범위에 한한다. + +### plugin corpus + +137개 `not_ported`를 모두 재분류한다. + +- 읽기/변환 의미가 있으면 JSON fixture, Rust assertion 또는 contract test로 이전 +- 실제 plugin process lifecycle만 의미가 있으면 근거와 가장 가까운 Rust boundary test 연결 +- mutation 동작만 `out_of_scope_write` 유지 +- 최종 ledger에서 `not_ported`는 0이어야 함 + +기존 268개 golden은 output compatibility gate로 계속 byte parity를 유지한다. + +### 필수 명령 + +```text +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace +cargo insta pending-snapshots +cargo build --workspace --release +``` + +live contract는 인증된 official host MCP 결과를 secret 출력 없이 검증한다. CI 비용 문제로 +원격 workflow가 비활성 또는 실패하더라도 로컬 검증 결과와 CI 상태를 분리해 보고한다. + +## 보안과 개인정보 + +- Figma 기능은 계속 read-only allowlist와 compiled-in script만 사용한다. +- 사용자 제공 JavaScript나 fixture code를 product에서 실행하지 않는다. +- direct OAuth credential은 OS keyring에만 저장한다. +- localhost callback은 명시적인 login 중에만 `127.0.0.1`에 bind하고 종료한다. +- host official MCP credential에는 접근하거나 복사하지 않는다. +- snapshot과 screenshot은 기본적으로 디스크에 저장하지 않는다. +- artifact cache는 메모리 전용, bounded, TTL 기반이다. +- diagnostics, stats와 tracing은 디자인 text와 인증 정보를 포함하지 않는다. + +## 구현 순서 + +1. completeness/status/diagnostic 계약과 graph auditor +2. 결정적 theme resolver, non-fatal conflict와 실제 scope filtering +3. acquisition artifact, composite export와 bounded cache +4. Section target classification과 다중 frame export +5. large field continuation과 asset manifest/export +6. TSX/devup.json source map +7. WQUW-151 Section/10-frame 실제 회귀 fixture와 visual 보조 검증 +8. 137개 `not_ported` 제거 +9. 전체 fmt/clippy/test/insta/release/live 검증 +10. changepack, focused commits, push, PR #1 갱신과 Codex binary 재설치 + +각 단계는 독립적인 focused commit으로 남기고 이전 단계의 contract가 green인 상태에서만 다음 +단계로 진행한다. + +## 완료 기준 + +- 누락 child 또는 필수 field가 있는 결과는 `complete`가 아니다. +- theme/token 충돌은 결정적이며 변환 전체를 중단하지 않는다. +- node/page/file theme scope가 실제 참조 범위를 반영한다. +- exact-node composite export의 정상 upstream 호출 수는 1회다. +- 동일 artifact의 후속 projection은 추가 upstream 호출 0회다. +- Section 링크에서 내부 화면 목록과 선택/batch export가 가능하다. +- TSX와 devup.json의 주요 출력에 Figma provenance를 역추적할 수 있다. +- 접근 가능한 대형 field를 단순 byte 상한 때문에 조용히 버리지 않는다. +- plugin corpus ledger의 `not_ported`가 0이다. +- WQUW-151의 text, children, color token, typography와 stroke 회귀가 모두 통과한다. +- 모든 관련 로컬 lint/test/build와 snapshot 검증이 통과한다. +- changepack, commit SHA, PR URL, 설치 버전, 보안 검토와 남은 upstream 제약을 최종 보고한다. + +## 남은 외부 제약 + +- private OAuth client는 Figma MCP Catalog 승인 전 direct registration이 거절될 수 있다. +- 사용되지 않은 외부 library variable 전체는 official MCP가 제공하지 않을 수 있다. +- Figma runtime이 공개하지 않는 private data와 오류를 내는 getter는 읽을 수 없다. +- official `use_figma` contract가 바뀌면 adapter와 live contract 갱신이 필요하다. +- 매우 큰 파일은 정확성을 유지하기 위해 단일 호출보다 cursor continuation이 필요할 수 있다. + +이 제약은 호출 수를 줄이기 위해 결과를 생략하는 근거로 사용하지 않는다. 빠른 경로가 안전 +상한을 넘으면 느리더라도 완전한 legacy/continuation 경로로 전환하고 그 사실을 stats와 +diagnostics에 명시한다. diff --git a/docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md b/docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md new file mode 100644 index 0000000..973ec33 --- /dev/null +++ b/docs/superpowers/specs/2026-09-01-devup-mcp-hardening-and-delivery-design.md @@ -0,0 +1,498 @@ +# Devup MCP Hardening and Delivery Design + +## 목적 + +현재 Figma → DevupUI 변환의 정확성 계약을 다음 단계까지 확장한다. + +1. cached artifact가 요청한 asset의 ID뿐 아니라 format과 scale까지 정확히 포함하는지 검증한다. +2. 명시된 `outputPath` 기록을 허용된 workspace 안으로 제한하고, 검증 완료 전에는 어떤 파일도 바꾸지 않는다. +3. 대형 Section에서 전체 subtree를 먼저 내려받지 않고 화면 목록을 찾은 뒤 선택한 여러 Frame만 bounded batch로 수집한다. +4. 큰 TSX, JSON, source map과 binary를 MCP 표준 Resource로 전달해 tool response 상한을 피한다. +5. 생성 TSX의 문법과 의미 보존을 Rust에서 검증하고 실제 렌더 screenshot 비교를 위한 안전한 경계를 제공한다. +6. 이 기능을 추가하면서 1,300줄을 넘은 server router를 acquisition, projection, delivery와 output 책임으로 분리한다. + +이 문서는 위 항목을 한 번에 뒤섞어 구현하는 계획이 아니라, 각 단계가 독립적으로 검증되고 배포될 수 있는 통합 아키텍처를 정한다. + +## 현재 확인된 공백 + +### Asset reuse + +`CollectionRequest`와 artifact cache key는 `AssetSelection { asset_id, format, scale }` 전체를 보존한다. 그러나 `PendingOperation::Export`는 이를 `asset_ids: Vec`으로 축소하고, artifact 재사용 시 payload에 같은 ID가 있는지만 확인한다. 따라서 `logo`의 PNG 1x artifact를 SVG 4x 요청에 재사용해도 기존 binary가 통과할 수 있다. + +### Filesystem output + +현재 `write_binary_output`은 사용자 경로의 상위 폴더를 만들고 바로 `std::fs::write`한다. 허용 루트, `..`, junction/symlink 탈출, 여러 출력의 부분 기록, 기존 파일 복구와 crash 시 임시 파일 정리 계약이 없다. strict 검증 전 기록은 이미 막았지만, non-strict 다중 출력의 두 번째 기록이 실패하면 첫 번째 파일은 남는다. + +### Section collection + +현재 Section export는 Section artifact 전체를 수집한 뒤 그 안에서 후보를 찾고 `selection_required`를 반환한다. WQUW-151 Section처럼 전체 fast envelope가 8 MiB를 넘는 경우 사용자가 Frame 하나만 원해도 큰 subtree 수집과 fallback을 먼저 수행한다. + +### Delivery + +Tool result는 생성 text와 base64 asset을 inline한다. Artifact cache 자체는 bounded지만 한 번의 MCP response에 들어가는 output 크기 계약은 없다. `rmcp` 3.1.4는 `resources/list`, `resources/templates/list`, `resources/read`, text/blob `ResourceContents`와 Resource Link를 지원하므로 사설 continuation 프로토콜을 추가할 이유가 없다. + +### Fidelity + +268개 upstream JSON golden과 WQUW-151 fixture는 변환 source의 결정성을 검증하지만 브라우저가 실제 렌더한 pixel까지 증명하지 않는다. 또한 projection quality는 알려진 diagnostic code 세 개를 문자열로 열거하므로 새 fallback diagnostic이 추가되면 quality가 잘못 `exact`가 될 수 있다. + +## 설계 원칙과 제약 + +- 제품 server, collector, codegen과 기본 CI는 계속 순수 Rust/Cargo workspace다. +- 사용자 제공 JavaScript를 실행하지 않는다. Figma에서는 compiled-in read-only script만 실행한다. +- Figma OAuth scope와 official MCP fallback은 넓히지 않는다. +- 기존 tool 이름과 작은 응답의 주요 JSON 필드는 유지한다. +- artifact, projected resource와 screenshot은 memory-only, bounded, TTL 기반이 기본이다. +- design text, token 값, URL, asset ID, OAuth 정보는 로그와 cache 통계에 기록하지 않는다. +- 기존 268개 golden과 WQUW-151 열 Frame fixture는 각 단계의 회귀 게이트다. +- 모든 새 요청 값은 projection과 filesystem mutation 전에 검증한다. + +## 검토한 접근과 선택 + +### 대형 결과 전달 + +1. **inline 상한만 높인다.** 가장 단순하지만 client/transport 상한을 서버가 통제할 수 없고 base64 팽창도 해결하지 못한다. +2. **사설 continuation tool을 만든다.** 현재 handoff와 유사하지만 MCP client가 별도 호출 규칙을 배워야 하고 표준 Resource와 중복된다. +3. **MCP Resource를 사용한다.** 작은 결과는 inline하고 큰 결과는 manifest와 bounded chunk URI로 읽는다. + +3번을 선택한다. 표준 기능이고 artifact TTL과 같은 메모리 수명 모델을 재사용할 수 있다. + +### Filesystem 격리 + +1. 문자열 canonicalize 후 prefix 비교는 생성 전 경로와 symlink 교체 경쟁을 안전하게 막지 못한다. +2. 모든 기록을 제거하면 안전하지만 명시적 `outputPath` workflow를 잃는다. +3. process 시작 시 pre-open한 허용 root capability를 기준으로 상대 경로만 해석하고 staging/commit한다. + +3번을 선택한다. `cap-std` 계열 capability API를 사용하고 기본 허용 root는 server 시작 시 canonical current directory 한 곳이다. 반복 가능한 `--allow-write-root `로만 범위를 추가한다. + +### 실제 시각 회귀 + +1. Bun/Playwright harness를 workspace에 넣으면 실제 DevupUI 렌더 fidelity는 가장 높지만 Cargo-only 기본 계약을 깨고 package drift가 다시 생긴다. +2. 구조 비교만 하면 Cargo-only지만 browser layout, font metric과 CSS compiler 차이를 pixel 수준에서 검출하지 못한다. +3. Rust semantic validator와 Rust image comparator를 기본 제공하고, 실제 DevupUI render는 소비자 repo가 명시적으로 제공하는 adapter contract로 연결한다. + +3번을 선택한다. devup-mcp는 reference Figma screenshot, generated TSX, semantic report와 pixel comparator를 제공한다. 실제 React/DevupUI bundle 생성은 그 dependencies를 이미 소유한 소비자 프로젝트에서 수행한다. 따라서 기본 Cargo suite는 외부 runtime 없이 완전하게 실행되고, opt-in visual job은 실제 renderer까지 검증한다. + +### Server 분해 + +기능별 새 crate를 매번 추가하면 public type 이동과 dependency cycle이 커진다. 반대로 `server/mod.rs` 안에서 계속 확장하면 router, state machine, projection과 I/O 테스트가 결합된다. 우선 `devup-mcp` crate 내부 module로 server 책임을 분리하고, 재사용성이 입증된 image comparator만 `devup-mcp-visual` crate로 분리한다. + +## 단계 A: Asset capture와 안전한 output transaction + +### 정확한 asset contract + +공개 입력은 기존 `assetRequests`를 유지한다. 내부에서는 축소하지 않고 다음 값 객체를 끝까지 전달한다. + +```rust +struct AssetCapture { + asset_id: String, + format: AssetFormat, + scale: u8, +} +``` + +- `PendingOperation::Export.asset_ids`를 `asset_captures: Vec`로 교체한다. +- output path도 asset ID 문자열이 아니라 capture key에 연결한다. +- 같은 요청에서 같은 asset ID를 서로 다른 format/scale로 두 번 요청하는 것은 기존처럼 거절한다. 한 manifest entry와 한 output path가 한 ID에 대응하는 현재 공개 shape를 유지하기 위해서다. +- cached artifact 내부 capability는 정확한 capture set을 가진다. +- 공개 `cache.capabilities`에는 `assetCaptureCount`만 추가하고 asset ID, token 또는 파일명은 노출하지 않는다. +- artifact reuse는 요청 capture 각각에 대해 ID, format, scale이 모두 같은 exported payload가 있는지 projection 전에 검사한다. +- 누락 또는 불일치는 `DEVUP_FIGMA_HANDOFF_INVALID`와 non-sensitive expected/available count만 반환한다. URL 재수집 안내는 유지한다. + +`AssetManifestEntry`는 `status=exported`일 때 실제 export format과 scale을 반드시 보존해야 한다. 아직 export하지 않은 `available` entry는 지금처럼 둘 다 `None`일 수 있다. 구버전 또는 잘못된 artifact에 `exported`이면서 format/scale이 없으면 PNG 1x로 추측하지 않고 incompatible artifact로 거절한다. + +### Output policy + +server configuration에 다음 정책을 둔다. + +```rust +struct OutputPolicy { + roots: Vec, + display_roots: Vec, +} +``` + +- `devup-mcp` 시작 시 current directory를 한 번 canonicalize하고 capability로 연다. +- `--allow-write-root `는 반복 가능하고 시작 시 존재하는 directory만 허용한다. +- 상대 `outputPath`는 첫 번째 root 기준이다. +- 절대 경로는 정확히 한 허용 root 아래여야 하며 그 root에 상대화한 뒤 capability API로만 연다. +- 빈 경로, directory target, `..`, Windows drive/UNC 전환, alternate data stream, root 밖 symlink/junction은 거절한다. +- 반환 경로는 검증된 display root와 정규화된 상대 경로로 조립하며 credential이나 원본 design 내용을 포함하지 않는다. + +### Transaction semantics + +모든 text와 binary output은 하나의 `OutputTransaction`으로 처리한다. + +1. output 이름, target, 중복 target, parent와 예상 byte 수를 모두 검증한다. +2. strict/quality/asset/base64/resource 검증을 모두 끝낸다. +3. 각 target과 같은 directory에 예측 불가능한 이름의 exclusive temp file을 만든다. +4. 전체 contents를 쓰고 `sync_all`한다. +5. 기존 target은 같은 directory의 private backup 이름으로 이동한다. +6. temp를 target으로 rename한다. +7. 한 commit이 실패하면 이미 바뀐 target을 역순으로 제거하고 backup을 복구한다. +8. 성공 후 backup을 지우고 가능한 플랫폼에서는 parent directory를 sync한다. + +개별 파일의 rename은 atomic하다. 여러 directory와 process crash를 가로지르는 완전한 원자성은 일반 filesystem에서 보장하지 않는다. Runtime error는 rollback하지만 전원 중단 후에는 `.devup-tmp-*` 또는 `.devup-bak-*`가 남을 수 있으므로 다음 시작/기록 때 같은 root 안의 stale internal file만 TTL 기준으로 정리한다. 사용자 파일명과 일치하는 임의 파일은 정리하지 않는다. + +output path를 지정하지 않으면 filesystem API를 호출하지 않는다. Resource delivery도 디스크를 사용하지 않는다. + +## 단계 B: Section discovery와 multi-root acquisition + +### 두 단계 흐름 + +Section URL을 exact Frame처럼 먼저 전부 수집하지 않는다. + +```text +Section URL + -> bounded SectionIndex 수집 + -> frame 선택이 없으면 selection_required + -> frameIds/allScreens가 있으면 selected root batch 수집 + -> composite artifact + -> frame별 projection/delivery +``` + +`SectionIndex`는 Section root의 ID/name/bounds와 screen candidate마다 다음 값만 가진 의도적인 compact projection이다. + +- ID, name, type, visible +- absolute bounds와 visual order +- parent/breadcrumb +- direct child count +- subtree node count와 estimated serialized byte count +- screen classification reasons와 canonical URL + +Figma sandbox에서는 subtree를 읽어 count/estimate를 계산하지만 response에는 descendant field를 넣지 않는다. 이 discovery projection이 일부 필드만 반환하는 것은 누락이 아니라 명시된 acquisition kind다. 선택한 root의 최종 수집은 기존 exhaustive property manifest와 runtime enumerable 탐색을 그대로 사용한다. + +### Batch planner + +- 후보는 기존 visual order로 고정한다. +- 요청한 `frameIds`의 유효성·중복을 SectionIndex에서 먼저 확인한다. +- `allScreens`와 `frameIds`의 상호 배타 계약을 유지한다. +- batch는 `estimatedBytes`, node count와 응답 안전 상한을 기준으로 결정적으로 pack한다. +- 한 batch script는 여러 root를 받아 각 root를 독립 envelope chunk로 만들고, 실제 byte 상한에 닿으면 완료된 root 목록과 continuation cursor를 반환한다. +- 추정이 빗나간 oversized root만 기존 cursor collector로 이어 읽는다. 이미 완료된 root를 0부터 다시 읽지 않는다. +- 동시에 실행하는 official MCP call 수는 bounded하고 기본값은 2다. Figma rate limit 신호가 오면 병렬도를 높이지 않는다. +- 정상적으로 상한 안에 든 N개 root는 가능한 최소 batch 수로 수집한다. root마다 무조건 한 번 호출하지 않는다. + +### Composite artifact + +artifact payload를 다음 두 shape로 일반화한다. + +```rust +enum ArtifactPayload { + Single(Arc), + Composite(Arc), +} + +struct CompositePayload { + target: FigmaTarget, + index: SectionIndex, + roots: Vec, + shared_resources: CollectedResources, + completeness: CompositeCompleteness, +} +``` + +- root 순서는 SectionIndex visual order다. +- node ID 중복은 byte-identical이면 한 번만 보존하고 다르면 version/merge conflict로 실패한다. +- variable/style/component/asset resource는 ID와 canonical content hash로 dedupe한다. +- 모든 chunk의 file key와 source version이 같아야 한다. 수집 중 version drift가 있으면 전체 composite를 cache하지 않는다. +- root별 completeness와 전체 aggregate를 모두 제공한다. 한 Frame의 partial 상태가 다른 Frame의 TSX를 제거하지 않는다. +- cache key는 Section ID, 정렬된 선택 root set이 아니라 요청 visual order의 root list, scope, resource scope, asset captures와 source policy를 포함한다. +- cache byte limit은 composite root와 resource bytes 전체를 센다. 상한을 넘으면 frame 선택 축소 또는 explicit output streaming을 안내하고 silently evict/truncate하지 않는다. + +선택이 없는 SectionIndex artifact는 design artifact가 아니며 TSX projection에 재사용할 수 없다. 새 internal/public kind `section-index`를 사용한다. + +### Compatibility + +- exact Frame URL의 정상 single-call path는 바꾸지 않는다. +- 기존에 이미 확보한 full Section `design` artifact는 계속 후보 탐색과 선택 projection에 사용할 수 있다. +- 새 URL 요청만 index-first 경로를 사용한다. +- `frames[]` response shape와 component naming 규칙은 유지한다. + +## 단계 C: MCP Resource delivery + +### 공개 입력 + +`devup_figma_export`에 다음 additive 입력을 추가한다. + +```json +{ + "delivery": "auto", + "outputs": ["tsx", "devupJson", "sourceMap", "assetManifest"] +} +``` + +허용값은 다음과 같다. + +- `inline`: 기존 JSON field에 담는다. 안전한 hard limit을 넘으면 명시적 오류를 반환하며 oversized response를 보내지 않는다. +- `resource`: 모든 생성 artifact를 Resource Link와 manifest로 반환한다. +- `auto`: 개별 output 256 KiB 이하이고 inline 전체가 1 MiB 이하이면 기존처럼 inline하고, 그보다 크면 resource로 전환한다. + +기본값은 `auto`다. 기존 작은 응답은 byte-compatible field shape를 유지한다. 이전에 transport 실패 위험이 있던 큰 응답만 resource manifest로 바뀐다. 호환 wrapper인 `devup_figma_to_ui`와 `devup_figma_to_json`도 같은 auto 정책을 사용하고 explicit `delivery: inline`을 받을 수 있게 한다. + +### Resource store와 URI + +projected output은 acquisition artifact entry에 연결된 memory-only resource로 저장한다. 별도 수명이 긴 global blob store를 만들지 않는다. + +```text +devup://artifact/{artifactId}/outputs/manifest +devup://artifact/{artifactId}/outputs/{outputName}/manifest +devup://artifact/{artifactId}/outputs/{outputName}/chunks/{index} +devup://artifact/{artifactId}/assets/{opaqueCaptureId}/manifest +devup://artifact/{artifactId}/assets/{opaqueCaptureId}/chunks/{index} +``` + +- URI에는 file key, node ID, asset ID, component name이나 output path를 넣지 않는다. +- `{artifactId}`는 기존 256-bit random ID다. +- `{opaqueCaptureId}`는 capture를 attach할 때 만든 독립적인 128-bit 이상 random ID이며 원본 asset ID를 복구할 수 없다. +- text와 binary raw chunk는 최대 256 KiB다. blob `ResourceContents`의 base64 팽창은 store byte accounting에 원본과 encoded 크기를 모두 반영한다. +- manifest는 MIME, raw bytes, SHA-256, chunk count/size, quality와 expiry만 가진다. +- chunk read는 hash와 index를 검증하고 전체 output을 복사하지 않는 slice 기반 응답을 만든다. +- artifact가 TTL 만료 또는 LRU eviction되면 관련 resource도 함께 사라지고 `resource not found`가 된다. +- 동일 artifact와 projection option hash의 output은 재사용해 재-projection과 추가 Figma call을 하지 않는다. acquisition `contentHash`는 attached output 때문에 바뀌지 않으며 resource manifest가 별도의 output content hash를 가진다. + +`resources/list`는 현재 살아 있는 top-level output manifest만 cursor pagination으로 열거한다. chunk 수가 많아도 chunk URI 전부를 list하지 않는다. `resources/templates/list`는 위 manifest/chunk URI template을 설명한다. subscribe/list-changed는 실제 push use case가 없으므로 광고하지 않는다. + +Server capability는 tools와 resources를 함께 광고한다. Tool response에는 Resource Link, manifest URI, expiry, byte 수와 content hash를 넣고 design 원문을 summary에 반복하지 않는다. + +### outputPath와 Resource의 관계 + +- `outputPath`가 있으면 transaction commit 후 path를 반환하고 해당 binary base64는 inline에서 제거한다. +- `delivery=resource`와 `outputPath`를 함께 쓰면 파일 기록과 Resource Link 둘 다 제공한다. 두 결과는 같은 content hash여야 한다. +- strict 실패, capability 실패 또는 transaction preflight 실패 시 Resource도 publish하지 않는다. +- projection과 resource chunk를 먼저 staging하고 quality가 통과한 뒤 artifact entry에 한 번에 attach한다. + +## 단계 D: Fidelity, 진단 구조와 시각 회귀 + +### Structured diagnostic impact + +`Diagnostic`에 optional additive field를 추가한다. + +```rust +enum FidelityImpact { + None, + Approximated, + Lossy, + Failed, +} +``` + +- collector informational diagnostic은 `none`이다. +- absolute layout fallback은 `approximated`다. +- mask/effect와 의미를 잃는 fallback은 `lossy`다. +- projection 자체를 만들 수 없으면 `failed`다. +- 기존 fixture/외부 payload에서 field가 없으면 diagnostic producer domain의 registry가 code를 impact로 변환한다. +- 알 수 없는 warning/error code는 자동으로 `exact`가 되지 않는다. codegen warning은 최소 `approximated`, codegen error는 `failed`; collector warning은 acquisition completeness가 판정한다. + +`projection_quality`는 문자열 목록 대신 impact의 최댓값을 계산한다. `includeDiagnostics=false`는 response 표시만 끄고 내부 quality 계산에는 영향을 주지 않는다. + +### Rust TSX syntax gate + +생성된 모든 TSX는 반환·Resource publish·파일 commit 전에 Rust parser로 다시 읽는다. + +- workspace MSRV 1.88을 만족하는 `oxc_parser` 버전을 lockfile에 고정한다. +- TypeScript + JSX source type으로 parse하고 모든 syntax error를 수집한다. +- error가 하나라도 있으면 `DEVUP_CODEGEN_PROJECTION_FAILED`, `FidelityImpact::Failed`다. +- parser error에는 byte range와 정제된 parser message만 넣고 주변 design text는 로그에 남기지 않는다. +- 268개 golden과 WQUW-151 모든 TSX snapshot을 전수 parse한다. + +이 gate는 TypeScript type checker가 아니다. DevupUI public prop type drift는 소비자 integration이 검증한다. + +### Semantic fidelity report + +codegen이 source map과 함께 `ProjectionTrace`를 만든다. validator는 generated TSX AST와 trace를 독립적으로 대조한다. + +```text +FidelityReport + syntax + nodeCoverage + textCoverage + tokenCoverage + typographyCoverage + assetCoverage + layoutCoverage + diagnosticsByImpact +``` + +- visible source node가 emitted node, intentional flatten, ignored-with-reason 중 정확히 하나에 속해야 한다. +- text characters와 styled segment 순서/경계가 AST child 순서와 일치해야 한다. +- variable/style binding은 emitted token 또는 explicit resolved fallback provenance가 있어야 한다. +- typography는 style token 또는 font family/size/weight/line-height/letter-spacing fallback을 추적한다. +- image/vector/mask reference는 manifest capture 또는 placeholder diagnostic을 가져야 한다. +- layout property는 direct/normalized/inferred/fallback 중 하나로 source map에 분류한다. + +`strict=true`는 syntax success와 모든 requested fidelity coverage 100%, failed/lossy 0을 요구한다. 브라우저 pixel 비교는 환경 의존이므로 server strict의 기본 조건에는 넣지 않는다. opt-in visual job은 별도 threshold를 강제한다. + +### Visual reference와 comparator + +새 `devup-mcp-visual` crate는 다음만 담당한다. + +- PNG decode와 color-space normalize +- reference/actual viewport 크기 검증 +- configurable per-channel threshold와 changed-pixel ratio +- anti-aliasing tolerance를 적용한 pixel diff +- opaque diff PNG와 content-free JSON metric report 생성 + +Figma screenshot은 existing read-only `get_screenshot` acquisition으로 요청하고 artifact-bound binary Resource 또는 confined output transaction으로만 전달한다. screenshot은 cache key나 telemetry에 넣지 않는다. + +실제 renderer adapter contract는 다음과 같다. + +```text +input: generated TSX/resource manifest, viewport, theme mode, asset directory +output: PNG path, renderer name/version, DevupUI version, font manifest +``` + +devup-mcp server는 임의 command를 실행하지 않는다. 소비자 프로젝트의 opt-in job이 자체 Bun/Next.js/DevupUI 환경에서 TSX를 build/type-check/render한 뒤 Rust comparator CLI를 호출한다. WQUW-151 대표 Frame은 실제 Figma PNG와 consumer-rendered PNG를 검증하는 live/visual job을 갖고, repository 기본 Cargo CI에는 credential과 screenshot binary를 저장하지 않는다. 결정적 comparator 자체는 synthetic PNG fixtures로 항상 테스트한다. + +pixel threshold는 viewport 크기 불일치 0건, changed pixel ratio 0.5% 이하를 초기 기준으로 한다. font 미설치 또는 renderer/version 불일치는 visual failure가 아니라 `environment-invalid`로 분리해 false success를 막는다. threshold는 report에 기록하며 조용히 완화하지 않는다. + +## 내부 모듈 경계 + +`crates/devup-mcp/src/server/mod.rs`는 router와 `ServerHandler`만 남긴다. + +```text +server/ + mod.rs tool router, ServerHandler, shared state wiring + tools.rs public request schemas and defaults + handoff.rs official MCP continuation sessions only + artifacts.rs acquisition/composite artifact + attached resources + acquisition.rs URL/artifact planning, Section index and batches + projection.rs TSX/theme/source-map/manifest orchestration + validation.rs capability, quality, TSX and fidelity gates + delivery.rs inline/resource/auto selection and MCP read/list + output.rs confined OutputPolicy and OutputTransaction + quality.rs typed quality aggregation +``` + +`devup-mcp-figma`는 Figma URL, collector, snapshot, SectionIndex와 merge까지만 소유한다. `devup-mcp-devup-ui`는 codegen, theme, source map, ProjectionTrace와 syntax/semantic validation을 소유한다. `devup-mcp-visual`은 Figma나 MCP에 의존하지 않고 byte image comparison만 소유한다. + +분해는 기능 commit에서 이동하는 코드만 대상으로 하며 동작 없는 대규모 rewrite를 먼저 하지 않는다. 각 이동 후 public tool contract tests가 그대로 통과해야 한다. + +## 오류와 상태 계약 + +- invalid asset reuse: `DEVUP_FIGMA_HANDOFF_INVALID`, upstream call 0, projection 0, write 0 +- unsafe output path: `DEVUP_CODEGEN_FAILED`, projection 결과 publish 0, write 0 +- Section selection invalid: `DEVUP_FIGMA_NODE_NOT_FOUND`, selected collection 0 +- batch version drift/merge conflict: complete artifact를 만들지 않고 retryable consistency error +- inline hard limit 초과: resource/auto 사용 안내가 있는 non-retryable input error +- expired resource: MCP resource not found; URL 또는 artifact reacquire 필요 +- TSX parse failure: projection failed, strict/non-strict 모두 깨진 TSX를 반환하거나 기록하지 않음 +- visual mismatch: comparator failure report; acquisition/projection artifact를 삭제하지 않음 + +`status=complete`는 기존 네 quality axis와 semantic fidelity gate를 만족할 때만 가능하다. `selection_required`와 `needs_figma`는 계속 workflow state다. + +## 테스트 매트릭스 + +### Asset와 artifact + +- PNG 1x artifact를 PNG 1x로 재사용하면 Figma call 0 +- PNG 1x를 SVG 1x, PNG 2x, 다른 ID로 요청하면 projection/write 전에 실패 +- failed/pending export는 같은 tuple이어도 complete capture로 인정하지 않음 +- 공개 capability JSON에 asset ID가 없음 + +### Filesystem + +- relative path와 허용 root 내부 absolute path 성공 +- `..`, sibling root, UNC/drive switch, directory target, duplicate target 거절 +- Windows junction과 symlink를 통한 root 탈출 거절 +- temp write, backup rename, target rename 각 fault injection에서 원본 복구 +- strict/parse/capability 실패 시 생성 파일 0 +- text + 여러 asset의 두 번째 commit 실패 시 runtime rollback +- stale internal temp만 정리하고 사용자 파일은 보존 + +### Section + +- 선택 없는 Section은 compact index call 후 `selection_required`; full subtree call 0 +- one/many/all selection의 visual order, naming과 중복 검증 +- 여러 small root가 한 batch, oversized root만 continuation +- chunk 누락/중복/hash/version drift가 complete로 승격되지 않음 +- composite resource dedupe와 root별 completeness +- 기존 full Section artifact reuse 호환 +- WQUW-151 10 Frame 전체 text/children/token/typography/stroke snapshot 유지 + +### Resource delivery + +- 256 KiB 경계와 1 MiB total 경계의 inline/auto/resource 결정 +- text/blob manifest MIME, size, SHA-256와 chunk round-trip +- list pagination에는 manifest만 나타남 +- invalid index, altered hash, expired/evicted artifact not found +- Resource Link response가 design content를 중복 inline하지 않음 +- outputPath와 resource bytes hash 일치 +- cache byte accounting과 LRU가 attached resources를 포함 + +### Fidelity와 quality + +- 모든 checked-in TSX fixture parse 성공 +- 잘못된 attribute/text fragment parse 실패 및 write/publish 0 +- 새 approximated/lossy/failed diagnostic이 code 문자열 추가 없이 quality에 반영 +- `includeDiagnostics=false`에서도 quality 동일 +- theme conflict/unresolved, failed asset, malformed Explore critical field strict matrix +- text segment, token, typography, asset와 layout provenance coverage +- synthetic exact/changed/size-mismatch PNG comparator +- opt-in WQUW-151 Figma/consumer screenshot threshold와 environment-invalid 분리 + +### 전체 gate + +```text +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace --all-features +cargo insta test --workspace --all-features --check +cargo build --workspace --release +``` + +각 단계에서 268/268 plugin JSON golden과 WQUW-151 fixture를 다시 실행한다. Snapshot은 자동 accept하지 않고 의도한 diff만 검토한다. + +## 구현 및 commit 순서 + +1. exact asset capture capability와 artifact reuse tests +2. confined `OutputPolicy`와 staged `OutputTransaction` +3. structured fidelity impact와 누락된 strict/quality matrix +4. SectionIndex, batch planner와 composite artifact +5. standard MCP Resource store, read/list/template와 delivery policy +6. Rust TSX parse gate와 semantic fidelity report +7. `devup-mcp-visual` comparator, Figma reference output와 adapter contract +8. server module decomposition 완료, README/changepack/install 문서 +9. 전체 Cargo/golden/WQUW/live smoke 검증, focused commits push와 PR 갱신 + +각 번호는 red test → 최소 구현 → focused verification → commit 순서로 진행한다. 앞 단계가 green이 아니면 뒤 단계로 넘어가지 않는다. + +## 보안과 개인정보 + +- 허용 root는 startup configuration이며 tool input으로 root 자체를 추가할 수 없다. +- temp/backup 이름은 cryptographically unpredictable하고 exclusive create한다. +- output transaction은 Figma/OAuth credential 파일을 특별 취급하는 대신 root confinement로 접근 자체를 막는다. +- resource URI는 process-local random/opaque ID만 사용하고 design 식별자를 포함하지 않는다. +- resources와 screenshots는 artifact TTL/LRU 안에서 memory-only이며 기본적으로 디스크에 남지 않는다. +- Resource read와 cache tracing은 URI hash, byte 수, status만 기록한다. +- Figma 접근은 read-only allowlist를 유지하고 mutation API를 추가하지 않는다. +- visual renderer는 server가 실행하지 않아 command injection과 consumer dependency 권한을 분리한다. +- repository fixture에는 token, OAuth credential, Figma 사용자 정보와 새 screenshot 원본을 추가하지 않는다. + +## 호환성과 migration + +- tool 이름과 기존 output key는 유지한다. +- `delivery=auto`에서 작은 output은 기존 inline shape다. +- 큰 inline에 의존한 client는 `delivery=inline`을 명시할 수 있지만 hard limit보다 크면 resource 또는 outputPath로 전환해야 한다. +- 현재 arbitrary absolute output path 동작은 의도적으로 폐기한다. server cwd 밖 기록은 `--allow-write-root`로 명시해야 한다. +- cache는 process-local이므로 artifact capability shape 변경에 persistent migration은 없다. +- `Diagnostic.fidelityImpact`, `cache.capabilities.assetCaptureCount`, fidelity/resource metadata는 additive다. + +## 완료 기준 + +- asset artifact reuse에서 ID/format/scale 불일치가 성공할 수 없다. +- 허용 root 밖 기록과 symlink/junction 탈출이 불가능하고 runtime 실패 시 기존 파일을 복구한다. +- 선택 없는 Section은 전체 subtree를 수집하지 않는다. +- WQUW-151 10 Frame을 root별 호출이 아닌 bounded 최소 batch로 수집하고 기존 TSX parity를 유지한다. +- 큰 text/binary output은 표준 MCP Resource로 bounded하게 읽을 수 있다. +- 깨진 TSX와 provenance가 불완전한 strict output은 반환, publish, 기록되지 않는다. +- 기본 workspace와 CI는 Bun/Node 없이 Cargo만으로 build/test된다. +- 실제 consumer renderer를 연결한 opt-in visual job이 Figma reference와 정량 diff를 보고한다. +- 모든 관련 Cargo, snapshot, plugin corpus와 WQUW-151 gate가 통과한다. +- README, changepack, focused commit, push, PR과 설치 검증이 갱신된다. + +## 남는 한계 + +- Figma official MCP 자체의 응답/호출 상한과 catalog 승인 실패는 제거할 수 없으며 direct OAuth와 host fallback 정책을 계속 따른다. +- 여러 directory의 파일을 한 filesystem transaction으로 crash-atomic하게 바꾸는 것은 보장하지 않는다. 정상 runtime failure rollback과 개별 파일 atomic replace까지만 보장한다. +- Cargo-only server만으로 React/DevupUI browser render를 재현할 수 없다. pixel fidelity는 실제 consumer renderer adapter가 연결된 환경에서만 증명된다. +- pixel 결과는 font, browser, OS rasterizer에 민감하므로 renderer/font/version metadata가 다르면 비교 자체를 유효 성공으로 보지 않는다. diff --git a/docs/superpowers/specs/2026-09-01-devup-mcp-output-correctness-design.md b/docs/superpowers/specs/2026-09-01-devup-mcp-output-correctness-design.md new file mode 100644 index 0000000..e5188ac --- /dev/null +++ b/docs/superpowers/specs/2026-09-01-devup-mcp-output-correctness-design.md @@ -0,0 +1,76 @@ +# Devup MCP Output Correctness Design + +## Goal + +Make generated DevupUI artifacts internally consistent, syntactically safe, and honest about whether the requested output is exact, approximated, or incomplete. + +## Scope + +This increment fixes four correctness contracts: + +1. TSX and `devup.json` use the same canonical token name for every Figma variable and style. +2. Static JSX attribute values are escaped by one renderer before they are emitted. +3. Tool status and `strict` evaluate the requested projection, theme, and assets in addition to acquisition integrity. +4. Cached artifacts declare what was captured so an incompatible `artifactId` projection is rejected. + +Section multi-root acquisition, MCP resource delivery, filesystem write confinement, visual diffing, and internal module decomposition remain separate follow-up increments. + +## Token Identity + +Variable token naming has one source of truth in the theme token module. A non-empty Figma `codeSyntax.WEB` wins; otherwise the final path segment of the variable name is normalized. Style tokens normalize the complete style name, matching the keys written to `devup.json`. + +Codegen builds its ID-to-token maps through these shared functions. It must never independently camel-case a variable name. The emitted `usedTokens`, TSX props, theme JSON keys, and source maps therefore refer to the same token. + +## JSX Attribute Safety + +All static codegen props pass through a single attribute renderer. It escapes `&`, `"`, `<`, and `>` as JSX-compatible entities while preserving the existing deterministic quoted-attribute format. Both root/component props and nested styled text segments use this renderer. + +Text child escaping remains separate because JSX text and JSX attributes have different grammars. + +## Output Quality + +Every completed tool result includes a `quality` object with four independent axes: + +- `acquisition`: `complete`, `expected-projection`, `partial`, or `failed` +- `projection`: `exact`, `approximated`, `lossy`, `failed`, or `not-requested` +- `theme`: `complete`, `conflicted`, `unresolved`, or `not-requested` +- `assets`: `complete`, `partial`, `failed`, or `not-requested` + +`Search` and `Explore` are intentionally compact projections. Missing descendants caused by that declared projection do not make the operation partial; missing roots, field failures, or truncated included fields still do. + +Projection diagnostics are evaluated even when `includeDiagnostics` is false. Absolute positioning is `approximated`; mask and effect fallback are `lossy`. Theme conflicts and unresolved values affect the theme axis. Explicitly requested failed assets affect the assets axis. + +The legacy top-level `status` remains for compatibility. It is `complete` only when all requested axes are acceptable, `partial` for approximated/lossy/conflicted/unresolved/partially failed output, and `failed` when acquisition or projection fails. `selection_required` and `needs_figma` remain workflow states rather than quality states. + +For `strict=true`, every requested axis must be exact or complete. The error includes the quality object and acquisition report so clients can explain the rejection without exposing design content. + +## Artifact Capabilities + +Each cache entry records immutable, non-sensitive capture capabilities derived from the acquisition request: + +- capture kind: `design`, `theme-only`, `search`, or `explore` +- collection scope +- resource scope + +The metadata is returned with the artifact summary. Reuse through `artifactId` validates the requested outputs before projection: + +- search and explore artifacts cannot produce TSX, raw snapshots, source maps, asset manifests, or themes; +- theme-only artifacts can produce only `devupJson`; +- file-scoped `devupJson` requires file resource coverage; +- node/page theme requests cannot exceed the captured collection/resource scope; +- design-only outputs require a design artifact. + +Invalid reuse returns `DEVUP_FIGMA_HANDOFF_INVALID` and performs no projection or filesystem write. + +## Compatibility and Privacy + +Existing output fields remain present. The new quality and capability metadata contains counts and enum values only, never Figma text, variable values, tokens, URLs, OAuth data, or raw payloads. + +All Figma access remains read-only. This increment does not broaden OAuth scope or add network calls. + +## Verification + +- Unit tests prove canonical token naming and JSX escaping. +- MCP integration tests prove output quality, operation-relative Explore completion, strict projection rejection, and incompatible artifact rejection. +- Existing 268 upstream JSON golden fixtures remain byte-identical unless the shared token or escaping correction intentionally changes their output; any reviewed changes must be explicit. +- Workspace fmt, clippy, all-feature tests, snapshot checks, and release build must pass. diff --git a/docs/superpowers/specs/2026-09-01-figma-explore-cache-optimization-design.md b/docs/superpowers/specs/2026-09-01-figma-explore-cache-optimization-design.md new file mode 100644 index 0000000..fe08beb --- /dev/null +++ b/docs/superpowers/specs/2026-09-01-figma-explore-cache-optimization-design.md @@ -0,0 +1,57 @@ +# Figma Explore Cache Optimization Design + +## Goal + +Reduce repeated `devup_figma_explore` latency without weakening target identity, source-policy isolation, bounded memory, or freshness controls. The first official Figma read remains authoritative; compatible follow-up reads reuse its in-memory projection. + +## Scope + +- Add `refresh` to `devup_figma_explore` and bypass every cache and in-flight reuse path when true. +- Reuse an exact cached projection for the same request. +- Reuse a cached projection for another node only when that node exists in the cached snapshot. +- Reuse a larger explore projection for a smaller requested projection when every non-limit request dimension matches. +- Let concurrent direct acquisitions wait for a compatible in-flight projection, then reuse it only if it contains the requested node; otherwise acquire independently. +- Report cache reuse kind, age, remaining TTL, avoided Figma calls, origin collection statistics, and current-request collection statistics. +- Mark Git builds made from a modified worktree with `-dirty`. +- Measure the completed behavior against WQUW-151. + +Disk persistence is excluded because official explore payloads may have a null Figma version. Persisting such payloads across MCP restarts could return unverifiable stale designs. + +## Cache Compatibility + +An explore artifact can serve a request only when file key, branch key, collection scope, resource scope, context flags, metadata flags, asset/reference requirements, source policy, and text-preview limit match. The cached `projection_limit` must be greater than or equal to the requested limit. Node IDs may differ only when the requested node exists in the cached snapshot. + +Selection prefers an exact key, then the smallest compatible projection, then the most recently accessed artifact. `refresh=true` skips exact lookup, related/superset lookup, and compatible in-flight waiting. + +## Concurrent Direct Acquisition + +The artifact store records the request key beside each exact in-flight acquisition. A compatible follower waits for the owner. When the owner completes, the follower reuses the artifact only if the requested node is present. If it is absent or the owner fails, the follower starts its own acquisition. This serializes potentially related direct reads safely; it never invents coverage. + +Host handoffs are not shared while incomplete because exposing the same one-shot call ID to multiple clients would violate replay protection. Once a host handoff completes, all compatible cache reuse rules apply. + +## Public Diagnostics + +`cache` gains: + +- `reuseKind`: `miss`, `exact`, `related-node`, `superset`, or `related-node-superset`. +- `ageSeconds` and `remainingTtlSeconds`. +- `avoidedFigmaToolCalls`. +- `originCollection`: statistics from the acquisition that created the artifact. + +Top-level `collection` describes only the current request. It is zeroed for a cache hit and retains acquisition statistics for a miss. Existing cache identity, hash, capability, size, and timestamp fields remain. + +## Freshness and Safety + +`refresh=true` always creates a new artifact and replaces the exact-key entry after successful acquisition. A failed refresh does not delete the previous valid artifact. Cache entries remain memory-only, bounded by the existing entry and byte limits, and expire after ten minutes. + +## Build Identity + +When `DEVUP_MCP_BUILD_ID` is absent, the build script uses the twelve-character Git commit and appends `-dirty` if tracked or untracked non-ignored files differ from HEAD. Clean builds retain the plain commit ID. Non-Git builds remain `source-unknown`. + +## Verification + +- TDD integration tests cover refresh, exact/related/superset selection, incompatible options, current-vs-origin statistics, and completed host reuse. +- Artifact-store tests cover compatible in-flight direct acquisition and unrelated fall-through. +- CLI tests cover clean/dirty build ID formatting through a testable helper. +- Full workspace tests, Clippy with warnings denied, formatting, Node script tests, and snapshot checks must pass. +- WQUW-151 measurement reports first official Figma duration, repeated exact and related-node local durations, Figma call counts, cache reuse kinds, and calculated time saved. diff --git a/docs/superpowers/specs/2026-09-01-figma-mcp-live-hardening-design.md b/docs/superpowers/specs/2026-09-01-figma-mcp-live-hardening-design.md new file mode 100644 index 0000000..2a61932 --- /dev/null +++ b/docs/superpowers/specs/2026-09-01-figma-mcp-live-hardening-design.md @@ -0,0 +1,182 @@ +# Figma MCP Live Hardening Design + +## 상태와 범위 + +- 작성일: 2026-09-01 +- 대상 저장소: `dev-five-git/devup-mcp` +- 선행 설계: `2026-08-31-figma-host-fallback-parity-design.md` +- 기준 실사용: Girok WQUW-151, file `85CgSws3o5XsLv7aAwWJyS` +- 범위: Figma MCP 탐색, host handoff, 실행 진단, DevupUI fidelity 판정 +- 범위 밖: 기록공간 애플리케이션, Figma 쓰기 기능, 신규 외부 서비스 + +## 목표 + +실제 Figma 문서 구조가 fixture 캡처 이후 바뀌더라도 사용자가 전달한 요구사항 제목 +또는 중첩 노드 링크에서 관련 화면을 한 번의 공식 Figma 호출로 찾는다. 대용량 +`use_figma` 결과를 이어받는 host handoff는 잘못된 continuation 하나 때문에 세션 +전체를 잃지 않으며, 만료·중복·알 수 없는 호출을 서로 구분한다. 설치된 stdio 서버가 +종료됐을 때는 바이너리와 host 연결 중 어느 경계가 실패했는지 안전하게 진단한다. +생성 결과의 품질 상태는 fallback diagnostic과 모순되지 않아야 한다. + +## 확인된 결함 + +### 중첩 제목 탐색 + +WQUW-151의 제목 노드 `3879:35481`은 과거 fixture에서는 PAGE 직속이었지만 현재 +문서에서는 SECTION `4217:7743`의 자식이다. 현재 Plugin API projection은 +`anchorPeer`로 SECTION을 보존하지만 SECTION 하위 screen traversal은 +`anchor.type === "SECTION"`일 때만 수행한다. 제목 링크의 실사용 결과는 후보 +0개이고 SECTION 링크는 정확한 후보 10개다. + +### handoff 세션 유실 + +`HandoffStore::accept`는 세션을 map에서 제거한 다음 call ID를 검사한다. call ID가 +없거나 collector가 결과를 거부하면 세션을 다시 넣지 않고 반환한다. 이후 올바른 +continuation도 존재하지 않는 session 오류가 된다. 현재 오류 메시지는 unknown과 +already-consumed도 구분하지 않는다. + +### transport 종료 진단 + +설치 바이너리를 직접 시작한 stdio initialize와 tool call은 성공했지만 이미 등록된 +connector 호출은 `Transport closed`였다. 프로세스가 시작되기 전의 launch 실패, +initialize 전 종료, 정상 initialize 이후 종료를 서버 밖에서 자동 복구할 수는 없다. +따라서 제품이 제어할 수 있는 경계에서는 시작 정보와 stderr 안전성 계약을 강화하고, +설치 문서와 smoke test가 host 재연결 필요 여부를 판별하게 해야 한다. 서버가 sibling +MCP나 host 프로세스를 임의로 재시작하는 기능은 추가하지 않는다. + +### fidelity 상태 불일치 + +WQUW-151 TSX에는 `DEVUP_CODEGEN_ABSOLUTE_FALLBACK` 두 건이 있으나 개별 +`FidelityReport::strict_compatible`은 approximated impact를 허용한다. 상위 +`OutputQuality`는 diagnostic을 보고 partial로 판정하므로 두 품질 계약이 서로 다른 +답을 낸다. + +## 설계 + +### 1. 탐색 기준 노드 승격 + +읽기 전용 `explore.js`는 세 노드를 명시적으로 구분한다. + +- `requestedAnchor`: 사용자가 링크한 원래 노드 +- `scopeAnchor`: 탐색 범위를 결정하는 가장 가까운 SECTION 또는 PAGE 직속 peer +- `page`: 한 번만 활성화하는 소속 PAGE + +`requestedAnchor`가 SECTION 내부에 있고 screen 자체가 아니라면 가장 가까운 SECTION을 +`scopeAnchor`로 사용한다. SECTION traversal은 `scopeAnchor.type`을 기준으로 +실행한다. projection에는 page, scopeAnchor, requestedAnchor, 필요한 ancestor chain과 +최상위 screen 후보만 포함한다. 결과의 public anchor와 heading node ID는 원래 +`requestedAnchor`를 유지하고, 후보 판정만 scopeAnchor 아래에서 수행한다. + +Rust `explore_snapshot`은 원래 anchor의 ancestor chain에 SECTION이 있으면 그 SECTION +하위 screen을 선택한다. SECTION이 projection에 있으나 자식 연결이 축약된 경우에도 +`parentId` chain으로 descendant를 판정한다. 기존 PAGE 직속 heading 동작은 유지한다. + +완료 조건: + +- 현재 WQUW 구조를 재현한 fixture에서 제목 링크로 10개 화면을 찾는다. +- SECTION 링크와 제목 링크의 candidate ID/순서는 동일하다. +- screen 링크는 exact screen 하나만 반환한다. +- projection JSON 상한 14,000자는 유지한다. + +### 2. 손실 없는 handoff 상태 전이 + +`HandoffStore`는 세션을 꺼낸 뒤 검증하는 방식 대신 lock 안에서 먼저 session과 call +상태를 확인한다. 결과 크기 검증 후 pending call을 찾고, collector state 변경이 +성공했을 때만 pending call을 consumed로 이동한다. + +세션은 다음 call 상태를 유지한다. + +- `pending`: 아직 결과를 받지 않음 +- `consumed`: 이미 정상 처리됨 + +짧은 tombstone map은 제거된 session의 종료 이유와 만료 시각만 TTL 동안 보존한다. +원본 결과, Figma 내용, call arguments는 tombstone에 저장하지 않는다. + +오류는 다음처럼 구분한다. + +- 존재하지 않은 session/call: `DEVUP_FIGMA_HANDOFF_INVALID`, retryable false +- 이미 처리한 call: `DEVUP_FIGMA_HANDOFF_INVALID`, reason `consumed` +- 만료 session: `DEVUP_FIGMA_HANDOFF_EXPIRED`, retryable true +- collector가 거부한 result: 원래 collector 오류를 반환하되 session/call은 pending 유지 + +유효한 result를 처리할 때 `expires_at`을 현재 시각 + TTL로 연장한다. 단순 `next` +조회는 lease를 무한 연장하지 않는다. session/result/전체 메모리 상한은 기존 값을 +유지하고 tombstone에는 별도의 작은 개수 상한을 둔다. + +완료 조건: + +- 잘못된 call ID 이후 올바른 call ID로 계속할 수 있다. +- malformed result 이후 수정된 result로 계속할 수 있다. +- 동일 call 재전송은 consumed로 판정된다. +- 대용량 3청크 결과의 순차 continuation 동안 lease가 연장된다. +- 만료와 unknown 오류 code/details가 다르다. + +### 3. stdio 실행 및 설치 진단 + +MCP stdout은 계속 protocol frame 전용으로 유지한다. `--version`은 package version과 +빌드 식별자를 출력하고, 새 `--self-check` CLI는 다음 로컬 조건만 검사한다. + +- 실행 파일을 시작할 수 있음 +- credential backend 초기화 가능 여부 +- stdout 오염 없이 initialize 가능한 server 구성 + +`--self-check`는 OAuth를 시작하거나 Figma/network를 호출하지 않는다. 결과는 안전한 +JSON이며 secret과 사용자 경로를 포함하지 않는다. README 설치 절차는 바이너리 hash나 +버전 변경 후 MCP host 연결 재시작이 필요하다는 점과 `--self-check` 판별 순서를 +명시한다. + +CI는 child process에 initialize → tools/list → auth status를 보내 정상 종료시키는 stdio +smoke test를 실행한다. 이는 host 자체의 stale transport를 재시작하지 않지만 +"바이너리 실패"와 "host가 죽은 이전 transport를 보유"한 상황을 분리한다. + +### 4. fidelity 단일 진실 공급원 + +`FidelityReport::strict_compatible`은 approximated, lossy, failed impact가 모두 0일 +때만 true다. 정확한 position props가 생성돼 fallback이 필요 없는 absolute node에는 +diagnostic을 만들지 않는다. 판단 기준은 node의 absolute 좌표와 크기를 부모 기준 +position props로 모두 표현하고 source-map layout coverage가 이를 확인하는지 여부다. + +WQUW-151의 TIP 닫기 버튼과 하단 controller는 좌표·크기·고정 edge가 모두 생성되므로 +generic fallback diagnostic을 제거할 수 있는지 테스트로 판정한다. 표현되지 않은 +constraint나 transform이 있으면 diagnostic을 유지하고 결과 status는 partial이어야 +한다. diagnostic을 숨겨 complete로 만드는 것은 허용하지 않는다. + +완료 조건: + +- approximated diagnostic이 하나라도 있으면 report와 output status 모두 strict + incompatible/partial이다. +- 완전히 표현된 absolute node는 exact이며 diagnostic이 없다. +- WQUW snapshot의 status와 diagnostics가 일치한다. + +## 테스트 전략 + +모든 production 변경은 실패하는 회귀 테스트를 먼저 추가한다. + +1. 최신 WQUW parent chain을 합성 fixture로 재현하는 Rust explore test와 실제 + `explore.js` behavior test +2. invalid call, malformed result, consumed call, expiry tombstone, lease renewal handoff test +3. `--self-check`와 stdio initialize/tools/auth smoke test +4. absolute layout exact/approximated 분기와 WQUW fidelity snapshot test +5. `cargo fmt --check`, `cargo clippy --workspace --all-targets -- -D warnings`, + `cargo test --workspace`, release build + +실제 Figma live 검증은 원본 payload를 저장하지 않고 다음 수치와 ID만 확인한다. + +- 제목 링크와 SECTION 링크가 동일한 10개 candidate를 반환 +- target `3879:35518`이 144 nodes, 20 variables, 11 styles로 수집 +- handoff가 3개 PNG envelope chunk를 모두 소비하고 complete + +## 보안과 호환성 + +- Figma write tool과 사용자 제공 JavaScript는 계속 허용하지 않는다. +- tombstone, self-check, tracing에 원본 디자인이나 credential을 기록하지 않는다. +- 기존 tool input/output 필드는 삭제하거나 이름을 바꾸지 않는다. +- 새 오류 details와 CLI action은 additive change다. +- 기존 direct/host source 정책과 10분 TTL 기본값은 유지한다. + +## 범위 제외와 한계 + +MCP 서버는 이미 종료된 자신과 host 사이의 stdio pipe를 스스로 되살릴 수 없다. +따라서 host process 재시작은 문서화된 운영 단계이며 제품 내부 retry로 가장하지 않는다. +이번 변경은 서버가 살아 있을 때의 state loss를 제거하고, 죽은 경계를 명확히 판별하는 +데까지를 완료 조건으로 삼는다. diff --git a/docs/visual-renderer-contract.md b/docs/visual-renderer-contract.md new file mode 100644 index 0000000..14f5090 --- /dev/null +++ b/docs/visual-renderer-contract.md @@ -0,0 +1,71 @@ +# Visual renderer contract + +`devup-mcp` keeps Figma acquisition and pixel comparison deterministic while leaving application rendering to the consuming repository. This avoids embedding a browser or JavaScript runtime in the MCP server. + +## 1. Acquire the reference + +Request `referencePng` together with the desired projection: + +```json +{ + "url": "https://www.figma.com/design//?node-id=", + "outputs": ["tsx", "sourceMap", "referencePng"], + "delivery": "resource" +} +``` + +The collector makes one `get_screenshot` call for the linked node, accepts only a bounded `image/png`, validates its signature and SHA-256, and records `capabilities.referencePng=true` on the artifact. `referencePng` currently applies to one linked node; Section multi-frame selection must acquire each frame by its canonical URL. + +## 2. Render the generated component + +The consumer should persist a content-free run manifest next to `actual.png`: + +```json +{ + "schemaVersion": 1, + "tsxResource": { "uri": "devup://artifact/.../manifest", "sha256": "..." }, + "referenceResource": { "uri": "devup://artifact/.../manifest", "sha256": "..." }, + "viewport": { "width": 360, "height": 740, "deviceScaleFactor": 1 }, + "themePath": "devup.json", + "assetDirectory": "public/figma-assets", + "fontManifest": [{ "family": "Pretendard", "sha256": "..." }], + "renderer": { "name": "playwright-chromium", "version": "..." }, + "devupUiVersion": "...", + "actualPng": "actual.png", + "environmentStatus": "valid" +} +``` + +Paths are consumer-local examples; hashes and pinned versions are required for reproducibility. A missing font/asset, renderer version mismatch, failed readiness signal, console/runtime error, or viewport mismatch MUST set `environmentStatus` to `environment-invalid` and stop before pixel metrics are treated as a product pass. + +The repository-owned renderer MUST: + +- render the generated TSX using the repository's real DevupUI configuration, fonts, assets, and CSS reset; +- use the reference PNG width and height as the viewport and output dimensions; +- disable animations, transitions, carets, timestamps, network-dependent content, and nondeterministic data; +- wait for `document.fonts.ready`, decoded images, and the application's stable-ready signal; +- capture an opaque or transparent PNG without resizing after capture; +- keep OS, browser engine/version, device scale factor, font files, locale, and timezone pinned in CI. + +The renderer writes `actual.png`. Its implementation is intentionally outside this Rust workspace because it is application-specific and may use Playwright, a browser harness, or another deterministic renderer. + +The exact sequence is: request TSX/theme/reference resources, reconstruct and hash-check every resource chunk, build and type-check the generated component inside the consumer, validate the environment manifest, render at the declared viewport, write `actual.png`, and only then invoke the comparator. A pixel report from an invalid environment is diagnostic evidence, never a passing result. + +## 3. Compare in pure Rust + +```bash +cargo run -p devup-mcp-visual --release -- compare \ + --reference reference.png \ + --actual actual.png \ + --diff diff.png \ + --channel-tolerance 0 \ + --max-changed-ratio 0.005 +``` + +The command decodes only PNG, normalizes both images to RGBA8, compares all four channels, emits one JSON report, and exits with code `0` for `exact` or `within-threshold`, `1` for a visual mismatch, and `2` for invalid input. Dimension differences always fail. The default changed-pixel threshold is 0.5%; teams should tighten it to zero for fully deterministic screens. + +The diff PNG marks every pixel beyond `channel-tolerance` in opaque red. The JSON report contains dimensions, changed/total pixels, changed ratio, maximum channel delta, configured thresholds, and the diff path; it does not contain source pixels or Figma document content. + +## Security and privacy + +Reference screenshots may contain private designs or personal information. They are held in the same bounded, expiring in-memory artifact store as other collected payloads, are never logged, and are only written to disk when an explicit allowlisted `outputPaths.referencePng` is supplied. Do not commit reference, actual, or diff PNGs unless the repository explicitly treats them as approved test fixtures. diff --git a/fixtures/devup-figma-plugin/README.md b/fixtures/devup-figma-plugin/README.md new file mode 100644 index 0000000..f6d5a6b --- /dev/null +++ b/fixtures/devup-figma-plugin/README.md @@ -0,0 +1,22 @@ +# devup-figma-plugin compatibility corpus + +이 corpus는 `dev-five-git/devup-figma-plugin` commit `243db650f1d635ab5385546a2a297eae4ea93515`의 테스트 결과를 고정한 회귀 자료입니다. + +검증 범위는 다음과 같이 구분합니다. + +- `rust_snapshot`: upstream test 252개에서 생성된 JSON input/golden output 268쌍을 `compat_fixtures::upstream_json_goldens`가 byte 단위로 전부 실행합니다. +- `rust_assertion`: upstream assertion inventory 666개를 같은 영역의 실제 Rust 단위·통합 테스트에 연결합니다. import metadata, component usage, responsive provider, asset manifest, Section note, theme scope/conflict와 artifact 재사용을 포함하며 각 항목은 registry의 실행 test를 가리킵니다. +- `upstream_runtime_only`: 38개 항목은 Figma plugin module/codegen handler, iframe, notify 또는 browser download 수명주기에만 의존합니다. 각 항목은 이를 대체하는 MCP tool/error-boundary contract를 가리킵니다. +- `out_of_scope_write`: 22개 항목은 Figma 문서, text style 또는 import 대상을 변경하므로 read-only devup-mcp 범위에서 실행하지 않습니다. 각 항목은 내장 script mutation 비포함 contract를 가리킵니다. +- `not_ported`: 0개입니다. 미분류 항목이 다시 생기면 `compat_manifest`가 실패합니다. + +따라서 정확한 표현은 “268/268 snapshot byte parity, 666개 실행 가능한 대표 Rust assertion 연결, 60개 명시적 runtime/write 경계, 978-entry upstream test inventory”입니다. 대표 assertion 연결은 JavaScript assertion을 각각 별도 fixture로 복제했다는 뜻이 아니라 동일 동작 영역의 production-shaped Rust contract에 연결했다는 뜻입니다. + +`coverage-registry.json`은 parity/대표 assertion에 쓰는 Rust test의 source file과 함수 이름을 등록합니다. `compat_manifest`는 978개 ledger entry가 등록된 실행 test 또는 근거가 있는 비-parity 분류 중 하나인지, 등록 함수가 실제 `#[test]`/`#[tokio::test]`인지, 268개 fixture와 snapshot이 빠짐없이 snapshot harness에 연결됐는지 검사합니다. + +```powershell +cargo test -p devup-mcp-devup-ui --test compat_manifest +cargo test -p devup-mcp-devup-ui --test compat_fixtures +``` + +`manifest.json`은 원본 54개 test file, 978 pass/0 fail, 268 snapshot이라는 upstream 기준 실행 정보와 536개 case/snapshot 파일의 LF-normalized SHA-256을 보존합니다. `ledger.json`은 이 upstream 결과의 inventory/coverage 분류이며 그 자체가 Rust 실행 결과를 뜻하지 않습니다. diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-001-4410624749.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-001-4410624749.json new file mode 100644 index 0000000..dfb917a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-001-4410624749.json @@ -0,0 +1,55 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-001-4410624749", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders simple component without variants 1" + }, + "request": { + "rootId": "captured:1" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:1" + ], + "nodes": { + "captured:1": { + "id": "captured:1", + "type": "FRAME", + "fields": { + "name": "Frame", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-002-c1ac954cb6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-002-c1ac954cb6.json new file mode 100644 index 0000000..9740ec5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-002-c1ac954cb6.json @@ -0,0 +1,56 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-002-c1ac954cb6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders overflow hidden when clipsContent is true 1" + }, + "request": { + "rootId": "captured:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:2" + ], + "nodes": { + "captured:2": { + "id": "captured:2", + "type": "FRAME", + "fields": { + "clipsContent": true, + "name": "ClippedFrame", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-003-c855738695.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-003-c855738695.json new file mode 100644 index 0000000..15ad511 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-003-c855738695.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-003-c855738695", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders objectFit contain for image asset 1" + }, + "request": { + "rootId": "captured:3" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:3" + ], + "nodes": { + "captured:3": { + "id": "captured:3", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "scaleMode": "FIT", + "type": "IMAGE", + "visible": true + } + ], + "height": 80, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ObjectFitContain", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-004-8ec61c5bb5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-004-8ec61c5bb5.json new file mode 100644 index 0000000..5f196a7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-004-8ec61c5bb5.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-004-8ec61c5bb5", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders objectFit cover for image asset 1" + }, + "request": { + "rootId": "captured:4" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:4" + ], + "nodes": { + "captured:4": { + "id": "captured:4", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "scaleMode": "CROP", + "type": "IMAGE", + "visible": true + } + ], + "height": 90, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ObjectFitCover", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-005-bcc6ca7dbf.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-005-bcc6ca7dbf.json new file mode 100644 index 0000000..c4bce2c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-005-bcc6ca7dbf.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-005-bcc6ca7dbf", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen omits objectFit when image scale mode is FILL 1" + }, + "request": { + "rootId": "captured:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:5" + ], + "nodes": { + "captured:5": { + "id": "captured:5", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "scaleMode": "FILL", + "type": "IMAGE", + "visible": true + } + ], + "height": 70, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ObjectFitFill", + "visible": true, + "width": 110, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-006-86c21dc8ce.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-006-86c21dc8ce.json new file mode 100644 index 0000000..2614bb9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-006-86c21dc8ce.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-006-86c21dc8ce", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with vector node 1" + }, + "request": { + "rootId": "captured:6" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:6" + ], + "nodes": { + "captured:6": { + "id": "captured:6", + "type": "VECTOR", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "VectorIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-007-c1c1afa5d7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-007-c1c1afa5d7.json new file mode 100644 index 0000000..278fb0f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-007-c1c1afa5d7.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-007-c1c1afa5d7", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with star node 1" + }, + "request": { + "rootId": "captured:7" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:7" + ], + "nodes": { + "captured:7": { + "id": "captured:7", + "type": "STAR", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "StarIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-008-8ea06a6c88.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-008-8ea06a6c88.json new file mode 100644 index 0000000..8672f2e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-008-8ea06a6c88.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-008-8ea06a6c88", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with polygon node 1" + }, + "request": { + "rootId": "captured:8" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:8" + ], + "nodes": { + "captured:8": { + "id": "captured:8", + "type": "POLYGON", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PolygonIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-009-008aac1a2c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-009-008aac1a2c.json new file mode 100644 index 0000000..3aeaaf9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-009-008aac1a2c.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-009-008aac1a2c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with ellipse inner radius 1" + }, + "request": { + "rootId": "captured:9" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:9" + ], + "nodes": { + "captured:9": { + "id": "captured:9", + "type": "ELLIPSE", + "fields": { + "arcData": { + "innerRadius": 0.5 + }, + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "EllipseIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-010-8454d22acd.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-010-8454d22acd.json new file mode 100644 index 0000000..28bb90c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-010-8454d22acd.json @@ -0,0 +1,99 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-010-8454d22acd", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with non-solid fills 1" + }, + "request": { + "rootId": "captured:10" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:10" + ], + "nodes": { + "captured:10": { + "id": "captured:10", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "GradientAsset", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-011-72709aab82.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-011-72709aab82.json new file mode 100644 index 0000000..6a6a9e4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-011-72709aab82.json @@ -0,0 +1,91 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-011-72709aab82", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders asset with single child and fills 1" + }, + "request": { + "rootId": "captured:12" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:12" + ], + "nodes": { + "captured:12": { + "id": "captured:12", + "type": "FRAME", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ParentAsset", + "visible": true, + "width": 24, + "childrenIds": [ + "captured:11" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:11": { + "id": "captured:11", + "type": "VECTOR", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ChildVector", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-012-92c671c0e8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-012-92c671c0e8.json new file mode 100644 index 0000000..7d11e51 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-012-92c671c0e8.json @@ -0,0 +1,72 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-012-92c671c0e8", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders null for asset with only solid fills 1" + }, + "request": { + "rootId": "captured:13" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:13" + ], + "nodes": { + "captured:13": { + "id": "captured:13", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SolidAsset", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-013-351e69a13b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-013-351e69a13b.json new file mode 100644 index 0000000..7f1a6bf --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-013-351e69a13b.json @@ -0,0 +1,77 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-013-351e69a13b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with bound variable color 1" + }, + "request": { + "rootId": "captured:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:14" + ], + "nodes": { + "captured:14": { + "id": "captured:14", + "type": "FRAME", + "fields": { + "fills": [ + { + "boundVariables": { + "color": { + "id": "var1", + "type": "COLOR" + } + }, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "VariableFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-014-828c466260.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-014-828c466260.json new file mode 100644 index 0000000..0edec4f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-014-828c466260.json @@ -0,0 +1,72 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-014-828c466260", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with same color mask 1" + }, + "request": { + "rootId": "captured:15" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:15" + ], + "nodes": { + "captured:15": { + "id": "captured:15", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "MaskIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-015-eaef178e47.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-015-eaef178e47.json new file mode 100644 index 0000000..13ee45f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-015-eaef178e47.json @@ -0,0 +1,111 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-015-eaef178e47", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with children same color 1" + }, + "request": { + "rootId": "captured:18" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:18" + ], + "nodes": { + "captured:18": { + "id": "captured:18", + "type": "FRAME", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "GroupIcon", + "visible": true, + "width": 24, + "childrenIds": [ + "captured:16", + "captured:17" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:16": { + "id": "captured:16", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "name": "Vector1", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:17": { + "id": "captured:17", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "name": "Vector2", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-016-3f1fb1569b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-016-3f1fb1569b.json new file mode 100644 index 0000000..76a4489 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-016-3f1fb1569b.json @@ -0,0 +1,111 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-016-3f1fb1569b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with different color children 1" + }, + "request": { + "rootId": "captured:21" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:21" + ], + "nodes": { + "captured:21": { + "id": "captured:21", + "type": "FRAME", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "MixedIcon", + "visible": true, + "width": 24, + "childrenIds": [ + "captured:19", + "captured:20" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:19": { + "id": "captured:19", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "name": "Vector1", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:20": { + "id": "captured:20", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "name": "Vector2", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-017-44cff97cec.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-017-44cff97cec.json new file mode 100644 index 0000000..743170b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-017-44cff97cec.json @@ -0,0 +1,99 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-017-44cff97cec", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with non-solid fill 1" + }, + "request": { + "rootId": "captured:22" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:22" + ], + "nodes": { + "captured:22": { + "id": "captured:22", + "type": "VECTOR", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "GradientIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-018-bc5eb21a9e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-018-bc5eb21a9e.json new file mode 100644 index 0000000..4453c35 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-018-bc5eb21a9e.json @@ -0,0 +1,72 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-018-bc5eb21a9e", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders svg asset with invisible fill 1" + }, + "request": { + "rootId": "captured:23" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:23" + ], + "nodes": { + "captured:23": { + "id": "captured:23", + "type": "VECTOR", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "InvisibleIcon", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-019-4988f86e5e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-019-4988f86e5e.json new file mode 100644 index 0000000..d9cda42 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-019-4988f86e5e.json @@ -0,0 +1,139 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-019-4988f86e5e", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders nested svg asset with 3 solid fill boxes in frame 1" + }, + "request": { + "rootId": "captured:27" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:27" + ], + "nodes": { + "captured:27": { + "id": "captured:27", + "type": "FRAME", + "fields": { + "height": 24, + "isAsset": false, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "NestedIcon", + "visible": true, + "width": 24, + "childrenIds": [ + "captured:24", + "captured:25", + "captured:26" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:24": { + "id": "captured:24", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box1", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:25": { + "id": "captured:25", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box2", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:26": { + "id": "captured:26", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box3", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-020-a9d569be7a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-020-a9d569be7a.json new file mode 100644 index 0000000..810d533 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-020-a9d569be7a.json @@ -0,0 +1,139 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-020-a9d569be7a", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders nested svg asset with different colors as image 1" + }, + "request": { + "rootId": "captured:31" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:31" + ], + "nodes": { + "captured:31": { + "id": "captured:31", + "type": "FRAME", + "fields": { + "height": 24, + "isAsset": true, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "NestedMultiColorIcon", + "visible": true, + "width": 24, + "childrenIds": [ + "captured:28", + "captured:29", + "captured:30" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:28": { + "id": "captured:28", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box1", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:29": { + "id": "captured:29", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 1, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box2", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:30": { + "id": "captured:30", + "type": "RECTANGLE", + "fields": { + "fills": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": false, + "name": "Box3", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-021-6cae93b843.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-021-6cae93b843.json new file mode 100644 index 0000000..6177f6b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-021-6cae93b843.json @@ -0,0 +1,81 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-021-6cae93b843", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders layout for absolute child same size as parent 1" + }, + "request": { + "rootId": "captured:33" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:33" + ], + "nodes": { + "captured:33": { + "id": "captured:33", + "type": "FRAME", + "fields": { + "height": 200, + "layoutPositioning": "AUTO", + "name": "Parent", + "visible": true, + "width": 300, + "childrenIds": [ + "captured:32" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:32": { + "id": "captured:32", + "type": "RECTANGLE", + "fields": { + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 200, + "layoutPositioning": "ABSOLUTE", + "name": "AbsoluteChild", + "visible": true, + "width": 300, + "x": 0, + "y": 0, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-022-8dce1fe15f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-022-8dce1fe15f.json new file mode 100644 index 0000000..be4e42c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-022-8dce1fe15f.json @@ -0,0 +1,83 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-022-8dce1fe15f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders absolute child with horizontal MAX constraint 1" + }, + "request": { + "rootId": "captured:35" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:35" + ], + "nodes": { + "captured:35": { + "id": "captured:35", + "type": "FRAME", + "fields": { + "height": 300, + "inferredAutoLayout": { + "layoutMode": "HORIZONTAL" + }, + "name": "ParentWithAutoLayout", + "visible": true, + "width": 400, + "childrenIds": [ + "captured:34" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:34": { + "id": "captured:34", + "type": "RECTANGLE", + "fields": { + "constraints": { + "horizontal": "MAX", + "vertical": "MIN" + }, + "height": 100, + "layoutPositioning": "ABSOLUTE", + "name": "MaxRightChild", + "visible": true, + "width": 50, + "x": 350, + "y": 50, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-023-040bff1c77.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-023-040bff1c77.json new file mode 100644 index 0000000..cc5af11 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-023-040bff1c77.json @@ -0,0 +1,83 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-023-040bff1c77", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders absolute child with horizontal CENTER constraint 1" + }, + "request": { + "rootId": "captured:37" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:37" + ], + "nodes": { + "captured:37": { + "id": "captured:37", + "type": "FRAME", + "fields": { + "height": 400, + "inferredAutoLayout": { + "layoutMode": "VERTICAL" + }, + "name": "ParentWithAutoLayout2", + "visible": true, + "width": 500, + "childrenIds": [ + "captured:36" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:36": { + "id": "captured:36", + "type": "RECTANGLE", + "fields": { + "constraints": { + "horizontal": "CENTER", + "vertical": "CENTER" + }, + "height": 100, + "layoutPositioning": "ABSOLUTE", + "name": "CenterChild", + "visible": true, + "width": 100, + "x": 200, + "y": 150, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-024-eb534f354c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-024-eb534f354c.json new file mode 100644 index 0000000..718d99b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-024-eb534f354c.json @@ -0,0 +1,83 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-024-eb534f354c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders absolute child with vertical MAX constraint 1" + }, + "request": { + "rootId": "captured:39" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:39" + ], + "nodes": { + "captured:39": { + "id": "captured:39", + "type": "FRAME", + "fields": { + "height": 500, + "inferredAutoLayout": { + "layoutMode": "HORIZONTAL" + }, + "name": "ParentWithAutoLayout3", + "visible": true, + "width": 600, + "childrenIds": [ + "captured:38" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:38": { + "id": "captured:38", + "type": "RECTANGLE", + "fields": { + "constraints": { + "horizontal": "MIN", + "vertical": "MAX" + }, + "height": 50, + "layoutPositioning": "ABSOLUTE", + "name": "MaxBottomChild", + "visible": true, + "width": 100, + "x": 50, + "y": 450, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-025-74cf3c3463.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-025-74cf3c3463.json new file mode 100644 index 0000000..2e1a4a1 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-025-74cf3c3463.json @@ -0,0 +1,83 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-025-74cf3c3463", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders absolute child with vertical CENTER constraint 1" + }, + "request": { + "rootId": "captured:41" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:41" + ], + "nodes": { + "captured:41": { + "id": "captured:41", + "type": "FRAME", + "fields": { + "height": 600, + "inferredAutoLayout": { + "layoutMode": "VERTICAL" + }, + "name": "ParentWithAutoLayout4", + "visible": true, + "width": 700, + "childrenIds": [ + "captured:40" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:40": { + "id": "captured:40", + "type": "RECTANGLE", + "fields": { + "constraints": { + "horizontal": "MIN", + "vertical": "CENTER" + }, + "height": 100, + "layoutPositioning": "ABSOLUTE", + "name": "VerticalCenterChild", + "visible": true, + "width": 100, + "x": 300, + "y": 250, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-026-e6df42a1c0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-026-e6df42a1c0.json new file mode 100644 index 0000000..5ce5b89 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-026-e6df42a1c0.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-026-e6df42a1c0", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders flex=1 when parent is horizontal auto layout 1" + }, + "request": { + "rootId": "captured:43" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:43" + ], + "nodes": { + "captured:43": { + "id": "captured:43", + "type": "FRAME", + "fields": { + "layoutMode": "HORIZONTAL", + "name": "HorizontalParent", + "visible": true, + "childrenIds": [ + "captured:42" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:42": { + "id": "captured:42", + "type": "RECTANGLE", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "name": "FlexChild", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-027-2373d0fb1b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-027-2373d0fb1b.json new file mode 100644 index 0000000..a7a27c3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-027-2373d0fb1b.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-027-2373d0fb1b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders aspect ratio when provided 1" + }, + "request": { + "rootId": "captured:44" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:44" + ], + "nodes": { + "captured:44": { + "id": "captured:44", + "type": "FRAME", + "fields": { + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "name": "AspectRatioFrame", + "targetAspectRatio": { + "x": 4, + "y": 3 + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-028-0dcf04d5ca.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-028-0dcf04d5ca.json new file mode 100644 index 0000000..7f97dd0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-028-0dcf04d5ca.json @@ -0,0 +1,101 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-028-0dcf04d5ca", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text with width_and_height auto resize returning no size props 1" + }, + "request": { + "rootId": "captured:45" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:45" + ], + "nodes": { + "captured:45": { + "id": "captured:45", + "type": "TEXT", + "fields": { + "characters": "AutoSize", + "effects": [], + "height": 40, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TextWidthHeight", + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "AutoSize", + "end": 8, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-029-dd01228f04.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-029-dd01228f04.json new file mode 100644 index 0000000..2c10845 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-029-dd01228f04.json @@ -0,0 +1,101 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-029-dd01228f04", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text with special characters 1" + }, + "request": { + "rootId": "captured:46" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:46" + ], + "nodes": { + "captured:46": { + "id": "captured:46", + "type": "TEXT", + "fields": { + "characters": "Text with {braces} & ", + "effects": [], + "height": 20, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SpecialText", + "strokes": [], + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Text with {braces} & ", + "end": 27, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-030-f4528f2a74.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-030-f4528f2a74.json new file mode 100644 index 0000000..cfff45e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-030-f4528f2a74.json @@ -0,0 +1,101 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-030-f4528f2a74", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text with leading and trailing spaces 1" + }, + "request": { + "rootId": "captured:47" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:47" + ], + "nodes": { + "captured:47": { + "id": "captured:47", + "type": "TEXT", + "fields": { + "characters": " spaced ", + "effects": [], + "height": 20, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SpacedText", + "strokes": [], + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": " spaced ", + "end": 10, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-031-5d6f0a82e3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-031-5d6f0a82e3.json new file mode 100644 index 0000000..a008a7c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-031-5d6f0a82e3.json @@ -0,0 +1,97 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-031-5d6f0a82e3", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders single-line max line props 1" + }, + "request": { + "rootId": "captured:48" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:48" + ], + "nodes": { + "captured:48": { + "id": "captured:48", + "type": "TEXT", + "fields": { + "effects": [], + "maxLines": 1, + "name": "MaxLineOne", + "strokes": [], + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "OneLine", + "end": 7, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-032-be85ad69d0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-032-be85ad69d0.json new file mode 100644 index 0000000..3650443 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-032-be85ad69d0.json @@ -0,0 +1,97 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-032-be85ad69d0", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders multi-line max line props 1" + }, + "request": { + "rootId": "captured:49" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:49" + ], + "nodes": { + "captured:49": { + "id": "captured:49", + "type": "TEXT", + "fields": { + "effects": [], + "maxLines": 3, + "name": "MaxLineThree", + "strokes": [], + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Three lines of text", + "end": 19, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-033-4f42f0cabb.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-033-4f42f0cabb.json new file mode 100644 index 0000000..e0813d1 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-033-4f42f0cabb.json @@ -0,0 +1,59 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-033-4f42f0cabb", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders fixed size frame 1" + }, + "request": { + "rootId": "captured:50" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:50" + ], + "nodes": { + "captured:50": { + "id": "captured:50", + "type": "FRAME", + "fields": { + "height": 80, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "FixedFrame", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-034-e25e34d3de.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-034-e25e34d3de.json new file mode 100644 index 0000000..ced3e1c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-034-e25e34d3de.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-034-e25e34d3de", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with padding 1" + }, + "request": { + "rootId": "captured:51" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:51" + ], + "nodes": { + "captured:51": { + "id": "captured:51", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PaddedFrame", + "paddingBottom": 8, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 8, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-035-1d66b429cf.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-035-1d66b429cf.json new file mode 100644 index 0000000..1f98cbd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-035-1d66b429cf.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-035-1d66b429cf", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders padding shorthand when all sides equal 1" + }, + "request": { + "rootId": "captured:52" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:52" + ], + "nodes": { + "captured:52": { + "id": "captured:52", + "type": "FRAME", + "fields": { + "height": 40, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "EqualPaddingFrame", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "visible": true, + "width": 80, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-036-6803ff59e6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-036-6803ff59e6.json new file mode 100644 index 0000000..f5fbadd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-036-6803ff59e6.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-036-6803ff59e6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders padding with top equals bottom but left right different 1" + }, + "request": { + "rootId": "captured:53" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:53" + ], + "nodes": { + "captured:53": { + "id": "captured:53", + "type": "FRAME", + "fields": { + "height": 60, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TopBottomEqualPaddingFrame", + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 20, + "paddingTop": 10, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-037-e576c2fba9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-037-e576c2fba9.json new file mode 100644 index 0000000..06464c4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-037-e576c2fba9.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-037-e576c2fba9", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders padding with left equals right but top bottom different 1" + }, + "request": { + "rootId": "captured:54" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:54" + ], + "nodes": { + "captured:54": { + "id": "captured:54", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LeftRightEqualPaddingFrame", + "paddingBottom": 25, + "paddingLeft": 15, + "paddingRight": 15, + "paddingTop": 5, + "visible": true, + "width": 90, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-038-280770f34d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-038-280770f34d.json new file mode 100644 index 0000000..7e7529d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-038-280770f34d.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-038-280770f34d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders padding with all sides different 1" + }, + "request": { + "rootId": "captured:55" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:55" + ], + "nodes": { + "captured:55": { + "id": "captured:55", + "type": "FRAME", + "fields": { + "height": 70, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "AllDifferentPaddingFrame", + "paddingBottom": 3, + "paddingLeft": 4, + "paddingRight": 2, + "paddingTop": 1, + "visible": true, + "width": 110, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-039-84e4037075.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-039-84e4037075.json new file mode 100644 index 0000000..26a4775 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-039-84e4037075.json @@ -0,0 +1,65 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-039-84e4037075", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders padding from inferredAutoLayout 1" + }, + "request": { + "rootId": "captured:56" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:56" + ], + "nodes": { + "captured:56": { + "id": "captured:56", + "type": "FRAME", + "fields": { + "height": 50, + "inferredAutoLayout": { + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10 + }, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "InferredPaddingFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-040-e2a36763a6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-040-e2a36763a6.json new file mode 100644 index 0000000..7340a23 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-040-e2a36763a6.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-040-e2a36763a6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with border radius 1" + }, + "request": { + "rootId": "captured:57" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:57" + ], + "nodes": { + "captured:57": { + "id": "captured:57", + "type": "FRAME", + "fields": { + "cornerRadius": 8, + "height": 80, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "RoundedFrame", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-041-7c9175487c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-041-7c9175487c.json new file mode 100644 index 0000000..e1cfdd0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-041-7c9175487c.json @@ -0,0 +1,59 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-041-7c9175487c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders mixed border radius frame 1" + }, + "request": { + "rootId": "captured:58" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:58" + ], + "nodes": { + "captured:58": { + "id": "captured:58", + "type": "FRAME", + "fields": { + "bottomLeftRadius": 1, + "bottomRightRadius": 2, + "name": "MixedRadius", + "topLeftRadius": 8, + "topRightRadius": 4, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-042-246e72e17a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-042-246e72e17a.json new file mode 100644 index 0000000..01dcce9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-042-246e72e17a.json @@ -0,0 +1,62 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-042-246e72e17a", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders ellipse with 50% border radius 1" + }, + "request": { + "rootId": "captured:59" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:59" + ], + "nodes": { + "captured:59": { + "id": "captured:59", + "type": "ELLIPSE", + "fields": { + "arcData": { + "innerRadius": 0 + }, + "height": 100, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "Circle", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-043-50fac72de7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-043-50fac72de7.json new file mode 100644 index 0000000..6ca1f99 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-043-50fac72de7.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-043-50fac72de7", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with stroke outline CENTER alignment 1" + }, + "request": { + "rootId": "captured:60" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:60" + ], + "nodes": { + "captured:60": { + "id": "captured:60", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "StrokeCenterFrame", + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-044-a9f4c5ba13.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-044-a9f4c5ba13.json new file mode 100644 index 0000000..a95617f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-044-a9f4c5ba13.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-044-a9f4c5ba13", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with stroke outline OUTSIDE alignment 1" + }, + "request": { + "rootId": "captured:61" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:61" + ], + "nodes": { + "captured:61": { + "id": "captured:61", + "type": "FRAME", + "fields": { + "height": 60, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "StrokeOutsideFrame", + "strokeAlign": "OUTSIDE", + "strokeWeight": 3, + "strokes": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-045-958507518d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-045-958507518d.json new file mode 100644 index 0000000..2b99a59 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-045-958507518d.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-045-958507518d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with stroke border INSIDE alignment 1" + }, + "request": { + "rootId": "captured:62" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:62" + ], + "nodes": { + "captured:62": { + "id": "captured:62", + "type": "FRAME", + "fields": { + "height": 40, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "StrokeInsideFrame", + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "color": { + "b": 0, + "g": 1, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 80, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-046-82a07e3ec3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-046-82a07e3ec3.json new file mode 100644 index 0000000..483e2b9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-046-82a07e3ec3.json @@ -0,0 +1,69 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-046-82a07e3ec3", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders line with stroke outline 1" + }, + "request": { + "rootId": "captured:63" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:63" + ], + "nodes": { + "captured:63": { + "id": "captured:63", + "type": "LINE", + "fields": { + "name": "StrokeLine", + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-047-d524fcd6c3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-047-d524fcd6c3.json new file mode 100644 index 0000000..46da0d0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-047-d524fcd6c3.json @@ -0,0 +1,77 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-047-d524fcd6c3", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with dashed stroke 1" + }, + "request": { + "rootId": "captured:64" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:64" + ], + "nodes": { + "captured:64": { + "id": "captured:64", + "type": "FRAME", + "fields": { + "dashPattern": [ + 5, + 3 + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "DashedStrokeFrame", + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-048-fa3442e264.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-048-fa3442e264.json new file mode 100644 index 0000000..610b513 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-048-fa3442e264.json @@ -0,0 +1,57 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-048-fa3442e264", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with page parent and width 1920 1" + }, + "request": { + "rootId": "captured:65" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:65" + ], + "nodes": { + "captured:65": { + "id": "captured:65", + "type": "FRAME", + "fields": { + "height": 1080, + "name": "PageFrame", + "visible": true, + "width": 1920, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-049-b3bbd32960.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-049-b3bbd32960.json new file mode 100644 index 0000000..de88169 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-049-b3bbd32960.json @@ -0,0 +1,57 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-049-b3bbd32960", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with section parent 1" + }, + "request": { + "rootId": "captured:66" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:66" + ], + "nodes": { + "captured:66": { + "id": "captured:66", + "type": "FRAME", + "fields": { + "height": 100, + "name": "SectionFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-050-fda399bfe0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-050-fda399bfe0.json new file mode 100644 index 0000000..30c889b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-050-fda399bfe0.json @@ -0,0 +1,76 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-050-fda399bfe0", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with vertical center align child width shrinker 1" + }, + "request": { + "rootId": "captured:68" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:68" + ], + "nodes": { + "captured:68": { + "id": "captured:68", + "type": "FRAME", + "fields": { + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "layoutMode": "VERTICAL" + }, + "name": "Parent", + "visible": true, + "childrenIds": [ + "captured:67" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:67": { + "id": "captured:67", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "name": "Child", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-051-53df7b9474.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-051-53df7b9474.json new file mode 100644 index 0000000..b600e16 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-051-53df7b9474.json @@ -0,0 +1,76 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-051-53df7b9474", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with horizontal center align child height shrinker 1" + }, + "request": { + "rootId": "captured:70" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:70" + ], + "nodes": { + "captured:70": { + "id": "captured:70", + "type": "FRAME", + "fields": { + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "layoutMode": "HORIZONTAL" + }, + "name": "Parent", + "visible": true, + "childrenIds": [ + "captured:69" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:69": { + "id": "captured:69", + "type": "FRAME", + "fields": { + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FILL", + "name": "Child", + "visible": true, + "width": 50, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-052-e6195ba5a2.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-052-e6195ba5a2.json new file mode 100644 index 0000000..bd06481 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-052-e6195ba5a2.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-052-e6195ba5a2", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with maxWidth child width shrinker 1" + }, + "request": { + "rootId": "captured:72" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:72" + ], + "nodes": { + "captured:72": { + "id": "captured:72", + "type": "FRAME", + "fields": { + "name": "Parent", + "visible": true, + "childrenIds": [ + "captured:71" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:71": { + "id": "captured:71", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxWidth": 200, + "name": "Child", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-053-5fbe283840.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-053-5fbe283840.json new file mode 100644 index 0000000..69a137c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-053-5fbe283840.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-053-5fbe283840", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with maxHeight child height shrinker 1" + }, + "request": { + "rootId": "captured:74" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:74" + ], + "nodes": { + "captured:74": { + "id": "captured:74", + "type": "FRAME", + "fields": { + "name": "Parent", + "visible": true, + "childrenIds": [ + "captured:73" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:73": { + "id": "captured:73", + "type": "FRAME", + "fields": { + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FILL", + "maxHeight": 200, + "name": "Child", + "visible": true, + "width": 50, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-054-e536c17528.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-054-e536c17528.json new file mode 100644 index 0000000..5fe51e0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-054-e536c17528.json @@ -0,0 +1,76 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-054-e536c17528", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with individual stroke weights 1" + }, + "request": { + "rootId": "captured:75" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:75" + ], + "nodes": { + "captured:75": { + "id": "captured:75", + "type": "FRAME", + "fields": { + "height": 80, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "IndividualStrokeFrame", + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 4, + "strokeRightWeight": 2, + "strokeTopWeight": 1, + "strokes": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-055-1539142ffd.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-055-1539142ffd.json new file mode 100644 index 0000000..9f296fd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-055-1539142ffd.json @@ -0,0 +1,55 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-055-1539142ffd", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders group as Box with full size 1" + }, + "request": { + "rootId": "captured:76" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:76" + ], + "nodes": { + "captured:76": { + "id": "captured:76", + "type": "GROUP", + "fields": { + "name": "Group", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-056-834fa66895.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-056-834fa66895.json new file mode 100644 index 0000000..fb216e7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-056-834fa66895.json @@ -0,0 +1,59 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-056-834fa66895", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders boxSize when width equals height 1" + }, + "request": { + "rootId": "captured:77" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:77" + ], + "nodes": { + "captured:77": { + "id": "captured:77", + "type": "FRAME", + "fields": { + "height": 64, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SquareFrame", + "visible": true, + "width": 64, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-057-595a483b50.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-057-595a483b50.json new file mode 100644 index 0000000..6f5cddc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-057-595a483b50.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-057-595a483b50", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders min/max width/height with px 1" + }, + "request": { + "rootId": "captured:78" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:78" + ], + "nodes": { + "captured:78": { + "id": "captured:78", + "type": "FRAME", + "fields": { + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": 120, + "maxWidth": 200, + "minHeight": 20, + "minWidth": 50, + "name": "MinMaxFrame", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-058-a5bed8edb7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-058-a5bed8edb7.json new file mode 100644 index 0000000..864a9b6 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-058-a5bed8edb7.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-058-a5bed8edb7", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders flex auto layout props 1" + }, + "request": { + "rootId": "captured:79" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:79" + ], + "nodes": { + "captured:79": { + "id": "captured:79", + "type": "FRAME", + "fields": { + "counterAxisAlignItems": "CENTER", + "inferredAutoLayout": { + "itemSpacing": 10, + "layoutMode": "HORIZONTAL" + }, + "name": "FlexAutoLayout", + "primaryAxisAlignItems": "SPACE_BETWEEN", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-059-0b07052901.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-059-0b07052901.json new file mode 100644 index 0000000..3a2d83f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-059-0b07052901.json @@ -0,0 +1,62 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-059-0b07052901", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders grid auto layout props 1" + }, + "request": { + "rootId": "captured:80" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:80" + ], + "nodes": { + "captured:80": { + "id": "captured:80", + "type": "FRAME", + "fields": { + "gridColumnCount": 3, + "gridColumnGap": 8, + "gridRowCount": 2, + "gridRowGap": 12, + "inferredAutoLayout": { + "layoutMode": "GRID" + }, + "name": "GridAutoLayout", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-060-b58a7535c7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-060-b58a7535c7.json new file mode 100644 index 0000000..28cf9dc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-060-b58a7535c7.json @@ -0,0 +1,97 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-060-b58a7535c7", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders grid child positioning props when out of order 1" + }, + "request": { + "rootId": "captured:83" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:83" + ], + "nodes": { + "captured:83": { + "id": "captured:83", + "type": "FRAME", + "fields": { + "gridColumnCount": 2, + "gridColumnGap": 0, + "gridRowCount": 1, + "gridRowGap": 0, + "height": 100, + "inferredAutoLayout": { + "layoutMode": "GRID" + }, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "GridWithChildren", + "visible": true, + "width": 200, + "childrenIds": [ + "captured:81", + "captured:82" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:81": { + "id": "captured:81", + "type": "RECTANGLE", + "fields": { + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 0, + "name": "ChildB", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:82": { + "id": "captured:82", + "type": "RECTANGLE", + "fields": { + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 0, + "name": "ChildA", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-061-1c44313e59.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-061-1c44313e59.json new file mode 100644 index 0000000..347a0e9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-061-1c44313e59.json @@ -0,0 +1,92 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-061-1c44313e59", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders vstack auto layout props 1" + }, + "request": { + "rootId": "captured:86" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:86" + ], + "nodes": { + "captured:86": { + "id": "captured:86", + "type": "FRAME", + "fields": { + "counterAxisAlignItems": "CENTER", + "height": 200, + "inferredAutoLayout": { + "itemSpacing": 16, + "layoutMode": "VERTICAL" + }, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "VStackAutoLayout", + "primaryAxisAlignItems": "SPACE_BETWEEN", + "visible": true, + "width": 120, + "childrenIds": [ + "captured:84", + "captured:85" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:84": { + "id": "captured:84", + "type": "FRAME", + "fields": { + "name": "Fixture Child 1", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:85": { + "id": "captured:85", + "type": "FRAME", + "fields": { + "name": "Fixture Child 2", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-062-4fdcb21c9d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-062-4fdcb21c9d.json new file mode 100644 index 0000000..9cf0bd5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-062-4fdcb21c9d.json @@ -0,0 +1,65 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-062-4fdcb21c9d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders center auto layout props 1" + }, + "request": { + "rootId": "captured:87" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:87" + ], + "nodes": { + "captured:87": { + "id": "captured:87", + "type": "FRAME", + "fields": { + "counterAxisAlignItems": "CENTER", + "height": 120, + "inferredAutoLayout": { + "itemSpacing": 0, + "layoutMode": "HORIZONTAL" + }, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "CenterAutoLayout", + "primaryAxisAlignItems": "CENTER", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-063-a8231002de.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-063-a8231002de.json new file mode 100644 index 0000000..952486a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-063-a8231002de.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-063-a8231002de", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders drop shadow effect props 1" + }, + "request": { + "rootId": "captured:88" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:88" + ], + "nodes": { + "captured:88": { + "id": "captured:88", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "color": { + "a": 0.5, + "b": 0, + "g": 0, + "r": 1 + }, + "offset": { + "x": 2, + "y": 4 + }, + "radius": 6, + "spread": 1, + "type": "DROP_SHADOW", + "visible": true + } + ], + "height": 60, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "EffectFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-064-764419ad9b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-064-764419ad9b.json new file mode 100644 index 0000000..1da4d16 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-064-764419ad9b.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-064-764419ad9b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders inner shadow effect props 1" + }, + "request": { + "rootId": "captured:89" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:89" + ], + "nodes": { + "captured:89": { + "id": "captured:89", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "color": { + "a": 1, + "b": 0, + "g": 1, + "r": 0 + }, + "offset": { + "x": -2, + "y": 3 + }, + "radius": 5, + "spread": 0, + "type": "INNER_SHADOW", + "visible": true + } + ], + "height": 70, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "InnerShadowFrame", + "visible": true, + "width": 90, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-065-6c1be61067.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-065-6c1be61067.json new file mode 100644 index 0000000..de9198e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-065-6c1be61067.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-065-6c1be61067", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders layer blur effect props 1" + }, + "request": { + "rootId": "captured:90" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:90" + ], + "nodes": { + "captured:90": { + "id": "captured:90", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "radius": 4, + "type": "LAYER_BLUR", + "visible": true + } + ], + "height": 80, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LayerBlurFrame", + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-066-6525a64377.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-066-6525a64377.json new file mode 100644 index 0000000..7e96f40 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-066-6525a64377.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-066-6525a64377", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders background blur effect props 1" + }, + "request": { + "rootId": "captured:91" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:91" + ], + "nodes": { + "captured:91": { + "id": "captured:91", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "radius": 8, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "height": 90, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "BackdropBlurFrame", + "visible": true, + "width": 110, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-067-3ffe06a1a9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-067-3ffe06a1a9.json new file mode 100644 index 0000000..b7c3cec --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-067-3ffe06a1a9.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-067-3ffe06a1a9", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders noise effect props 1" + }, + "request": { + "rootId": "captured:92" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:92" + ], + "nodes": { + "captured:92": { + "id": "captured:92", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "radius": 0, + "type": "NOISE", + "visible": true + } + ], + "height": 70, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "NoiseEffectFrame", + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-068-0d86452528.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-068-0d86452528.json new file mode 100644 index 0000000..19bd6e4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-068-0d86452528.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-068-0d86452528", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders texture effect props 1" + }, + "request": { + "rootId": "captured:93" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:93" + ], + "nodes": { + "captured:93": { + "id": "captured:93", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "radius": 0, + "type": "TEXTURE", + "visible": true + } + ], + "height": 60, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TextureEffectFrame", + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-069-0fa1145f4c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-069-0fa1145f4c.json new file mode 100644 index 0000000..f44b708 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-069-0fa1145f4c.json @@ -0,0 +1,67 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-069-0fa1145f4c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders glass effect props 1" + }, + "request": { + "rootId": "captured:94" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:94" + ], + "nodes": { + "captured:94": { + "id": "captured:94", + "type": "FRAME", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "radius": 12, + "type": "GLASS", + "visible": true + } + ], + "height": 80, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "GlassEffectFrame", + "visible": true, + "width": 160, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-070-a01830c33f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-070-a01830c33f.json new file mode 100644 index 0000000..dffd96e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-070-a01830c33f.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-070-a01830c33f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with content 1" + }, + "request": { + "rootId": "captured:95" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:95" + ], + "nodes": { + "captured:95": { + "id": "captured:95", + "type": "TEXT", + "fields": { + "effects": [], + "name": "Text", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Hello", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-071-3a132a6b4d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-071-3a132a6b4d.json new file mode 100644 index 0000000..c7f63c5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-071-3a132a6b4d.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-071-3a132a6b4d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders another text node with content 1" + }, + "request": { + "rootId": "captured:96" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:96" + ], + "nodes": { + "captured:96": { + "id": "captured:96", + "type": "TEXT", + "fields": { + "effects": [], + "name": "Text2", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "World", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-072-df70a74728.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-072-df70a74728.json new file mode 100644 index 0000000..1cc899a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-072-df70a74728.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-072-df70a74728", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with ellipsis props 1" + }, + "request": { + "rootId": "captured:97" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:97" + ], + "nodes": { + "captured:97": { + "id": "captured:97", + "type": "TEXT", + "fields": { + "effects": [], + "name": "EllipsisText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "ENDING", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Ellipsis", + "end": 8, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-073-ef0cdd87cf.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-073-ef0cdd87cf.json new file mode 100644 index 0000000..574e93b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-073-ef0cdd87cf.json @@ -0,0 +1,113 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-073-ef0cdd87cf", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with single drop shadow 1" + }, + "request": { + "rootId": "captured:98" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:98" + ], + "nodes": { + "captured:98": { + "id": "captured:98", + "type": "TEXT", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "color": { + "a": 0.5, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 2, + "y": 4 + }, + "radius": 6, + "type": "DROP_SHADOW", + "visible": true + } + ], + "name": "TextWithShadow", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Shadow", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-074-57a24a2690.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-074-57a24a2690.json new file mode 100644 index 0000000..8ec740e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-074-57a24a2690.json @@ -0,0 +1,129 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-074-57a24a2690", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with multiple drop shadows 1" + }, + "request": { + "rootId": "captured:99" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:99" + ], + "nodes": { + "captured:99": { + "id": "captured:99", + "type": "TEXT", + "fields": { + "effects": [ + { + "blendMode": "NORMAL", + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "offset": { + "x": 1, + "y": 2 + }, + "radius": 3, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "color": { + "a": 0.8, + "b": 0, + "g": 1, + "r": 0 + }, + "offset": { + "x": 4, + "y": 5 + }, + "radius": 6, + "type": "DROP_SHADOW", + "visible": true + } + ], + "name": "TextWithMultipleShadows", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "MultiShadow", + "end": 11, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-075-fb8db22bb9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-075-fb8db22bb9.json new file mode 100644 index 0000000..cc823d2 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-075-fb8db22bb9.json @@ -0,0 +1,108 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-075-fb8db22bb9", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with stroke 1" + }, + "request": { + "rootId": "captured:100" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:100" + ], + "nodes": { + "captured:100": { + "id": "captured:100", + "type": "TEXT", + "fields": { + "effects": [], + "name": "TextWithStroke", + "strokeWeight": 2, + "strokes": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Stroke", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-076-3d2d4543bb.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-076-3d2d4543bb.json new file mode 100644 index 0000000..ad344a7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-076-3d2d4543bb.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-076-3d2d4543bb", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with multiple segments 1" + }, + "request": { + "rootId": "captured:101" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:101" + ], + "nodes": { + "captured:101": { + "id": "captured:101", + "type": "TEXT", + "fields": { + "effects": [], + "name": "MultiSegmentText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Hello", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + }, + { + "characters": "World", + "end": 5, + "fills": [ + { + "color": { + "b": 1, + "g": 0, + "r": 0 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style2" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-077-a65991a745.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-077-a65991a745.json new file mode 100644 index 0000000..ce3f3e4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-077-a65991a745.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-077-a65991a745", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with unordered list 1" + }, + "request": { + "rootId": "captured:102" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:102" + ], + "nodes": { + "captured:102": { + "id": "captured:102", + "type": "TEXT", + "fields": { + "effects": [], + "name": "UnorderedListText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Item 1", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "UNORDERED" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-078-d6b1085274.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-078-d6b1085274.json new file mode 100644 index 0000000..4d77b6d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-078-d6b1085274.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-078-d6b1085274", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with ordered list 1" + }, + "request": { + "rootId": "captured:103" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:103" + ], + "nodes": { + "captured:103": { + "id": "captured:103", + "type": "TEXT", + "fields": { + "effects": [], + "name": "OrderedListText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Item 1", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "ORDERED" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-079-9e7f3ee9e4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-079-9e7f3ee9e4.json new file mode 100644 index 0000000..914ec45 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-079-9e7f3ee9e4.json @@ -0,0 +1,96 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-079-9e7f3ee9e4", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with list and multiple lines 1" + }, + "request": { + "rootId": "captured:104" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:104" + ], + "nodes": { + "captured:104": { + "id": "captured:104", + "type": "TEXT", + "fields": { + "effects": [], + "name": "MultiLineListText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Item 1\nItem 2", + "end": 13, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "UNORDERED" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-080-f6233dd6a0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-080-f6233dd6a0.json new file mode 100644 index 0000000..ee8834a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-080-f6233dd6a0.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-080-f6233dd6a0", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with multiple segments without props 1" + }, + "request": { + "rootId": "captured:105" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:105" + ], + "nodes": { + "captured:105": { + "id": "captured:105", + "type": "TEXT", + "fields": { + "effects": [], + "name": "MultiSegmentNoPropsText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Hello", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + }, + { + "characters": "World", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-081-ed3fa48802.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-081-ed3fa48802.json new file mode 100644 index 0000000..ec43dea --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-081-ed3fa48802.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-081-ed3fa48802", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with rotation transform 1" + }, + "request": { + "rootId": "captured:106" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:106" + ], + "nodes": { + "captured:106": { + "id": "captured:106", + "type": "FRAME", + "fields": { + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "RotatedFrame", + "rotation": 45, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-082-db0d8839e8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-082-db0d8839e8.json new file mode 100644 index 0000000..e449042 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-082-db0d8839e8.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-082-db0d8839e8", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with negative rotation transform 1" + }, + "request": { + "rootId": "captured:107" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:107" + ], + "nodes": { + "captured:107": { + "id": "captured:107", + "type": "FRAME", + "fields": { + "height": 40, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "NegativeRotatedFrame", + "rotation": -30, + "visible": true, + "width": 80, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-083-1820110e8a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-083-1820110e8a.json new file mode 100644 index 0000000..553b3ee --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-083-1820110e8a.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-083-1820110e8a", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with decimal rotation transform 1" + }, + "request": { + "rootId": "captured:108" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:108" + ], + "nodes": { + "captured:108": { + "id": "captured:108", + "type": "FRAME", + "fields": { + "height": 60, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "DecimalRotatedFrame", + "rotation": 15.5, + "visible": true, + "width": 120, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-084-3d01c94f87.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-084-3d01c94f87.json new file mode 100644 index 0000000..c06a7d8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-084-3d01c94f87.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-084-3d01c94f87", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with opacity less than 1 1" + }, + "request": { + "rootId": "captured:109" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:109" + ], + "nodes": { + "captured:109": { + "id": "captured:109", + "type": "FRAME", + "fields": { + "blendMode": "NORMAL", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "OpacityFrame", + "opacity": 0.5, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-085-1f274ec7a6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-085-1f274ec7a6.json new file mode 100644 index 0000000..36d60d0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-085-1f274ec7a6.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-085-1f274ec7a6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with darken blend mode 1" + }, + "request": { + "rootId": "captured:110" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:110" + ], + "nodes": { + "captured:110": { + "id": "captured:110", + "type": "FRAME", + "fields": { + "blendMode": "DARKEN", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "DarkenBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-086-a44a580f30.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-086-a44a580f30.json new file mode 100644 index 0000000..92e8372 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-086-a44a580f30.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-086-a44a580f30", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with multiply blend mode 1" + }, + "request": { + "rootId": "captured:111" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:111" + ], + "nodes": { + "captured:111": { + "id": "captured:111", + "type": "FRAME", + "fields": { + "blendMode": "MULTIPLY", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "MultiplyBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-087-e95c0eccc2.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-087-e95c0eccc2.json new file mode 100644 index 0000000..ca8a58b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-087-e95c0eccc2.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-087-e95c0eccc2", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with screen blend mode 1" + }, + "request": { + "rootId": "captured:112" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:112" + ], + "nodes": { + "captured:112": { + "id": "captured:112", + "type": "FRAME", + "fields": { + "blendMode": "SCREEN", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ScreenBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-088-f9ca312d49.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-088-f9ca312d49.json new file mode 100644 index 0000000..f015f40 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-088-f9ca312d49.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-088-f9ca312d49", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with overlay blend mode 1" + }, + "request": { + "rootId": "captured:113" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:113" + ], + "nodes": { + "captured:113": { + "id": "captured:113", + "type": "FRAME", + "fields": { + "blendMode": "OVERLAY", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "OverlayBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-089-1d28dfdd93.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-089-1d28dfdd93.json new file mode 100644 index 0000000..01483b8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-089-1d28dfdd93.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-089-1d28dfdd93", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with linear burn blend mode 1" + }, + "request": { + "rootId": "captured:114" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:114" + ], + "nodes": { + "captured:114": { + "id": "captured:114", + "type": "FRAME", + "fields": { + "blendMode": "LINEAR_BURN", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LinearBurnBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-090-e8878c5cbf.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-090-e8878c5cbf.json new file mode 100644 index 0000000..14c5911 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-090-e8878c5cbf.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-090-e8878c5cbf", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with color burn blend mode 1" + }, + "request": { + "rootId": "captured:115" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:115" + ], + "nodes": { + "captured:115": { + "id": "captured:115", + "type": "FRAME", + "fields": { + "blendMode": "COLOR_BURN", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ColorBurnBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-091-dc61cb2277.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-091-dc61cb2277.json new file mode 100644 index 0000000..f6dcd94 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-091-dc61cb2277.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-091-dc61cb2277", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with lighten blend mode 1" + }, + "request": { + "rootId": "captured:116" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:116" + ], + "nodes": { + "captured:116": { + "id": "captured:116", + "type": "FRAME", + "fields": { + "blendMode": "LIGHTEN", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LightenBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-092-96adc16d0c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-092-96adc16d0c.json new file mode 100644 index 0000000..aff8e26 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-092-96adc16d0c.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-092-96adc16d0c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with linear dodge blend mode 1" + }, + "request": { + "rootId": "captured:117" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:117" + ], + "nodes": { + "captured:117": { + "id": "captured:117", + "type": "FRAME", + "fields": { + "blendMode": "LINEAR_DODGE", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LinearDodgeBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-093-4573f32903.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-093-4573f32903.json new file mode 100644 index 0000000..8547322 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-093-4573f32903.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-093-4573f32903", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with color dodge blend mode 1" + }, + "request": { + "rootId": "captured:118" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:118" + ], + "nodes": { + "captured:118": { + "id": "captured:118", + "type": "FRAME", + "fields": { + "blendMode": "COLOR_DODGE", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ColorDodgeBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-094-e0d0f3bfe1.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-094-e0d0f3bfe1.json new file mode 100644 index 0000000..8a73387 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-094-e0d0f3bfe1.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-094-e0d0f3bfe1", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with soft light blend mode 1" + }, + "request": { + "rootId": "captured:119" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:119" + ], + "nodes": { + "captured:119": { + "id": "captured:119", + "type": "FRAME", + "fields": { + "blendMode": "SOFT_LIGHT", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SoftLightBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-095-af3315e549.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-095-af3315e549.json new file mode 100644 index 0000000..b583173 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-095-af3315e549.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-095-af3315e549", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with hard light blend mode 1" + }, + "request": { + "rootId": "captured:120" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:120" + ], + "nodes": { + "captured:120": { + "id": "captured:120", + "type": "FRAME", + "fields": { + "blendMode": "HARD_LIGHT", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "HardLightBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-096-f8978e56ee.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-096-f8978e56ee.json new file mode 100644 index 0000000..51e2826 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-096-f8978e56ee.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-096-f8978e56ee", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with difference blend mode 1" + }, + "request": { + "rootId": "captured:121" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:121" + ], + "nodes": { + "captured:121": { + "id": "captured:121", + "type": "FRAME", + "fields": { + "blendMode": "DIFFERENCE", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "DifferenceBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-097-da58ebc1a5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-097-da58ebc1a5.json new file mode 100644 index 0000000..a5022e0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-097-da58ebc1a5.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-097-da58ebc1a5", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with exclusion blend mode 1" + }, + "request": { + "rootId": "captured:122" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:122" + ], + "nodes": { + "captured:122": { + "id": "captured:122", + "type": "FRAME", + "fields": { + "blendMode": "EXCLUSION", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ExclusionBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-098-7c2267436f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-098-7c2267436f.json new file mode 100644 index 0000000..e0e0903 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-098-7c2267436f.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-098-7c2267436f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with hue blend mode 1" + }, + "request": { + "rootId": "captured:123" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:123" + ], + "nodes": { + "captured:123": { + "id": "captured:123", + "type": "FRAME", + "fields": { + "blendMode": "HUE", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "HueBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-099-a2f954e973.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-099-a2f954e973.json new file mode 100644 index 0000000..7523d89 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-099-a2f954e973.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-099-a2f954e973", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with saturation blend mode 1" + }, + "request": { + "rootId": "captured:124" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:124" + ], + "nodes": { + "captured:124": { + "id": "captured:124", + "type": "FRAME", + "fields": { + "blendMode": "SATURATION", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SaturationBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-100-a546e9e784.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-100-a546e9e784.json new file mode 100644 index 0000000..4050423 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-100-a546e9e784.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-100-a546e9e784", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with color blend mode 1" + }, + "request": { + "rootId": "captured:125" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:125" + ], + "nodes": { + "captured:125": { + "id": "captured:125", + "type": "FRAME", + "fields": { + "blendMode": "COLOR", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ColorBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-101-394e6d9bf6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-101-394e6d9bf6.json new file mode 100644 index 0000000..85e74c1 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-101-394e6d9bf6.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-101-394e6d9bf6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with luminosity blend mode 1" + }, + "request": { + "rootId": "captured:126" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:126" + ], + "nodes": { + "captured:126": { + "id": "captured:126", + "type": "FRAME", + "fields": { + "blendMode": "LUMINOSITY", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LuminosityBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-102-cbff7d3da9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-102-cbff7d3da9.json new file mode 100644 index 0000000..0a8b018 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-102-cbff7d3da9.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-102-cbff7d3da9", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with pass through blend mode 1" + }, + "request": { + "rootId": "captured:127" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:127" + ], + "nodes": { + "captured:127": { + "id": "captured:127", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PassThroughBlendFrame", + "opacity": 1, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-103-246809daea.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-103-246809daea.json new file mode 100644 index 0000000..81a3bf5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-103-246809daea.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-103-246809daea", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with opacity and blend mode 1" + }, + "request": { + "rootId": "captured:128" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:128" + ], + "nodes": { + "captured:128": { + "id": "captured:128", + "type": "FRAME", + "fields": { + "blendMode": "MULTIPLY", + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "OpacityBlendFrame", + "opacity": 0.75, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-104-d68998542b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-104-d68998542b.json new file mode 100644 index 0000000..1598fa7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-104-d68998542b.json @@ -0,0 +1,72 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-104-d68998542b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with solid fill and blend mode 1" + }, + "request": { + "rootId": "captured:129" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:129" + ], + "nodes": { + "captured:129": { + "id": "captured:129", + "type": "FRAME", + "fields": { + "fills": [ + { + "blendMode": "MULTIPLY", + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SolidBlendFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-105-0137b6735e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-105-0137b6735e.json new file mode 100644 index 0000000..0d1dada --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-105-0137b6735e.json @@ -0,0 +1,166 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-105-0137b6735e", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with gradient fill 1" + }, + "request": { + "rootId": "captured:130" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:130" + ], + "nodes": { + "captured:130": { + "id": "captured:130", + "type": "TEXT", + "fields": { + "effects": [], + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 50, + "name": "GradientText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Gradient", + "end": 8, + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-106-6d687083cc.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-106-6d687083cc.json new file mode 100644 index 0000000..ca29d72 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-106-6d687083cc.json @@ -0,0 +1,100 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-106-6d687083cc", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with HEIGHT auto resize and fixed sizing 1" + }, + "request": { + "rootId": "captured:131" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:131" + ], + "nodes": { + "captured:131": { + "id": "captured:131", + "type": "TEXT", + "fields": { + "effects": [], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TextHeightFixed", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Height", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-107-f624c65fa8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-107-f624c65fa8.json new file mode 100644 index 0000000..5f4ea03 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-107-f624c65fa8.json @@ -0,0 +1,100 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-107-f624c65fa8", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with NONE auto resize and fixed sizing 1" + }, + "request": { + "rootId": "captured:132" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:132" + ], + "nodes": { + "captured:132": { + "id": "captured:132", + "type": "TEXT", + "fields": { + "effects": [], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TextNoneFixed", + "strokes": [], + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "None", + "end": 4, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-108-c6c4dabf49.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-108-c6c4dabf49.json new file mode 100644 index 0000000..50a623a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-108-c6c4dabf49.json @@ -0,0 +1,100 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-108-c6c4dabf49", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with TRUNCATE auto resize and fixed sizing 1" + }, + "request": { + "rootId": "captured:133" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:133" + ], + "nodes": { + "captured:133": { + "id": "captured:133", + "type": "TEXT", + "fields": { + "effects": [], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TextTruncateFixed", + "strokes": [], + "textAutoResize": "TRUNCATE", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Truncate", + "end": 8, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-109-e2824ad5be.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-109-e2824ad5be.json new file mode 100644 index 0000000..9fbe342 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-109-e2824ad5be.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-109-e2824ad5be", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders text node with textStyleId and typography 1" + }, + "request": { + "rootId": "captured:134" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:134" + ], + "nodes": { + "captured:134": { + "id": "captured:134", + "type": "TEXT", + "fields": { + "effects": [], + "name": "TypographyText", + "strokes": [], + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Heading", + "end": 7, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "text-style-1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": { + "raw": { + "styles": [ + { + "id": "text-style-1", + "name": "Typography/Heading", + "styleType": "TEXT" + } + ] + } + }, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-110-f2505cce4b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-110-f2505cce4b.json new file mode 100644 index 0000000..5abfb40 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-110-f2505cce4b.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-110-f2505cce4b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with linear gradient fill 1" + }, + "request": { + "rootId": "captured:135" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:135" + ], + "nodes": { + "captured:135": { + "id": "captured:135", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "LinearGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-111-72c9d38832.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-111-72c9d38832.json new file mode 100644 index 0000000..71a5f95 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-111-72c9d38832.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-111-72c9d38832", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with radial gradient fill 1" + }, + "request": { + "rootId": "captured:136" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:136" + ], + "nodes": { + "captured:136": { + "id": "captured:136", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 100, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "RadialGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-112-b5443c63a4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-112-b5443c63a4.json new file mode 100644 index 0000000..584cc1d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-112-b5443c63a4.json @@ -0,0 +1,107 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-112-b5443c63a4", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with angular gradient fill 1" + }, + "request": { + "rootId": "captured:137" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:137" + ], + "nodes": { + "captured:137": { + "id": "captured:137", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 0, + "g": 1, + "r": 0 + }, + "position": 0.5 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_ANGULAR", + "visible": true + } + ], + "height": 100, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "AngularGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-113-702dadab11.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-113-702dadab11.json new file mode 100644 index 0000000..bda1bbb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-113-702dadab11.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-113-702dadab11", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with diamond gradient fill 1" + }, + "request": { + "rootId": "captured:138" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:138" + ], + "nodes": { + "captured:138": { + "id": "captured:138", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_DIAMOND", + "visible": true + } + ], + "height": 100, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "DiamondGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-114-855686da78.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-114-855686da78.json new file mode 100644 index 0000000..f3d869d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-114-855686da78.json @@ -0,0 +1,68 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-114-855686da78", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with image fill TILE scaleMode 1" + }, + "request": { + "rootId": "captured:139" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:139" + ], + "nodes": { + "captured:139": { + "id": "captured:139", + "type": "FRAME", + "fields": { + "fills": [ + { + "imageHash": "hash123", + "opacity": 1, + "scaleMode": "TILE", + "type": "IMAGE", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "TileImageFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-115-45d3f116b5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-115-45d3f116b5.json new file mode 100644 index 0000000..b5284a1 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-115-45d3f116b5.json @@ -0,0 +1,85 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-115-45d3f116b5", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with pattern fill 1" + }, + "request": { + "rootId": "captured:140" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:140" + ], + "nodes": { + "captured:140": { + "id": "captured:140", + "type": "FRAME", + "fields": { + "fills": [ + { + "horizontalAlignment": "CENTER", + "opacity": 1, + "sourceNodeId": "pattern-node-id", + "spacing": { + "x": 0.1, + "y": 0.2 + }, + "type": "PATTERN", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PatternFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "pattern-node-id": { + "id": "pattern-node-id", + "type": "VECTOR", + "fields": { + "name": "PatternIcon", + "isAsset": true, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-116-23097e86ce.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-116-23097e86ce.json new file mode 100644 index 0000000..2ab1acb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-116-23097e86ce.json @@ -0,0 +1,85 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-116-23097e86ce", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with pattern fill START alignment 1" + }, + "request": { + "rootId": "captured:141" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:141" + ], + "nodes": { + "captured:141": { + "id": "captured:141", + "type": "FRAME", + "fields": { + "fills": [ + { + "horizontalAlignment": "START", + "opacity": 1, + "sourceNodeId": "pattern-node-id", + "spacing": { + "x": 0, + "y": 0 + }, + "type": "PATTERN", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PatternStartFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "pattern-node-id": { + "id": "pattern-node-id", + "type": "VECTOR", + "fields": { + "name": "PatternIcon", + "isAsset": true, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-117-fb967a9342.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-117-fb967a9342.json new file mode 100644 index 0000000..29dec87 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-117-fb967a9342.json @@ -0,0 +1,86 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-117-fb967a9342", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with pattern fill vertical alignment 1" + }, + "request": { + "rootId": "captured:142" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:142" + ], + "nodes": { + "captured:142": { + "id": "captured:142", + "type": "FRAME", + "fields": { + "fills": [ + { + "horizontalAlignment": "CENTER", + "opacity": 1, + "sourceNodeId": "pattern-node-id", + "spacing": { + "x": 0.1, + "y": 0.2 + }, + "type": "PATTERN", + "verticalAlignment": "END", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "PatternVerticalFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "pattern-node-id": { + "id": "pattern-node-id", + "type": "VECTOR", + "fields": { + "name": "PatternIcon", + "isAsset": true, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-118-b5cba733fa.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-118-b5cba733fa.json new file mode 100644 index 0000000..06c8267 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-118-b5cba733fa.json @@ -0,0 +1,81 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-118-b5cba733fa", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with multiple fills including non-last solid 1" + }, + "request": { + "rootId": "captured:143" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:143" + ], + "nodes": { + "captured:143": { + "id": "captured:143", + "type": "FRAME", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 1, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "MultipleFillsFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-119-882c2abd91.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-119-882c2abd91.json new file mode 100644 index 0000000..2a3eef6 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-119-882c2abd91.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-119-882c2abd91", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with invisible gradient fill 1" + }, + "request": { + "rootId": "captured:144" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:144" + ], + "nodes": { + "captured:144": { + "id": "captured:144", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": false + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "InvisibleGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-120-7634e1ee10.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-120-7634e1ee10.json new file mode 100644 index 0000000..b76c7fe --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-120-7634e1ee10.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-120-7634e1ee10", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with zero opacity gradient fill 1" + }, + "request": { + "rootId": "captured:145" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:145" + ], + "nodes": { + "captured:145": { + "id": "captured:145", + "type": "FRAME", + "fields": { + "fills": [ + { + "gradientStops": [ + { + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 1 + }, + "position": 0 + }, + { + "color": { + "a": 1, + "b": 1, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 0, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "ZeroOpacityGradientFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-121-0536a2e75b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-121-0536a2e75b.json new file mode 100644 index 0000000..fe59da7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-121-0536a2e75b.json @@ -0,0 +1,71 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-121-0536a2e75b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders frame with solid fill opacity 0 1" + }, + "request": { + "rootId": "captured:146" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:146" + ], + "nodes": { + "captured:146": { + "id": "captured:146", + "type": "FRAME", + "fields": { + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 0, + "type": "SOLID", + "visible": true + } + ], + "height": 50, + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "name": "SolidOpacityZeroFrame", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-122-7ddad74cc1.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-122-7ddad74cc1.json new file mode 100644 index 0000000..0f78752 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-122-7ddad74cc1.json @@ -0,0 +1,115 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-122-7ddad74cc1", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with variants 1" + }, + "request": { + "rootId": "captured:149" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:149" + ], + "nodes": { + "captured:149": { + "id": "captured:149", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:147", + "captured:148" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:147": { + "id": "captured:147", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "state": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:148": { + "id": "captured:148", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-123-179129a02c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-123-179129a02c.json new file mode 100644 index 0000000..97fa66a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-123-179129a02c.json @@ -0,0 +1,116 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-123-179129a02c", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with variants: component: Default 1" + }, + "request": { + "rootId": "captured:149", + "operationInput": { "targetComponent": "Default" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:149" + ], + "nodes": { + "captured:149": { + "id": "captured:149", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:147", + "captured:148" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:147": { + "id": "captured:147", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "state": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:148": { + "id": "captured:148", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-124-bdedf14335.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-124-bdedf14335.json new file mode 100644 index 0000000..78f794b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-124-bdedf14335.json @@ -0,0 +1,108 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-124-bdedf14335", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with effect property 1" + }, + "request": { + "rootId": "captured:152" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:152" + ], + "nodes": { + "captured:152": { + "id": "captured:152", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "effect": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:150", + "captured:151" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:150": { + "id": "captured:150", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "effect": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:151": { + "id": "captured:151", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [], + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-125-4a4a93c4c9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-125-4a4a93c4c9.json new file mode 100644 index 0000000..e579a10 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-125-4a4a93c4c9.json @@ -0,0 +1,109 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-125-4a4a93c4c9", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with effect property: component: Default 1" + }, + "request": { + "rootId": "captured:152", + "operationInput": { "targetComponent": "Default" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:152" + ], + "nodes": { + "captured:152": { + "id": "captured:152", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "effect": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:150", + "captured:151" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:150": { + "id": "captured:150", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "effect": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:151": { + "id": "captured:151", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [], + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-126-14073e1999.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-126-14073e1999.json new file mode 100644 index 0000000..5eeb598 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-126-14073e1999.json @@ -0,0 +1,148 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-126-14073e1999", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with transition 1" + }, + "request": { + "rootId": "captured:155" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:155" + ], + "nodes": { + "captured:155": { + "id": "captured:155", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:153", + "captured:154" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:153": { + "id": "captured:153", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:154": { + "id": "captured:154", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-127-1d5ead088d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-127-1d5ead088d.json new file mode 100644 index 0000000..2d0ff64 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-127-1d5ead088d.json @@ -0,0 +1,149 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-127-1d5ead088d", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with transition: component: Default 1" + }, + "request": { + "rootId": "captured:155", + "operationInput": { "targetComponent": "Default" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:155" + ], + "nodes": { + "captured:155": { + "id": "captured:155", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:153", + "captured:154" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:153": { + "id": "captured:153", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:154": { + "id": "captured:154", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-128-2222304a14.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-128-2222304a14.json new file mode 100644 index 0000000..276bc97 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-128-2222304a14.json @@ -0,0 +1,149 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-128-2222304a14", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with different props and transition 1" + }, + "request": { + "rootId": "captured:158" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:158" + ], + "nodes": { + "captured:158": { + "id": "captured:158", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Card", + "visible": true, + "childrenIds": [ + "captured:156", + "captured:157" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:156": { + "id": "captured:156", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:157": { + "id": "captured:157", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "opacity": 0.8, + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-129-7c97156f7f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-129-7c97156f7f.json new file mode 100644 index 0000000..0f2fa80 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-129-7c97156f7f.json @@ -0,0 +1,150 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-129-7c97156f7f", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with different props and transition: component: Default 1" + }, + "request": { + "rootId": "captured:158", + "operationInput": { "targetComponent": "Default" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:158" + ], + "nodes": { + "captured:158": { + "id": "captured:158", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Card", + "visible": true, + "childrenIds": [ + "captured:156", + "captured:157" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:156": { + "id": "captured:156", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:157": { + "id": "captured:157", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "opacity": 0.8, + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-130-bbd4e9a97a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-130-bbd4e9a97a.json new file mode 100644 index 0000000..ce187aa --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-130-bbd4e9a97a.json @@ -0,0 +1,138 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-130-bbd4e9a97a", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component with parent component set 1" + }, + "request": { + "rootId": "captured:159" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:159" + ], + "nodes": { + "captured:159": { + "id": "captured:159", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:162": { + "id": "captured:162", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:160", + "captured:161" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:160": { + "id": "captured:160", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "state": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:161": { + "id": "captured:161", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-131-c6ef80ad0c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-131-c6ef80ad0c.json new file mode 100644 index 0000000..74815bc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-131-c6ef80ad0c.json @@ -0,0 +1,139 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-131-c6ef80ad0c", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component with parent component set: component: Hover 1" + }, + "request": { + "rootId": "captured:159", + "operationInput": { "targetComponent": "Hover" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:159" + ], + "nodes": { + "captured:159": { + "id": "captured:159", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:162": { + "id": "captured:162", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + } + }, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:160", + "captured:161" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:160": { + "id": "captured:160", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": { + "state": "default" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:161": { + "id": "captured:161", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "variantProperties": { + "state": "hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-132-9a7b0243b6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-132-9a7b0243b6.json new file mode 100644 index 0000000..a6fd8f3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-132-9a7b0243b6.json @@ -0,0 +1,101 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-132-9a7b0243b6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with press trigger 1" + }, + "request": { + "rootId": "captured:165" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:165" + ], + "nodes": { + "captured:165": { + "id": "captured:165", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:163", + "captured:164" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:163": { + "id": "captured:163", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:164": { + "id": "captured:164", + "type": "COMPONENT", + "fields": { + "name": "Active", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-133-f425fa006c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-133-f425fa006c.json new file mode 100644 index 0000000..b6b2c37 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-133-f425fa006c.json @@ -0,0 +1,102 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-133-f425fa006c", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with press trigger: component: Default 1" + }, + "request": { + "rootId": "captured:165", + "operationInput": { "targetComponent": "Default" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:165" + ], + "nodes": { + "captured:165": { + "id": "captured:165", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:163", + "captured:164" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:163": { + "id": "captured:163", + "type": "COMPONENT", + "fields": { + "name": "Default", + "reactions": [], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:164": { + "id": "captured:164", + "type": "COMPONENT", + "fields": { + "name": "Active", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "variantProperties": {}, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-134-f80fffb8b4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-134-f80fffb8b4.json new file mode 100644 index 0000000..08ff749 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-134-f80fffb8b4.json @@ -0,0 +1,55 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-134-f80fffb8b4", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders simple component without variants 2" + }, + "request": { + "rootId": "captured:166" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:166" + ], + "nodes": { + "captured:166": { + "id": "captured:166", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-135-e00e826755.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-135-e00e826755.json new file mode 100644 index 0000000..9d1f964 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-135-e00e826755.json @@ -0,0 +1,56 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-135-e00e826755", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders simple component without variants: component: Icon 1" + }, + "request": { + "rootId": "captured:166", + "operationInput": { "targetComponent": "Icon" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:166" + ], + "nodes": { + "captured:166": { + "id": "captured:166", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-136-b68bd43ea7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-136-b68bd43ea7.json new file mode 100644 index 0000000..46f34dc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-136-b68bd43ea7.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-136-b68bd43ea7", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component with parent component set name 1" + }, + "request": { + "rootId": "captured:167" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:167" + ], + "nodes": { + "captured:167": { + "id": "captured:167", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:168": { + "id": "captured:168", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "type": "COMPONENT", + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-137-83b2706e92.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-137-83b2706e92.json new file mode 100644 index 0000000..4e279c0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-137-83b2706e92.json @@ -0,0 +1,74 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-137-83b2706e92", + "operation": "component-registration", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component with parent component set name: component: Hover 1" + }, + "request": { + "rootId": "captured:167", + "operationInput": { "targetComponent": "Hover" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:167" + ], + "nodes": { + "captured:167": { + "id": "captured:167", + "type": "COMPONENT", + "fields": { + "name": "Hover", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:168": { + "id": "captured:168", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": {}, + "defaultVariant": { + "name": "Default", + "type": "COMPONENT", + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-138-9cccfcb552.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-138-9cccfcb552.json new file mode 100644 index 0000000..4b73242 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-138-9cccfcb552.json @@ -0,0 +1,183 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-138-9cccfcb552", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with INSTANCE_SWAP slot: INSTANCE_SWAP slot: IconButton 1" + }, + "request": { + "rootId": "captured:171", + "operationInput": { "targetComponent": "IconButton" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:171" + ], + "nodes": { + "captured:171": { + "id": "captured:171", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "leftIcon#60:1": { + "defaultValue": "1:1", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "size": { + "type": "VARIANT", + "variantOptions": [ + "sm", + "md", + "lg" + ] + } + }, + "defaultVariant": { + "name": "size=md", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "size": "md" + }, + "visible": true + }, + "name": "IconButton", + "visible": true, + "childrenIds": [ + "captured:170" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:170": { + "id": "captured:170", + "type": "COMPONENT", + "fields": { + "name": "size=md", + "reactions": [], + "variantProperties": { + "size": "md" + }, + "visible": true, + "childrenIds": [ + "captured:172", + "captured:173" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:172": { + "id": "captured:172", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "leftIcon#60:1" + }, + "name": "IconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:175" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:173": { + "id": "captured:173", + "type": "TEXT", + "fields": { + "characters": "Click", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Click", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:175": { + "id": "captured:175", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-139-63f7b1f175.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-139-63f7b1f175.json new file mode 100644 index 0000000..45bc4d3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-139-63f7b1f175.json @@ -0,0 +1,183 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-139-63f7b1f175", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with INSTANCE_SWAP slot: INSTANCE_SWAP slot: Icon 1" + }, + "request": { + "rootId": "captured:171", + "operationInput": { "targetComponent": "Icon" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:171" + ], + "nodes": { + "captured:171": { + "id": "captured:171", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "leftIcon#60:1": { + "defaultValue": "1:1", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "size": { + "type": "VARIANT", + "variantOptions": [ + "sm", + "md", + "lg" + ] + } + }, + "defaultVariant": { + "name": "size=md", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "size": "md" + }, + "visible": true + }, + "name": "IconButton", + "visible": true, + "childrenIds": [ + "captured:170" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:170": { + "id": "captured:170", + "type": "COMPONENT", + "fields": { + "name": "size=md", + "reactions": [], + "variantProperties": { + "size": "md" + }, + "visible": true, + "childrenIds": [ + "captured:172", + "captured:173" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:172": { + "id": "captured:172", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "leftIcon#60:1" + }, + "name": "IconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:174" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:173": { + "id": "captured:173", + "type": "TEXT", + "fields": { + "characters": "Click", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Click", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:174": { + "id": "captured:174", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-140-e577df9ad5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-140-e577df9ad5.json new file mode 100644 index 0000000..9784c5a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-140-e577df9ad5.json @@ -0,0 +1,200 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-140-e577df9ad5", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with BOOLEAN conditional: BOOLEAN conditional: AlertCard 1" + }, + "request": { + "rootId": "captured:178", + "operationInput": { "targetComponent": "AlertCard" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:178" + ], + "nodes": { + "captured:178": { + "id": "captured:178", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "State": { + "type": "VARIANT", + "variantOptions": [ + "Default", + "Hover" + ] + }, + "showBadge#70:1": { + "defaultValue": true, + "type": "BOOLEAN" + } + }, + "defaultVariant": { + "name": "State=Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "State": "Default" + }, + "visible": true + }, + "name": "AlertCard", + "visible": true, + "childrenIds": [ + "captured:176", + "captured:177" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:176": { + "id": "captured:176", + "type": "COMPONENT", + "fields": { + "name": "State=Default", + "reactions": [], + "variantProperties": { + "State": "Default" + }, + "visible": true, + "childrenIds": [ + "captured:179", + "captured:180" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:177": { + "id": "captured:177", + "type": "COMPONENT", + "fields": { + "fills": [ + { + "color": { + "b": 0.9, + "g": 0.9, + "r": 0.9 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "name": "State=Hover", + "reactions": [], + "variantProperties": { + "State": "Hover" + }, + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:179": { + "id": "captured:179", + "type": "FRAME", + "fields": { + "componentPropertyReferences": { + "visible": "showBadge#70:1" + }, + "effects": [], + "name": "Badge", + "reactions": [], + "strokes": [], + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:180": { + "id": "captured:180", + "type": "TEXT", + "fields": { + "characters": "Hello", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Hello", + "end": 5, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-141-48307df49b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-141-48307df49b.json new file mode 100644 index 0000000..0475bac --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-141-48307df49b.json @@ -0,0 +1,163 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-141-48307df49b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with nested BOOLEAN conditionals (grandchildren): nested BOOLEAN conditional: CurriculumCard 1" + }, + "request": { + "rootId": "captured:182", + "operationInput": { "targetComponent": "CurriculumCard" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:182" + ], + "nodes": { + "captured:182": { + "id": "captured:182", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "_1st#80:1": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "_2nd#80:2": { + "defaultValue": true, + "type": "BOOLEAN" + } + }, + "defaultVariant": { + "name": "State=Default", + "reactions": [], + "type": "COMPONENT", + "visible": true + }, + "name": "CurriculumCard", + "visible": true, + "childrenIds": [ + "captured:181" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:181": { + "id": "captured:181", + "type": "COMPONENT", + "fields": { + "name": "State=Default", + "reactions": [], + "visible": true, + "childrenIds": [ + "captured:183" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:183": { + "id": "captured:183", + "type": "FRAME", + "fields": { + "effects": [], + "name": "ContentWrapper", + "reactions": [], + "strokes": [], + "visible": true, + "childrenIds": [ + "captured:184", + "captured:185" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:184": { + "id": "captured:184", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "visible": "_1st#80:1" + }, + "name": "CurriculumSubTitle1", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:188" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:185": { + "id": "captured:185", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "visible": "_2nd#80:2" + }, + "name": "CurriculumSubTitle2", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:189" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:188": { + "id": "captured:188", + "type": "COMPONENT", + "fields": { + "name": "CurriculumSubTitle", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:189": { + "id": "captured:189", + "type": "COMPONENT", + "fields": { + "name": "CurriculumSubTitle", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-142-ac82229282.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-142-ac82229282.json new file mode 100644 index 0000000..8d219c8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-142-ac82229282.json @@ -0,0 +1,163 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-142-ac82229282", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with nested BOOLEAN conditionals (grandchildren): nested BOOLEAN conditional: CurriculumSubTitle 1" + }, + "request": { + "rootId": "captured:182", + "operationInput": { "targetComponent": "CurriculumSubTitle" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:182" + ], + "nodes": { + "captured:182": { + "id": "captured:182", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "_1st#80:1": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "_2nd#80:2": { + "defaultValue": true, + "type": "BOOLEAN" + } + }, + "defaultVariant": { + "name": "State=Default", + "reactions": [], + "type": "COMPONENT", + "visible": true + }, + "name": "CurriculumCard", + "visible": true, + "childrenIds": [ + "captured:181" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:181": { + "id": "captured:181", + "type": "COMPONENT", + "fields": { + "name": "State=Default", + "reactions": [], + "visible": true, + "childrenIds": [ + "captured:183" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:183": { + "id": "captured:183", + "type": "FRAME", + "fields": { + "effects": [], + "name": "ContentWrapper", + "reactions": [], + "strokes": [], + "visible": true, + "childrenIds": [ + "captured:184", + "captured:185" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:184": { + "id": "captured:184", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "visible": "_1st#80:1" + }, + "name": "CurriculumSubTitle1", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:186" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:185": { + "id": "captured:185", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "visible": "_2nd#80:2" + }, + "name": "CurriculumSubTitle2", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:187" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:186": { + "id": "captured:186", + "type": "COMPONENT", + "fields": { + "name": "CurriculumSubTitle", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:187": { + "id": "captured:187", + "type": "COMPONENT", + "fields": { + "name": "CurriculumSubTitle", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-143-52b441f9f4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-143-52b441f9f4.json new file mode 100644 index 0000000..ef431f1 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-143-52b441f9f4.json @@ -0,0 +1,227 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-143-52b441f9f4", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with INSTANCE_SWAP + BOOLEAN combined: INSTANCE_SWAP+BOOLEAN: Button 1" + }, + "request": { + "rootId": "captured:191", + "operationInput": { "targetComponent": "Button" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:191" + ], + "nodes": { + "captured:191": { + "id": "captured:191", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "leftIcon#60:1": { + "defaultValue": "1:1", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "rightIcon#60:2": { + "defaultValue": "1:2", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "showLeftIcon#70:1": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "showRightIcon#70:2": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "size": { + "type": "VARIANT", + "variantOptions": [ + "sm", + "md", + "lg" + ] + } + }, + "defaultVariant": { + "name": "size=md", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "size": "md" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:190" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:190": { + "id": "captured:190", + "type": "COMPONENT", + "fields": { + "name": "size=md", + "reactions": [], + "variantProperties": { + "size": "md" + }, + "visible": true, + "childrenIds": [ + "captured:192", + "captured:193", + "captured:194" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:192": { + "id": "captured:192", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "leftIcon#60:1", + "visible": "showLeftIcon#70:1" + }, + "name": "LeftIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:199" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:193": { + "id": "captured:193", + "type": "TEXT", + "fields": { + "characters": "Submit", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Submit", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:194": { + "id": "captured:194", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "rightIcon#60:2", + "visible": "showRightIcon#70:2" + }, + "name": "RightIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:200" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:199": { + "id": "captured:199", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:200": { + "id": "captured:200", + "type": "COMPONENT", + "fields": { + "name": "ArrowIcon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-144-042a6de403.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-144-042a6de403.json new file mode 100644 index 0000000..7dbb661 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-144-042a6de403.json @@ -0,0 +1,227 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-144-042a6de403", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with INSTANCE_SWAP + BOOLEAN combined: INSTANCE_SWAP+BOOLEAN: Icon 1" + }, + "request": { + "rootId": "captured:191", + "operationInput": { "targetComponent": "Icon" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:191" + ], + "nodes": { + "captured:191": { + "id": "captured:191", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "leftIcon#60:1": { + "defaultValue": "1:1", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "rightIcon#60:2": { + "defaultValue": "1:2", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "showLeftIcon#70:1": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "showRightIcon#70:2": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "size": { + "type": "VARIANT", + "variantOptions": [ + "sm", + "md", + "lg" + ] + } + }, + "defaultVariant": { + "name": "size=md", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "size": "md" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:190" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:190": { + "id": "captured:190", + "type": "COMPONENT", + "fields": { + "name": "size=md", + "reactions": [], + "variantProperties": { + "size": "md" + }, + "visible": true, + "childrenIds": [ + "captured:192", + "captured:193", + "captured:194" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:192": { + "id": "captured:192", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "leftIcon#60:1", + "visible": "showLeftIcon#70:1" + }, + "name": "LeftIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:195" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:193": { + "id": "captured:193", + "type": "TEXT", + "fields": { + "characters": "Submit", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Submit", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:194": { + "id": "captured:194", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "rightIcon#60:2", + "visible": "showRightIcon#70:2" + }, + "name": "RightIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:196" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:195": { + "id": "captured:195", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:196": { + "id": "captured:196", + "type": "COMPONENT", + "fields": { + "name": "ArrowIcon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-145-f7001b5648.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-145-f7001b5648.json new file mode 100644 index 0000000..c84a85a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-145-f7001b5648.json @@ -0,0 +1,227 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-145-f7001b5648", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods INSTANCE_SWAP / BOOLEAN snapshot renders component with INSTANCE_SWAP + BOOLEAN combined: INSTANCE_SWAP+BOOLEAN: ArrowIcon 1" + }, + "request": { + "rootId": "captured:191", + "operationInput": { "targetComponent": "ArrowIcon" } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:191" + ], + "nodes": { + "captured:191": { + "id": "captured:191", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "leftIcon#60:1": { + "defaultValue": "1:1", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "rightIcon#60:2": { + "defaultValue": "1:2", + "preferredValues": [], + "type": "INSTANCE_SWAP" + }, + "showLeftIcon#70:1": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "showRightIcon#70:2": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "size": { + "type": "VARIANT", + "variantOptions": [ + "sm", + "md", + "lg" + ] + } + }, + "defaultVariant": { + "name": "size=md", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "size": "md" + }, + "visible": true + }, + "name": "Button", + "visible": true, + "childrenIds": [ + "captured:190" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:190": { + "id": "captured:190", + "type": "COMPONENT", + "fields": { + "name": "size=md", + "reactions": [], + "variantProperties": { + "size": "md" + }, + "visible": true, + "childrenIds": [ + "captured:192", + "captured:193", + "captured:194" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:192": { + "id": "captured:192", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "leftIcon#60:1", + "visible": "showLeftIcon#70:1" + }, + "name": "LeftIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:197" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:193": { + "id": "captured:193", + "type": "TEXT", + "fields": { + "characters": "Submit", + "effects": [], + "name": "Label", + "reactions": [], + "strokes": [], + "textAutoResize": "WIDTH_AND_HEIGHT", + "visible": true, + "childrenIds": [], + "parentId": null, + "styledTextSegments": [ + { + "characters": "Submit", + "end": 6, + "fills": [ + { + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "type": "SOLID" + } + ], + "fontName": { + "family": "Arial", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 1.5 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "style1" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:194": { + "id": "captured:194", + "type": "INSTANCE", + "fields": { + "componentPropertyReferences": { + "mainComponent": "rightIcon#60:2", + "visible": "showRightIcon#70:2" + }, + "name": "RightIconInstance", + "visible": true, + "childrenIds": [], + "parentId": null, + "mainComponentId": "captured:198" + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:197": { + "id": "captured:197", + "type": "COMPONENT", + "fields": { + "name": "Icon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "captured:198": { + "id": "captured:198", + "type": "COMPONENT", + "fields": { + "name": "ArrowIcon", + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-146-56be99e864.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-146-56be99e864.json new file mode 100644 index 0000000..9f6f12c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-146-56be99e864.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-146-56be99e864", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 1" + }, + "request": { + "rootId": "7:7" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "7:7" + ], + "nodes": { + "7:7": { + "id": "7:7", + "type": "SECTION", + "fields": { + "name": "BorderRadius", + "childrenIds": [ + "7:3" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "7:3": { + "id": "7:3", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "cornerRadius": 20, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 150, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "7:7" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-147-bb7df0f2f1.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-147-bb7df0f2f1.json new file mode 100644 index 0000000..9754344 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-147-bb7df0f2f1.json @@ -0,0 +1,104 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-147-bb7df0f2f1", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 2" + }, + "request": { + "rootId": "7:7" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "7:7" + ], + "nodes": { + "7:7": { + "id": "7:7", + "type": "SECTION", + "fields": { + "name": "BorderRadius", + "childrenIds": [ + "6:2" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "6:2": { + "id": "6:2", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 40, + "bottomRightRadius": 50, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 150, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 30, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "7:7" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-148-62e9137131.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-148-62e9137131.json new file mode 100644 index 0000000..e1aa665 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-148-62e9137131.json @@ -0,0 +1,104 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-148-62e9137131", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 3" + }, + "request": { + "rootId": "7:7" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "7:7" + ], + "nodes": { + "7:7": { + "id": "7:7", + "type": "SECTION", + "fields": { + "name": "BorderRadius", + "childrenIds": [ + "7:5" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "7:5": { + "id": "7:5", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 30, + "bottomRightRadius": 200, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 150, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 3", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 200, + "topRightRadius": 30, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "7:7" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-149-2491f4c5a5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-149-2491f4c5a5.json new file mode 100644 index 0000000..3af3e0f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-149-2491f4c5a5.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-149-2491f4c5a5", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 4" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2019" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2019": { + "id": "496:2019", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 223, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 57, + "paddingRight": 118, + "paddingTop": 51, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884473", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 325, + "childrenIds": [ + "8:2" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "8:2": { + "id": "8:2", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.807692289352417, + "g": 0.789053201675415, + "r": 0.776627242565155 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Linear", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2019" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-150-ecb5bb4337.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-150-ecb5bb4337.json new file mode 100644 index 0000000..7196a52 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-150-ecb5bb4337.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-150-ecb5bb4337", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 5" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2050" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2050": { + "id": "496:2050", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 215, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 147, + "paddingRight": 110, + "paddingTop": 49, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884474", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 407, + "childrenIds": [ + "14:23" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "14:23": { + "id": "14:23", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.807692289352417, + "g": 0.789053201675415, + "r": 0.776627242565155 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -0.9584663510322571, + -0.8847382068634033, + 1.2973703145980835 + ], + [ + 0.8847382068634033, + -0.9584663510322571, + 0.5272794365882874 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Linear", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2050" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-151-7993d252dc.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-151-7993d252dc.json new file mode 100644 index 0000000..90bd19f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-151-7993d252dc.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-151-7993d252dc", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 6" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2051" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2051": { + "id": "496:2051", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 254, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 34, + "paddingLeft": 102, + "paddingRight": 110, + "paddingTop": 70, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884475", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 362, + "childrenIds": [ + "8:6" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "8:6": { + "id": "8:6", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9192305207252502, + "r": 0.8653846383094788 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Radial", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2051" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-152-a05026a9db.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-152-a05026a9db.json new file mode 100644 index 0000000..ba4ea71 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-152-a05026a9db.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-152-a05026a9db", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 7" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2054" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2054": { + "id": "496:2054", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 259, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 26, + "paddingLeft": 152, + "paddingRight": 100, + "paddingTop": 83, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884476", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 402, + "childrenIds": [ + "16:28" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "16:28": { + "id": "16:28", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9192305207252502, + "r": 0.8653846383094788 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -1.3973798751831055, + 0.4803493320941925, + 0.7598253488540649 + ], + [ + -0.4803493320941925, + -1.3973798751831055, + 1.1986899375915527 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Radial", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2054" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-153-fb5205fc52.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-153-fb5205fc52.json new file mode 100644 index 0000000..28385ed --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-153-fb5205fc52.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-153-fb5205fc52", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 8" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2055" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2055": { + "id": "496:2055", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 225, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 38, + "paddingLeft": 71, + "paddingRight": 69, + "paddingTop": 37, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884477", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 290, + "childrenIds": [ + "10:2" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "10:2": { + "id": "10:2", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9192305207252502, + "r": 0.8653846383094788 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_ANGULAR", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Conic", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2055" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-154-1409376769.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-154-1409376769.json new file mode 100644 index 0000000..6e6e873 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-154-1409376769.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-154-1409376769", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 9" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2056" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2056": { + "id": "496:2056", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 199, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 56, + "paddingRight": 105, + "paddingTop": 27, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884478", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 311, + "childrenIds": [ + "10:6" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "10:6": { + "id": "10:6", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9192305207252502, + "r": 0.8653846383094788 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.2016550432044563E-15, + -0.5, + 1 + ], + [ + 0.5, + 1.2681746581347047E-15, + 0.25 + ] + ], + "opacity": 1, + "type": "GRADIENT_ANGULAR", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Conic 2", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2056" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-155-557eb84a98.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-155-557eb84a98.json new file mode 100644 index 0000000..aa20f3c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-155-557eb84a98.json @@ -0,0 +1,234 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-155-557eb84a98", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 10" + }, + "request": { + "rootId": "10:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "10:14" + ], + "nodes": { + "10:14": { + "id": "10:14", + "type": "SECTION", + "fields": { + "name": "Gradient", + "childrenIds": [ + "496:2057" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "496:2057": { + "id": "496:2057", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 239, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 31, + "paddingLeft": 108, + "paddingRight": 74, + "paddingTop": 58, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884479", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 332, + "childrenIds": [ + "10:10" + ], + "parentId": "10:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "10:10": { + "id": "10:10", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.8548610210418701, + "r": 0.5416664481163025 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9192305207252502, + "r": 0.8653846383094788 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 7.288291606517838E-15, + -1, + 1 + ], + [ + 1, + 1.6481708965692841E-15, + -5.329070518200751E-15 + ] + ], + "opacity": 1, + "type": "GRADIENT_DIAMOND", + "visible": true + } + ], + "height": 150, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Diamond", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "496:2057" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-156-bec8be9b99.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-156-bec8be9b99.json new file mode 100644 index 0000000..09841fa --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-156-bec8be9b99.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-156-bec8be9b99", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 11" + }, + "request": { + "rootId": "35:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:2" + ], + "nodes": { + "35:2": { + "id": "35:2", + "type": "SECTION", + "fields": { + "name": "Text", + "childrenIds": [ + "35:7" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "35:7": { + "id": "35:7", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "35:2", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-157-4cb71f2863.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-157-4cb71f2863.json new file mode 100644 index 0000000..deb8621 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-157-4cb71f2863.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-157-4cb71f2863", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 12" + }, + "request": { + "rootId": "35:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:2" + ], + "nodes": { + "35:2": { + "id": "35:2", + "type": "SECTION", + "fields": { + "name": "Text", + "childrenIds": [ + "35:12" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "35:12": { + "id": "35:12", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "35:2", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-158-8e4821dcbc.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-158-8e4821dcbc.json new file mode 100644 index 0000000..7b4f39c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-158-8e4821dcbc.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-158-8e4821dcbc", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 13" + }, + "request": { + "rootId": "35:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:2" + ], + "nodes": { + "35:2": { + "id": "35:2", + "type": "SECTION", + "fields": { + "name": "Text", + "childrenIds": [ + "35:18" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "35:18": { + "id": "35:18", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 200, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "width": 200, + "childrenIds": [], + "parentId": "35:2", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-159-30962241b1.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-159-30962241b1.json new file mode 100644 index 0000000..d642f9f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-159-30962241b1.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-159-30962241b1", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 14" + }, + "request": { + "rootId": "35:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:2" + ], + "nodes": { + "35:2": { + "id": "35:2", + "type": "SECTION", + "fields": { + "name": "Text", + "childrenIds": [ + "41:7" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "41:7": { + "id": "41:7", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "RIGHT", + "textAlignVertical": "CENTER", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "35:2", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-160-db5d3ac9d8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-160-db5d3ac9d8.json new file mode 100644 index 0000000..248eeca --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-160-db5d3ac9d8.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-160-db5d3ac9d8", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 15" + }, + "request": { + "rootId": "35:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:2" + ], + "nodes": { + "35:2": { + "id": "35:2", + "type": "SECTION", + "fields": { + "name": "Text", + "childrenIds": [ + "41:12" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "41:12": { + "id": "41:12", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 200, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "NONE", + "textTruncation": "DISABLED", + "visible": true, + "width": 200, + "childrenIds": [], + "parentId": "35:2", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-161-5b230821f2.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-161-5b230821f2.json new file mode 100644 index 0000000..ad04492 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-161-5b230821f2.json @@ -0,0 +1,299 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-161-5b230821f2", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 16" + }, + "request": { + "rootId": "70:49" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "70:49" + ], + "nodes": { + "70:49": { + "id": "70:49", + "type": "SECTION", + "fields": { + "name": "Auto-layout & box", + "childrenIds": [ + "70:51" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "70:51": { + "id": "70:51", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0, + "r": 0.3333333432674408 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "auto-layout-horizon", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 129, + "childrenIds": [ + "70:50", + "70:61" + ], + "parentId": "70:49" + }, + "extra": {}, + "fieldErrors": {} + }, + "70:50": { + "id": "70:50", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "70:51", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "70:61": { + "id": "70:61", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 13", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 12, + "childrenIds": [], + "parentId": "70:51" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-162-51e1254b4c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-162-51e1254b4c.json new file mode 100644 index 0000000..bca19aa --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-162-51e1254b4c.json @@ -0,0 +1,299 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-162-51e1254b4c", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 17" + }, + "request": { + "rootId": "70:49" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "70:49" + ], + "nodes": { + "70:49": { + "id": "70:49", + "type": "SECTION", + "fields": { + "name": "Auto-layout & box", + "childrenIds": [ + "70:57" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "70:57": { + "id": "70:57", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0, + "r": 0.3333333432674408 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 68, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "auto-layout-vertical", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 107, + "childrenIds": [ + "70:58", + "70:62" + ], + "parentId": "70:49" + }, + "extra": {}, + "fieldErrors": {} + }, + "70:58": { + "id": "70:58", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "70:57", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "70:62": { + "id": "70:62", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 13", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 12, + "childrenIds": [], + "parentId": "70:57" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-163-2a9f9a056a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-163-2a9f9a056a.json new file mode 100644 index 0000000..51ee6bb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-163-2a9f9a056a.json @@ -0,0 +1,299 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-163-2a9f9a056a", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 18" + }, + "request": { + "rootId": "70:49" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "70:49" + ], + "nodes": { + "70:49": { + "id": "70:49", + "type": "SECTION", + "fields": { + "name": "Auto-layout & box", + "childrenIds": [ + "71:124" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "71:124": { + "id": "71:124", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0, + "r": 0.3333333432674408 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 53, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "auto-layout-vertical", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 107, + "childrenIds": [ + "71:125", + "71:126" + ], + "parentId": "70:49" + }, + "extra": {}, + "fieldErrors": {} + }, + "71:125": { + "id": "71:125", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "71:124", + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "71:126": { + "id": "71:126", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 1, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 13", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "71:124" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-164-33e4c6591c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-164-33e4c6591c.json new file mode 100644 index 0000000..60657de --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-164-33e4c6591c.json @@ -0,0 +1,358 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-164-33e4c6591c", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 19" + }, + "request": { + "rootId": "71:123" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "71:123" + ], + "nodes": { + "71:123": { + "id": "71:123", + "type": "SECTION", + "fields": { + "name": "Component 1", + "childrenIds": [ + "1:5" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "1:5": { + "id": "1:5", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313" + } + }, + "color": { + "b": 0.9686274528503418, + "g": 0.20392157137393951, + "r": 0.35686275362968445 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 53, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 60, + "paddingRight": 60, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 60, + "paddingRight": 60, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 287, + "childrenIds": [ + "1:6", + "2:11" + ], + "parentId": "71:123" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:6": { + "id": "1:6", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "더 자세히 알아보기", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "fontWeight": 700, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "더 자세히 알아보기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 127, + "childrenIds": [], + "parentId": "1:5", + "styledTextSegments": [ + { + "characters": "더 자세히 알아보기", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 18, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "2:11": { + "id": "2:11", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [], + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "arrow", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "1:7" + ], + "parentId": "1:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:7": { + "id": "1:7", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Stroke", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "visible": true, + "width": 20, + "childrenIds": [], + "parentId": "2:11" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313", + "name": "primary" + }, + { + "id": "VariableID:15f2b5c6b66588df2b6463e5084ce0334621dcd6/3584:11", + "name": "background" + }, + { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-165-501ee1df12.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-165-501ee1df12.json new file mode 100644 index 0000000..7941b9d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-165-501ee1df12.json @@ -0,0 +1,653 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-165-501ee1df12", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 20" + }, + "request": { + "rootId": "71:123" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "71:123" + ], + "nodes": { + "71:123": { + "id": "71:123", + "type": "SECTION", + "fields": { + "name": "Component 1", + "childrenIds": [ + "1:13" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "1:13": { + "id": "1:13", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 30, + "bottomRightRadius": 30, + "clipsContent": false, + "cornerRadius": 30, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:15f2b5c6b66588df2b6463e5084ce0334621dcd6/3584:11" + } + }, + "color": { + "b": 0.9855769276618958, + "g": 0.9732044339179993, + "r": 0.9697822332382202 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 318, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Card", + "opacity": 1, + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 30, + "topRightRadius": 30, + "visible": true, + "width": 420, + "childrenIds": [ + "1:14", + "1:17", + "1:18" + ], + "parentId": "71:123" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:14": { + "id": "1:14", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 64, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "puzzle-piece", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 64, + "childrenIds": [ + "1:15", + "1:16" + ], + "parentId": "1:13" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:17": { + "id": "1:17", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자사 솔루션과의 연계를 통해\n서비스 확장성과 성장 가능성을 높입니다.", + "effects": [], + "fontName": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 20, + "fontWeight": 800, + "height": 56, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "자사 솔루션과의 연계를 통해 서비스 확장성과 성장 가능성을 높입니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자사 솔루션과의 연계", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313" + } + }, + "color": { + "b": 0.9686274528503418, + "g": 0.20392157137393951, + "r": 0.35686275362968445 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 20, + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:42aa610b2125d507c89cd19b737e1c07835c76cd,4987:43" + }, + { + "characters": "를 통해\n서비스 확장성과 성장 가능성을 높입니다.", + "end": 38, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41" + } + }, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 20, + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 11, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:42aa610b2125d507c89cd19b737e1c07835c76cd,4987:43" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 340, + "childrenIds": [], + "parentId": "1:13" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:18": { + "id": "1:18", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "웹앱팩토리와 Presskit 등 자체 운영 중인 \n솔루션과의 연계를 통해 프로젝트의 서비스 범위 확장, \n운영 효율화, 성장 기회까지 제안드립니다.", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41" + } + }, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "height": 78, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "웹앱팩토리와 Presskit 등 자체 운영 중인 솔루션과의 연계를 통해 프로젝트의 서비스 범위 확장, 운영 효율화, 성장 기회까지 제안드립니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "웹앱팩토리와 Presskit 등 자체 운영 중인 \n솔루션과의 연계를 통해 프로젝트의 서비스 범위 확장, \n운영 효율화, 성장 기회까지 제안드립니다.", + "end": 82, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41" + } + }, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f416ab13d47ad55393b3cf3c7e2a45e33c6eec40,4987:46" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 340, + "childrenIds": [], + "parentId": "1:13" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:15": { + "id": "1:15", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.686274528503418, + "g": 0.6901960968971252, + "r": 0.6901960968971252 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 53.89710235595703, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "visible": true, + "width": 57.96072006225586, + "childrenIds": [], + "parentId": "1:14" + }, + "extra": {}, + "fieldErrors": {} + }, + "1:16": { + "id": "1:16", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.0941176488995552, + "g": 0.8196078538894653, + "r": 0.7176470756530762 + }, + "position": 0.5080000162124634 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.09803921729326248, + "g": 0.8156862854957581, + "r": 0.6980392336845398 + }, + "position": 0.5720000267028809 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.11372549086809158, + "g": 0.8039215803146362, + "r": 0.6470588445663452 + }, + "position": 0.6430000066757202 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.13333334028720856, + "g": 0.7882353067398071, + "r": 0.5607843399047852 + }, + "position": 0.7170000076293945 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.16470588743686676, + "g": 0.7607843279838562, + "r": 0.43921568989753723 + }, + "position": 0.7929999828338623 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.20392157137393951, + "g": 0.729411780834198, + "r": 0.2823529541492462 + }, + "position": 0.8709999918937683 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.250980406999588, + "g": 0.6901960968971252, + "r": 0.0941176488995552 + }, + "position": 0.9490000009536743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.27450981736183167, + "g": 0.6705882549285889, + "r": 0.007843137718737125 + }, + "position": 0.9810000061988831 + } + ], + "gradientTransform": [ + [ + 0.4799879491329193, + 0, + 0.26639416813850403 + ], + [ + 0, + 0.48956596851348877, + 0.6352904438972473 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 58.36850357055664, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "visible": true, + "width": 57.2265625, + "childrenIds": [], + "parentId": "1:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:15f2b5c6b66588df2b6463e5084ce0334621dcd6/3584:11", + "name": "background" + }, + { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313", + "name": "primary" + }, + { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-166-cda14f0b08.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-166-cda14f0b08.json new file mode 100644 index 0000000..0744ed2 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-166-cda14f0b08.json @@ -0,0 +1,687 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-166-cda14f0b08", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 21" + }, + "request": { + "rootId": "71:123" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "71:123" + ], + "nodes": { + "71:123": { + "id": "71:123", + "type": "SECTION", + "fields": { + "name": "Component 1", + "childrenIds": [ + "43:20" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "43:20": { + "id": "43:20", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [], + "height": 280, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "CardContainer", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1200, + "childrenIds": [ + "43:2", + "43:21", + "43:23" + ], + "parentId": "71:123" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:2": { + "id": "43:2", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 30, + "bottomRightRadius": 30, + "clipsContent": false, + "cornerRadius": 30, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 280, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Card", + "opacity": 1, + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 30, + "topRightRadius": 30, + "visible": true, + "width": 386.6666564941406, + "childrenIds": [ + "43:7" + ], + "parentId": "43:20" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:21": { + "id": "43:21", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 30, + "bottomRightRadius": 30, + "clipsContent": false, + "cornerRadius": 30, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 280, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Card", + "opacity": 1, + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 30, + "topRightRadius": 30, + "visible": true, + "width": 386.66668701171875, + "childrenIds": [ + "43:22" + ], + "parentId": "43:20" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:23": { + "id": "43:23", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 30, + "bottomRightRadius": 30, + "clipsContent": false, + "cornerRadius": 30, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 280, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Card", + "opacity": 1, + "paddingBottom": 40, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 30, + "topRightRadius": 30, + "visible": true, + "width": 386.66668701171875, + "childrenIds": [ + "43:24" + ], + "parentId": "43:20" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:7": { + "id": "43:7", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "CARD 1", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "height": 58, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "CARD 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "CARD 1", + "end": 6, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "43:2" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:22": { + "id": "43:22", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "CARD 2", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "height": 58, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "CARD 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "CARD 2", + "end": 6, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 116, + "childrenIds": [], + "parentId": "43:21" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:24": { + "id": "43:24", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "CARD 3", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "height": 58, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "CARD 3", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "CARD 3", + "end": 6, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.10196078568696976, + "g": 0.10196078568696976, + "r": 0.10196078568696976 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 36, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -6 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 117, + "childrenIds": [], + "parentId": "43:23" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:15f2b5c6b66588df2b6463e5084ce0334621dcd6/3584:11", + "name": "background" + }, + { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313", + "name": "primary" + }, + { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-167-114a88771f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-167-114a88771f.json new file mode 100644 index 0000000..212a3fe --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-167-114a88771f.json @@ -0,0 +1,445 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-167-114a88771f", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 22" + }, + "request": { + "rootId": "71:123" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "71:123" + ], + "nodes": { + "71:123": { + "id": "71:123", + "type": "SECTION", + "fields": { + "name": "Component 1", + "childrenIds": [ + "40:51" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:51": { + "id": "40:51", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MAX", + "counterAxisSpacing": 0, + "effects": [ + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 4, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.05999999865889549, + "type": "SOLID", + "visible": true + } + ], + "height": 74, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "font variable", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:52", + "40:53" + ], + "parentId": "71:123" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:52": { + "id": "40:52", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Semi Bold Italic" + }, + "fontSize": 24, + "fontWeight": 600, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Semi Bold Italic" + }, + "fontSize": 24, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "RIGHT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 134, + "childrenIds": [], + "parentId": "40:51" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:53": { + "id": "40:53", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontSize": 12, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, ", + "end": 28, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + }, + { + "characters": "consectetur", + "end": 39, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Black" + }, + "fontSize": 12, + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 28, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + }, + { + "characters": " adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 39, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "RIGHT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 320, + "childrenIds": [], + "parentId": "40:51" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:15f2b5c6b66588df2b6463e5084ce0334621dcd6/3584:11", + "name": "background" + }, + { + "id": "VariableID:0b96ad7095bac52695a42f130ba1e6823e711569/3589:313", + "name": "primary" + }, + { + "id": "VariableID:a8911963a3ddc27e66ce960494a4683d9c4b1cab/1851:41", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-168-4211bd8279.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-168-4211bd8279.json new file mode 100644 index 0000000..fc830c2 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-168-4211bd8279.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-168-4211bd8279", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 23" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:11" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:11": { + "id": "105:11", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "inside", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-169-796132e0cf.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-169-796132e0cf.json new file mode 100644 index 0000000..ac90905 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-169-796132e0cf.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-169-796132e0cf", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 24" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:64" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:64": { + "id": "105:64", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "center", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-170-eab2ed7d4c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-170-eab2ed7d4c.json new file mode 100644 index 0000000..2014464 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-170-eab2ed7d4c.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-170-eab2ed7d4c", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 25" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:12" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:12": { + "id": "105:12", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "outside", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-171-7e33e2b6a9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-171-7e33e2b6a9.json new file mode 100644 index 0000000..39f4ed3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-171-7e33e2b6a9.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-171-7e33e2b6a9", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 26" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:75" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:75": { + "id": "105:75", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "inside", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-172-99028c85ce.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-172-99028c85ce.json new file mode 100644 index 0000000..181b93d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-172-99028c85ce.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-172-99028c85ce", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 27" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:77" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:77": { + "id": "105:77", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "center", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-173-64dbd7a102.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-173-64dbd7a102.json new file mode 100644 index 0000000..663e532 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-173-64dbd7a102.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-173-64dbd7a102", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 28" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "105:90" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:90": { + "id": "105:90", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "outside", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-174-68dd47d3f8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-174-68dd47d3f8.json new file mode 100644 index 0000000..cbb0f57 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-174-68dd47d3f8.json @@ -0,0 +1,151 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-174-68dd47d3f8", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 29" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "113:67" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "113:67": { + "id": "113:67", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.25, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "inside + BoxShadow", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-175-ec3fd45731.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-175-ec3fd45731.json new file mode 100644 index 0000000..8428189 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-175-ec3fd45731.json @@ -0,0 +1,151 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-175-ec3fd45731", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 30" + }, + "request": { + "rootId": "105:14" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:14" + ], + "nodes": { + "105:14": { + "id": "105:14", + "type": "SECTION", + "fields": { + "name": "outline, border", + "childrenIds": [ + "113:71" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "113:71": { + "id": "113:71", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.25, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "outside + BoxShadow", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.11057692021131516, + "g": 0.11057692021131516, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:14" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-176-653a030fdc.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-176-653a030fdc.json new file mode 100644 index 0000000..b6f85a8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-176-653a030fdc.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-176-653a030fdc", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 31" + }, + "request": { + "rootId": "109:83" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "109:83" + ], + "nodes": { + "109:83": { + "id": "109:83", + "type": "SECTION", + "fields": { + "name": "Circle", + "childrenIds": [ + "109:69" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "109:69": { + "id": "109:69", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 3620", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "109:83" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-177-c147e7dd39.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-177-c147e7dd39.json new file mode 100644 index 0000000..5d68a6a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-177-c147e7dd39.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-177-c147e7dd39", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 32" + }, + "request": { + "rootId": "109:83" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "109:83" + ], + "nodes": { + "109:83": { + "id": "109:83", + "type": "SECTION", + "fields": { + "name": "Circle", + "childrenIds": [ + "109:72" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "109:72": { + "id": "109:72", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 3622", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "visible": true, + "width": 50, + "childrenIds": [], + "parentId": "109:83" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-178-d69d60d688.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-178-d69d60d688.json new file mode 100644 index 0000000..61981d3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-178-d69d60d688.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-178-d69d60d688", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 33" + }, + "request": { + "rootId": "109:83" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "109:83" + ], + "nodes": { + "109:83": { + "id": "109:83", + "type": "SECTION", + "fields": { + "name": "Circle", + "childrenIds": [ + "109:71" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "109:71": { + "id": "109:71", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 5.6181230545043945, + "innerRadius": 0.4148121774196625, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "ellipse3621", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokes": [], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "109:83" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-179-80620f6587.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-179-80620f6587.json new file mode 100644 index 0000000..6891519 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-179-80620f6587.json @@ -0,0 +1,131 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-179-80620f6587", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 34" + }, + "request": { + "rootId": "35:3" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:3" + ], + "nodes": { + "35:3": { + "id": "35:3", + "type": "SECTION", + "fields": { + "name": "Border", + "childrenIds": [ + "80:2" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "80:2": { + "id": "80:2", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "border", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "35:3" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-180-ad1a31fd03.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-180-ad1a31fd03.json new file mode 100644 index 0000000..c052594 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-180-ad1a31fd03.json @@ -0,0 +1,134 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-180-ad1a31fd03", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 35" + }, + "request": { + "rootId": "35:3" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:3" + ], + "nodes": { + "35:3": { + "id": "35:3", + "type": "SECTION", + "fields": { + "name": "Border", + "childrenIds": [ + "80:6" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "80:6": { + "id": "80:6", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [ + 2, + 2 + ], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "border", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "35:3" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-181-5afa626d49.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-181-5afa626d49.json new file mode 100644 index 0000000..eb74af9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-181-5afa626d49.json @@ -0,0 +1,295 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-181-5afa626d49", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 36" + }, + "request": { + "rootId": "35:3" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:3" + ], + "nodes": { + "35:3": { + "id": "35:3", + "type": "SECTION", + "fields": { + "name": "Border", + "childrenIds": [ + "80:40" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "80:40": { + "id": "80:40", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 140, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "border", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 260, + "childrenIds": [ + "80:38", + "80:39" + ], + "parentId": "35:3" + }, + "extra": {}, + "fieldErrors": {} + }, + "80:38": { + "id": "80:38", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 140, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "border", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 80, + "childrenIds": [], + "parentId": "80:40" + }, + "extra": {}, + "fieldErrors": {} + }, + "80:39": { + "id": "80:39", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 140, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "border", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 180, + "childrenIds": [], + "parentId": "80:40" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-182-c45d19171b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-182-c45d19171b.json new file mode 100644 index 0000000..fca34ad --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-182-c45d19171b.json @@ -0,0 +1,135 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-182-c45d19171b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 37" + }, + "request": { + "rootId": "89:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "89:2" + ], + "nodes": { + "89:2": { + "id": "89:2", + "type": "SECTION", + "fields": { + "name": "Opacity", + "childrenIds": [ + "89:3" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "89:3": { + "id": "89:3", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "opacity", + "opacity": 0.20000000298023224, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "89:2" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-183-7ede517e99.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-183-7ede517e99.json new file mode 100644 index 0000000..23e486c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-183-7ede517e99.json @@ -0,0 +1,135 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-183-7ede517e99", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 38" + }, + "request": { + "rootId": "89:2" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "89:2" + ], + "nodes": { + "89:2": { + "id": "89:2", + "type": "SECTION", + "fields": { + "name": "Opacity", + "childrenIds": [ + "105:91" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:91": { + "id": "105:91", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.20000000298023224, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "opacity", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.20000000298023224, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "89:2" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-184-0c09788bb7.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-184-0c09788bb7.json new file mode 100644 index 0000000..2421b79 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-184-0c09788bb7.json @@ -0,0 +1,250 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-184-0c09788bb7", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 39" + }, + "request": { + "rootId": "60:26" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "60:26" + ], + "nodes": { + "60:26": { + "id": "60:26", + "type": "SECTION", + "fields": { + "name": "clamp", + "childrenIds": [ + "70:72" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "70:72": { + "id": "70:72", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "clamp - fill", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 600, + "childrenIds": [ + "70:73" + ], + "parentId": "60:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "70:73": { + "id": "70:73", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxLines": 1, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "end": 69, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "ENDING", + "visible": true, + "width": 580, + "childrenIds": [], + "parentId": "70:72" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-185-e79c2ae189.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-185-e79c2ae189.json new file mode 100644 index 0000000..777cbea --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-185-e79c2ae189.json @@ -0,0 +1,250 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-185-e79c2ae189", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 40" + }, + "request": { + "rootId": "60:26" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "60:26" + ], + "nodes": { + "60:26": { + "id": "60:26", + "type": "SECTION", + "fields": { + "name": "clamp", + "childrenIds": [ + "70:79" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "70:79": { + "id": "70:79", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "clamp - hug", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 600, + "childrenIds": [ + "70:80" + ], + "parentId": "60:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "70:80": { + "id": "70:80", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxLines": 1, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "end": 69, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "ENDING", + "visible": true, + "width": 500, + "childrenIds": [], + "parentId": "70:79" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-186-0988e78887.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-186-0988e78887.json new file mode 100644 index 0000000..7da9539 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-186-0988e78887.json @@ -0,0 +1,250 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-186-0988e78887", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 41" + }, + "request": { + "rootId": "60:26" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "60:26" + ], + "nodes": { + "60:26": { + "id": "60:26", + "type": "SECTION", + "fields": { + "name": "clamp", + "childrenIds": [ + "70:92" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "70:92": { + "id": "70:92", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "clamp - fill", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 600, + "childrenIds": [ + "70:93" + ], + "parentId": "60:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "70:93": { + "id": "70:93", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 26, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxLines": 2, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Getting into life 'Cause I found that it's not so boring Not anymore.", + "end": 69, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "ENDING", + "visible": true, + "width": 580, + "childrenIds": [], + "parentId": "70:92" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-187-8b30b935a4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-187-8b30b935a4.json new file mode 100644 index 0000000..07cd84b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-187-8b30b935a4.json @@ -0,0 +1,142 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-187-8b30b935a4", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 42" + }, + "request": { + "rootId": "105:13" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:13" + ], + "nodes": { + "105:13": { + "id": "105:13", + "type": "SECTION", + "fields": { + "name": "effect", + "childrenIds": [ + "105:95" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:95": { + "id": "105:95", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.25, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "boxShadow", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 3, + "strokeLeftWeight": 3, + "strokeRightWeight": 3, + "strokeTopWeight": 3, + "strokeWeight": 3, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:13" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-188-ea2a1af6a1.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-188-ea2a1af6a1.json new file mode 100644 index 0000000..73bca79 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-188-ea2a1af6a1.json @@ -0,0 +1,141 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-188-ea2a1af6a1", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 43" + }, + "request": { + "rootId": "105:13" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:13" + ], + "nodes": { + "105:13": { + "id": "105:13", + "type": "SECTION", + "fields": { + "name": "effect", + "childrenIds": [ + "105:99" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:99": { + "id": "105:99", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.25, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 4, + "spread": 0, + "type": "INNER_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "inset", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 3, + "strokeLeftWeight": 3, + "strokeRightWeight": 3, + "strokeTopWeight": 3, + "strokeWeight": 3, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:13" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-189-75736e48e0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-189-75736e48e0.json new file mode 100644 index 0000000..0886d76 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-189-75736e48e0.json @@ -0,0 +1,130 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-189-75736e48e0", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 44" + }, + "request": { + "rootId": "105:13" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:13" + ], + "nodes": { + "105:13": { + "id": "105:13", + "type": "SECTION", + "fields": { + "name": "effect", + "childrenIds": [ + "105:103" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:103": { + "id": "105:103", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 4, + "type": "LAYER_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "blur", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 3, + "strokeLeftWeight": 3, + "strokeRightWeight": 3, + "strokeTopWeight": 3, + "strokeWeight": 3, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:13" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-190-d5a9045231.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-190-d5a9045231.json new file mode 100644 index 0000000..8500b29 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-190-d5a9045231.json @@ -0,0 +1,130 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-190-d5a9045231", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 45" + }, + "request": { + "rootId": "105:13" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "105:13" + ], + "nodes": { + "105:13": { + "id": "105:13", + "type": "SECTION", + "fields": { + "name": "effect", + "childrenIds": [ + "105:107" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "105:107": { + "id": "105:107", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "cornerRadius": 20, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 10, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.20000000298023224, + "type": "SOLID", + "visible": true + } + ], + "height": 240, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "backgroundBlur", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 3, + "strokeLeftWeight": 3, + "strokeRightWeight": 3, + "strokeTopWeight": 3, + "strokeWeight": 3, + "strokes": [], + "topLeftRadius": 20, + "topRightRadius": 20, + "visible": true, + "width": 240, + "childrenIds": [], + "parentId": "105:13" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-191-2021d398f8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-191-2021d398f8.json new file mode 100644 index 0000000..585470e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-191-2021d398f8.json @@ -0,0 +1,1270 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-191-2021d398f8", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 46" + }, + "request": { + "rootId": "109:84" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "109:84" + ], + "nodes": { + "109:84": { + "id": "109:84", + "type": "SECTION", + "fields": { + "name": "Dimmed와 absolute", + "childrenIds": [ + "107:26" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "107:26": { + "id": "107:26", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": { + "color": { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227" + } + }, + "color": { + "a": 1, + "b": 1, + "g": 0.9607843160629272, + "r": 0.9803921580314636 + }, + "position": 0 + }, + { + "boundVariables": { + "color": { + "id": "VariableID:417859516cc38076cb4af248fcd12020cd9ae4b2/27:25" + } + }, + "color": { + "a": 1, + "b": 1, + "g": 0.9058823585510254, + "r": 0.8784313797950745 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 311, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 50, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 50, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Container", + "opacity": 1, + "paddingBottom": 50, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 50, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 360, + "childrenIds": [ + "107:27", + "107:28", + "107:29", + "107:32", + "107:33" + ], + "parentId": "109:84" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:27": { + "id": "107:27", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MAX", + "vertical": "MIN" + }, + "cornerRadius": 0, + "dashPattern": [], + "effects": [ + { + "blurType": "PROGRESSIVE", + "boundVariables": {}, + "endOffset": { + "x": 0.14488635957241058, + "y": 0.8797577619552612 + }, + "radius": 12, + "startOffset": { + "x": 0.5, + "y": 0.3321799337863922 + }, + "startRadius": 0, + "type": "LAYER_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "e7958a16573afffb69800c3c66b7a5abdbd7bce3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 332, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "puzzle", + "opacity": 1, + "reactions": [], + "rotation": -8.82894874863189, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 300, + "x": 168.009765625, + "y": -76, + "childrenIds": [], + "parentId": "107:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:28": { + "id": "107:28", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.9333333373069763, + "r": 0.929411768913269 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 1, + "g": 0.9333333373069763, + "r": 0.929411768913269 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -1.8426270287363877E-08, + -1, + 1 + ], + [ + 1, + -3.776177948111581E-08, + -1.5905754935374716E-08 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 311, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "dimmed", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 360, + "x": 0, + "y": 0, + "childrenIds": [], + "parentId": "107:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:29": { + "id": "107:29", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 51, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 105", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 222, + "childrenIds": [ + "107:30", + "107:31" + ], + "parentId": "107:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:32": { + "id": "107:32", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자꾸 미뤄졌던 나에 대한 고민, \n퍼즐핏에서 구체적인 답을 찾아보세요.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.2549019753932953, + "r": 0.21568627655506134 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "height": 44, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "자꾸 미뤄졌던 나에 대한 고민, 퍼즐핏에서 구체적인 답을 찾아보세요.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자꾸 미뤄졌던 나에 대한 고민, \n퍼즐핏에서 구체적인 답을 찾아보세요.", + "end": 39, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.2549019753932953, + "r": 0.21568627655506134 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:7d3ad4ba2c8903ffba997502193ac0827747a798,18:212" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "CENTER", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 320, + "childrenIds": [], + "parentId": "107:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:33": { + "id": "107:33", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 76, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 106", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 140, + "childrenIds": [ + "107:34", + "107:35" + ], + "parentId": "107:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:30": { + "id": "107:30", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "지금 시작할 수 있어요", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47" + } + }, + "color": { + "b": 0.9019607901573181, + "g": 0.12156862765550613, + "r": 0.529411792755127 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 12, + "fontWeight": 600, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "지금 시작할 수 있어요", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "지금 시작할 수 있어요", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47" + } + }, + "color": { + "b": 0.9019607901573181, + "g": 0.12156862765550613, + "r": 0.529411792755127 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 12, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:5ab6109ba578c1e241c1ec0231069c37ffab9ebe,27:18" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 97, + "childrenIds": [], + "parentId": "107:29" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:31": { + "id": "107:31", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "내 삶을 더 잘 이해하는 첫 걸음", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:099a1a094b0ad8776e9d00872465534eee0f1c2a/14:64" + } + }, + "color": { + "b": 0.15294118225574493, + "g": 0.0941176488995552, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 120.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "내 삶을 더 잘 이해하는 첫 걸음", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "내 삶을 더 잘 이해하는 첫 걸음", + "end": 18, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:099a1a094b0ad8776e9d00872465534eee0f1c2a/14:64" + } + }, + "color": { + "b": 0.15294118225574493, + "g": 0.0941176488995552, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 120.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:22826d8fa5409d17932c82e7bda0b9c7306d99ca,34:65" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 222, + "childrenIds": [], + "parentId": "107:29" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:34": { + "id": "107:34", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 2 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": -2, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 6, + "showShadowBehindNode": false, + "spread": -1, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.20000000298023224, + "r": 0.5764706134796143 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8980392217636108, + "g": 0.27450981736183167, + "r": 0.30980393290519714 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 45, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "GradientButton", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 138, + "childrenIds": [ + "I107:34;18:2206" + ], + "parentId": "107:33" + }, + "extra": {}, + "fieldErrors": {} + }, + "107:35": { + "id": "107:35", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "회원가입 후, 유료로 진행됩니다", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70" + } + }, + "color": { + "b": 0.38823530077934265, + "g": 0.3333333432674408, + "r": 0.29411765933036804 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "회원가입 후, 유료로 진행됩니다", + "opacity": 0.5, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "회원가입 후, 유료로 진행됩니다", + "end": 17, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70" + } + }, + "color": { + "b": 0.38823530077934265, + "g": 0.3333333432674408, + "r": 0.29411765933036804 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:6104b34398c9cfd4de9323f16187c4cc20509420,27:15" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": "107:33" + }, + "extra": {}, + "fieldErrors": {} + }, + "I107:34;18:2206": { + "id": "I107:34;18:2206", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "검사 시작하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 15, + "fontWeight": 600, + "height": 21, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Text", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "검사 시작하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "SemiBold" + }, + "fontSize": 15, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:dc4ad9d035b632bb81cb467ad64f4bb9448ded87,18:206" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 78, + "childrenIds": [], + "parentId": "107:34" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:417859516cc38076cb4af248fcd12020cd9ae4b2/27:25", + "name": "secondaryBg" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:099a1a094b0ad8776e9d00872465534eee0f1c2a/14:64", + "name": "title" + }, + { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65", + "name": "text" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-192-dd2c3f0c1c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-192-dd2c3f0c1c.json new file mode 100644 index 0000000..9822d6f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-192-dd2c3f0c1c.json @@ -0,0 +1,204 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-192-dd2c3f0c1c", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 47" + }, + "request": { + "rootId": "189:1752" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1752" + ], + "nodes": { + "189:1752": { + "id": "189:1752", + "type": "SECTION", + "fields": { + "name": "SVG", + "childrenIds": [ + "171:1545" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1545": { + "id": "171:1545", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 20, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.962193012237549, + "paddingLeft": 3.4942855834960938, + "paddingRight": 2.894681930541992, + "paddingTop": 2.021327495574951, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 280, + "y": 280 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "171:1546" + ], + "parentId": "189:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1546": { + "id": "171:1546", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1545" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-193-bd488a5710.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-193-bd488a5710.json new file mode 100644 index 0000000..fc66933 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-193-bd488a5710.json @@ -0,0 +1,253 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-193-bd488a5710", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 48" + }, + "request": { + "rootId": "189:1752" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1752" + ], + "nodes": { + "189:1752": { + "id": "189:1752", + "type": "SECTION", + "fields": { + "name": "SVG", + "childrenIds": [ + "171:1553" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1553": { + "id": "171:1553", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 34.032958984375, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 19.611032485961914, + "childrenIds": [ + "171:1559", + "171:1554" + ], + "parentId": "189:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1559": { + "id": "171:1559", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1553" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1554": { + "id": "171:1554", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-194-17922977f6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-194-17922977f6.json new file mode 100644 index 0000000..187b49d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-194-17922977f6.json @@ -0,0 +1,299 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-194-17922977f6", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 49" + }, + "request": { + "rootId": "189:1752" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1752" + ], + "nodes": { + "189:1752": { + "id": "189:1752", + "type": "SECTION", + "fields": { + "name": "SVG", + "childrenIds": [ + "171:1561" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1561": { + "id": "171:1561", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 34.032958984375, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 19.611032485961914, + "childrenIds": [ + "171:1565", + "171:1563" + ], + "parentId": "189:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1565": { + "id": "171:1565", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "height": 15.0164794921875, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.611032485961914, + "childrenIds": [ + "171:1562" + ], + "parentId": "171:1561" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1563": { + "id": "171:1563", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1561" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1562": { + "id": "171:1562", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1565" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-195-1a6efe22a8.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-195-1a6efe22a8.json new file mode 100644 index 0000000..f31e11b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-195-1a6efe22a8.json @@ -0,0 +1,295 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-195-1a6efe22a8", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 50" + }, + "request": { + "rootId": "189:1752" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1752" + ], + "nodes": { + "189:1752": { + "id": "189:1752", + "type": "SECTION", + "fields": { + "name": "SVG", + "childrenIds": [ + "171:1566" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1566": { + "id": "171:1566", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 34.032958984375, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 2, + "paddingLeft": 3, + "paddingRight": 3, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 19.611032485961914, + "childrenIds": [ + "171:1567", + "171:1569" + ], + "parentId": "189:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1567": { + "id": "171:1567", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "height": 15.0164794921875, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.611032485961914, + "childrenIds": [ + "171:1568" + ], + "parentId": "171:1566" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1569": { + "id": "171:1569", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1566" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1568": { + "id": "171:1568", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.2079222947359085, + "g": 0.2079222947359085, + "r": 0.4054486155509949 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1567" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-196-d14f03afcd.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-196-d14f03afcd.json new file mode 100644 index 0000000..5a1ce05 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-196-d14f03afcd.json @@ -0,0 +1,319 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-196-d14f03afcd", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 51" + }, + "request": { + "rootId": "189:1752" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1752" + ], + "nodes": { + "189:1752": { + "id": "189:1752", + "type": "SECTION", + "fields": { + "name": "SVG", + "childrenIds": [ + "171:1548" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1548": { + "id": "171:1548", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 33.032958984375, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 3, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 3, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "188:1549", + "171:1549" + ], + "parentId": "189:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1549": { + "id": "188:1549", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 15.0164794921875, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884470", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 13.611032485961914, + "childrenIds": [ + "171:1551" + ], + "parentId": "171:1548" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1549": { + "id": "171:1549", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.1328587383031845, + "g": 0.1328587383031845, + "r": 0.7676283121109009 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "171:1548" + }, + "extra": {}, + "fieldErrors": {} + }, + "171:1551": { + "id": "171:1551", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "188:1549" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-197-026402bf2e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-197-026402bf2e.json new file mode 100644 index 0000000..b555bdd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-197-026402bf2e.json @@ -0,0 +1,402 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-197-026402bf2e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 52" + }, + "request": { + "rootId": "35:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:5" + ], + "nodes": { + "35:5": { + "id": "35:5", + "type": "SECTION", + "fields": { + "name": "Flex with maxW", + "childrenIds": [ + "60:2" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "60:2": { + "id": "60:2", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 758, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Container", + "opacity": 1, + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "60:5" + ], + "parentId": "35:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:5": { + "id": "60:5", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 598, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 12", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "60:4", + "60:7" + ], + "parentId": "60:2" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:4": { + "id": "60:4", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World!", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "height": 48, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World!", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World!", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "childrenIds": [], + "parentId": "60:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:7": { + "id": "60:7", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 500, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "60:5" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-198-a9ea7ba9c3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-198-a9ea7ba9c3.json new file mode 100644 index 0000000..226ff6a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-198-a9ea7ba9c3.json @@ -0,0 +1,406 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-198-a9ea7ba9c3", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 53" + }, + "request": { + "rootId": "35:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:5" + ], + "nodes": { + "35:5": { + "id": "35:5", + "type": "SECTION", + "fields": { + "name": "Flex with maxW", + "childrenIds": [ + "60:19" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "60:19": { + "id": "60:19", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 978, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "imageRatio", + "opacity": 1, + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "60:20" + ], + "parentId": "35:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:20": { + "id": "60:20", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 818, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 12", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "60:21", + "60:22" + ], + "parentId": "60:19" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:21": { + "id": "60:21", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World!", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "height": 48, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World!", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World!", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "childrenIds": [], + "parentId": "60:20" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:22": { + "id": "60:22", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 720, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 1280, + "y": 720 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "60:20" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-199-829a5c949d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-199-829a5c949d.json new file mode 100644 index 0000000..e536e50 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-199-829a5c949d.json @@ -0,0 +1,402 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-199-829a5c949d", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 54" + }, + "request": { + "rootId": "35:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:5" + ], + "nodes": { + "35:5": { + "id": "35:5", + "type": "SECTION", + "fields": { + "name": "Flex with maxW", + "childrenIds": [ + "60:27" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "60:27": { + "id": "60:27", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 760, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "maxW maxH", + "opacity": 1, + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "60:28" + ], + "parentId": "35:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:28": { + "id": "60:28", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 600, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 12", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "60:29", + "60:30" + ], + "parentId": "60:27" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:29": { + "id": "60:29", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World!", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "height": 48, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World!", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World!", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "childrenIds": [], + "parentId": "60:28" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:30": { + "id": "60:30", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 400, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": 400, + "maxWidth": 800, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 800, + "childrenIds": [], + "parentId": "60:28" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-200-3313d92719.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-200-3313d92719.json new file mode 100644 index 0000000..2d8253c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-200-3313d92719.json @@ -0,0 +1,402 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-200-3313d92719", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 55" + }, + "request": { + "rootId": "35:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:5" + ], + "nodes": { + "35:5": { + "id": "35:5", + "type": "SECTION", + "fields": { + "name": "Flex with maxW", + "childrenIds": [ + "60:31" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "60:31": { + "id": "60:31", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 658, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "maxW", + "opacity": 1, + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "60:32" + ], + "parentId": "35:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:32": { + "id": "60:32", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 498, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 12", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "60:33", + "60:34" + ], + "parentId": "60:31" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:33": { + "id": "60:33", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World!", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "height": 48, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World!", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World!", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "childrenIds": [], + "parentId": "60:32" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:34": { + "id": "60:34", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 400, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": 800, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 800, + "childrenIds": [], + "parentId": "60:32" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-201-8207a4008e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-201-8207a4008e.json new file mode 100644 index 0000000..1df8819 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-201-8207a4008e.json @@ -0,0 +1,402 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-201-8207a4008e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 56" + }, + "request": { + "rootId": "35:5" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "35:5" + ], + "nodes": { + "35:5": { + "id": "35:5", + "type": "SECTION", + "fields": { + "name": "Flex with maxW", + "childrenIds": [ + "60:35" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "60:35": { + "id": "60:35", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 760, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "maxH", + "opacity": 1, + "paddingBottom": 80, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 80, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "60:36" + ], + "parentId": "35:5" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:36": { + "id": "60:36", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 600, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 12", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "60:37", + "60:38" + ], + "parentId": "60:35" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:37": { + "id": "60:37", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World!", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "height": 48, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World!", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World!", + "end": 12, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 40, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "childrenIds": [], + "parentId": "60:36" + }, + "extra": {}, + "fieldErrors": {} + }, + "60:38": { + "id": "60:38", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 400, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FILL", + "maxHeight": 400, + "maxWidth": 1024, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1024, + "childrenIds": [], + "parentId": "60:36" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-202-2786eda075.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-202-2786eda075.json new file mode 100644 index 0000000..5f917f7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-202-2786eda075.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-202-2786eda075", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 57" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:3" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:3": { + "id": "40:3", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 2", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:2", + "40:4" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:2": { + "id": "40:2", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:3" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:4": { + "id": "40:4", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:3" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-203-8af03217a3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-203-8af03217a3.json new file mode 100644 index 0000000..ee0a2fb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-203-8af03217a3.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-203-8af03217a3", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 58" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:57" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:57": { + "id": "40:57", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 10", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 429, + "childrenIds": [ + "40:58", + "40:59" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:58": { + "id": "40:58", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:57" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:59": { + "id": "40:59", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:57" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-204-2b2967c8c4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-204-2b2967c8c4.json new file mode 100644 index 0000000..9fb9bb8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-204-2b2967c8c4.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-204-2b2967c8c4", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 59" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:9" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:9": { + "id": "40:9", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 200, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 3", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:10", + "40:11" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:10": { + "id": "40:10", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:9" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:11": { + "id": "40:11", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:9" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-205-cc3ea5202a.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-205-cc3ea5202a.json new file mode 100644 index 0000000..b62dc7d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-205-cc3ea5202a.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-205-cc3ea5202a", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 60" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:78" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:78": { + "id": "40:78", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 11", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 600, + "childrenIds": [ + "40:79", + "40:80" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:79": { + "id": "40:79", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:78" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:80": { + "id": "40:80", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 485, + "childrenIds": [], + "parentId": "40:78" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-206-b5c5dc97eb.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-206-b5c5dc97eb.json new file mode 100644 index 0000000..342d0f4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-206-b5c5dc97eb.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-206-b5c5dc97eb", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 61" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:18" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:18": { + "id": "40:18", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 4", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:19", + "40:20" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:19": { + "id": "40:19", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:18" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:20": { + "id": "40:20", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:18" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-207-b0e134acf4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-207-b0e134acf4.json new file mode 100644 index 0000000..eb58325 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-207-b0e134acf4.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-207-b0e134acf4", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 62" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:30" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:30": { + "id": "40:30", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 200, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 6", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MAX", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:31", + "40:32" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:31": { + "id": "40:31", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:30" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:32": { + "id": "40:32", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:30" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-208-1a343e45db.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-208-1a343e45db.json new file mode 100644 index 0000000..8160175 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-208-1a343e45db.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-208-1a343e45db", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 63" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:42" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:42": { + "id": "40:42", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 8", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:43", + "40:44" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:43": { + "id": "40:43", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 360, + "childrenIds": [], + "parentId": "40:42" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:44": { + "id": "40:44", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 360, + "childrenIds": [], + "parentId": "40:42" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-209-0514b0990f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-209-0514b0990f.json new file mode 100644 index 0000000..80b9048 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-209-0514b0990f.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-209-0514b0990f", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 64" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:24" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:24": { + "id": "40:24", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MAX", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 5", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "MAX", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:25", + "40:26" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:25": { + "id": "40:25", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:26": { + "id": "40:26", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:24" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-210-1b24060767.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-210-1b24060767.json new file mode 100644 index 0000000..3af2fc4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-210-1b24060767.json @@ -0,0 +1,343 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-210-1b24060767", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 65" + }, + "request": { + "rootId": "36:24" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "36:24" + ], + "nodes": { + "36:24": { + "id": "36:24", + "type": "SECTION", + "fields": { + "name": "Text with auto layout", + "childrenIds": [ + "40:36" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "40:36": { + "id": "40:36", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MAX", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 200, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 7", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [ + "40:37", + "40:38" + ], + "parentId": "36:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:37": { + "id": "40:37", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Hello World", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hello World", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Hello World", + "end": 11, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 65, + "childrenIds": [], + "parentId": "40:36" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:38": { + "id": "40:38", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "height": 15, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "end": 56, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Inter", + "style": "Regular" + }, + "fontSize": 12, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 314, + "childrenIds": [], + "parentId": "40:36" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-211-2e15c55701.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-211-2e15c55701.json new file mode 100644 index 0000000..c96d0d5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-211-2e15c55701.json @@ -0,0 +1,201 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-211-2e15c55701", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 66" + }, + "request": { + "rootId": "69:18" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "69:18" + ], + "nodes": { + "69:18": { + "id": "69:18", + "type": "SECTION", + "fields": { + "name": "object-fit", + "childrenIds": [ + "69:9" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "69:9": { + "id": "69:9", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 520, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "object-fit : cover (default)", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1300, + "childrenIds": [ + "69:8" + ], + "parentId": "69:18" + }, + "extra": {}, + "fieldErrors": {} + }, + "69:8": { + "id": "69:8", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.5905511975288391, + 0.20472441613674164 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 500, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "69:9" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-212-2a8f7b4a99.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-212-2a8f7b4a99.json new file mode 100644 index 0000000..3ca27f5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-212-2a8f7b4a99.json @@ -0,0 +1,201 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-212-2a8f7b4a99", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 67" + }, + "request": { + "rootId": "69:18" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "69:18" + ], + "nodes": { + "69:18": { + "id": "69:18", + "type": "SECTION", + "fields": { + "name": "object-fit", + "childrenIds": [ + "69:13" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "69:13": { + "id": "69:13", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 520, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "object-fit : contain", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1300, + "childrenIds": [ + "69:14" + ], + "parentId": "69:18" + }, + "extra": {}, + "fieldErrors": {} + }, + "69:14": { + "id": "69:14", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b39b8e5c5acff7a565c2d9f6d0e923160b0271f3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FIT", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "height": 500, + "isAsset": true, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "69:13" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-213-aa53408d2f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-213-aa53408d2f.json new file mode 100644 index 0000000..f6d01f4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-213-aa53408d2f.json @@ -0,0 +1,1045 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-213-aa53408d2f", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 68" + }, + "request": { + "rootId": "187:1545" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "187:1545" + ], + "nodes": { + "187:1545": { + "id": "187:1545", + "type": "SECTION", + "fields": { + "name": "Case 1 - MaskImage", + "childrenIds": [ + "109:51" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "109:51": { + "id": "109:51", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:48af241d35e3be1aa75c9b68e40b32ee5f7c2d40/2:200" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 104, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Card", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:f5613063210cb55c4f22591497c139340720b4f9/2:116" + } + }, + "color": { + "b": 0.9490196108818054, + "g": 0.9137254953384399, + "r": 0.8941176533699036 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1060, + "childrenIds": [ + "109:52", + "109:64" + ], + "parentId": "187:1545" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:52": { + "id": "109:52", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884450", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1020, + "childrenIds": [ + "109:53", + "109:54", + "109:55", + "109:56", + "109:57" + ], + "parentId": "109:51" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:64": { + "id": "109:64", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "height": 24, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력", + "end": 44, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0daf4d1717522daf9c82204ed1d91b4ead4935b4,35:31" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 1020, + "childrenIds": [], + "parentId": "109:51" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:53": { + "id": "109:53", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "플레이 제목", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "플레이 제목", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "플레이 제목", + "end": 6, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 69, + "childrenIds": [], + "parentId": "109:52" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:54": { + "id": "109:54", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 6, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 3618", + "opacity": 0.20000000298023224, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 6, + "y": 6 + }, + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "109:52" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:55": { + "id": "109:55", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "2025.03.03 18:00", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "height": 23, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "2025.03.03 18:00", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "2025.03.03 18:00", + "end": 16, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:8de3e75e8aa9e74fc05518a1daedc751ba038ca3,2:423" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 112, + "childrenIds": [], + "parentId": "109:52" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:56": { + "id": "109:56", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 6, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 3619", + "opacity": 0.20000000298023224, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 6, + "y": 6 + }, + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "109:52" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:57": { + "id": "109:57", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 4, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 4, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884461", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 33, + "childrenIds": [ + "109:58", + "109:63" + ], + "parentId": "109:52" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:58": { + "id": "109:58", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "recommend", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 280, + "y": 280 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "109:62" + ], + "parentId": "109:57" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:63": { + "id": "109:63", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "2", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 15, + "fontWeight": 600, + "height": 23, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "2", + "end": 1, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 15, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f7a84b2aff07543a05b32108ab91010ac120d7c6,26:61" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 9, + "childrenIds": [], + "parentId": "109:57" + }, + "extra": {}, + "fieldErrors": {} + }, + "109:62": { + "id": "109:62", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146" + } + }, + "color": { + "b": 0.4941176474094391, + "g": 0.4941176474094391, + "r": 0.4941176474094391 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.0164794921875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.611032485961914, + "childrenIds": [], + "parentId": "109:58" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:f5613063210cb55c4f22591497c139340720b4f9/2:116", + "name": "border" + }, + { + "id": "VariableID:48af241d35e3be1aa75c9b68e40b32ee5f7c2d40/2:200", + "name": "innerBg" + }, + { + "id": "VariableID:041286802cda2ac64dfa81669076d76d0b63e802/2:146", + "name": "caption" + }, + { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-214-6dc49544c0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-214-6dc49544c0.json new file mode 100644 index 0000000..f29c067 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-214-6dc49544c0.json @@ -0,0 +1,432 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-214-6dc49544c0", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 69" + }, + "request": { + "rootId": "145:1927" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "145:1927" + ], + "nodes": { + "145:1927": { + "id": "145:1927", + "type": "SECTION", + "fields": { + "name": "Grid", + "childrenIds": [ + "145:1912" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "145:1912": { + "id": "145:1912", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 2, + "gridColumnGap": 10, + "gridRowAnchorIndex": -1, + "gridRowCount": 2, + "gridRowGap": 10, + "height": 210, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Grid", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 210, + "childrenIds": [ + "145:1909", + "145:1910", + "145:1928", + "145:1929" + ], + "parentId": "145:1927" + }, + "extra": {}, + "fieldErrors": {} + }, + "145:1909": { + "id": "145:1909", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridColumnCount": 0, + "gridRowAnchorIndex": 0, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884463", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "145:1912" + }, + "extra": {}, + "fieldErrors": {} + }, + "145:1910": { + "id": "145:1910", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridColumnCount": 0, + "gridRowAnchorIndex": 0, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884464", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "145:1912" + }, + "extra": {}, + "fieldErrors": {} + }, + "145:1928": { + "id": "145:1928", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridColumnCount": 0, + "gridRowAnchorIndex": 1, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884465", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "145:1912" + }, + "extra": {}, + "fieldErrors": {} + }, + "145:1929": { + "id": "145:1929", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridColumnCount": 0, + "gridRowAnchorIndex": 1, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884466", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "145:1912" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-215-39e86f8f53.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-215-39e86f8f53.json new file mode 100644 index 0000000..a64101d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-215-39e86f8f53.json @@ -0,0 +1,292 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-215-39e86f8f53", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 70" + }, + "request": { + "rootId": "145:1927" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "145:1927" + ], + "nodes": { + "145:1927": { + "id": "145:1927", + "type": "SECTION", + "fields": { + "name": "Grid", + "childrenIds": [ + "169:1545" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "169:1545": { + "id": "169:1545", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 2, + "gridColumnGap": 10, + "gridRowAnchorIndex": -1, + "gridRowCount": 4, + "gridRowGap": 10, + "height": 430, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Grid - 순서대로 정렬 X", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 210, + "childrenIds": [ + "169:1553", + "169:1566" + ], + "parentId": "145:1927" + }, + "extra": {}, + "fieldErrors": {} + }, + "169:1553": { + "id": "169:1553", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridColumnCount": 0, + "gridRowAnchorIndex": 3, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884468", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "169:1545" + }, + "extra": {}, + "fieldErrors": {} + }, + "169:1566": { + "id": "169:1566", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridColumnCount": 0, + "gridRowAnchorIndex": 2, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884469", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "169:1545" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-216-465422d47b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-216-465422d47b.json new file mode 100644 index 0000000..39331f8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-216-465422d47b.json @@ -0,0 +1,222 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-216-465422d47b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 71" + }, + "request": { + "rootId": "145:1927" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "145:1927" + ], + "nodes": { + "145:1927": { + "id": "145:1927", + "type": "SECTION", + "fields": { + "name": "Grid", + "childrenIds": [ + "169:1563" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "169:1563": { + "id": "169:1563", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 2, + "gridColumnGap": 10, + "gridRowAnchorIndex": -1, + "gridRowCount": 2, + "gridRowGap": 10, + "height": 210, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Grid - child 가 1개밖에 없을 때", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 210, + "childrenIds": [ + "169:1564" + ], + "parentId": "145:1927" + }, + "extra": {}, + "fieldErrors": {} + }, + "169:1564": { + "id": "169:1564", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridColumnCount": 0, + "gridRowAnchorIndex": 0, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884468", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "169:1563" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-217-2d887b2a8b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-217-2d887b2a8b.json new file mode 100644 index 0000000..4afaec8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-217-2d887b2a8b.json @@ -0,0 +1,222 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-217-2d887b2a8b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 72" + }, + "request": { + "rootId": "145:1927" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "145:1927" + ], + "nodes": { + "145:1927": { + "id": "145:1927", + "type": "SECTION", + "fields": { + "name": "Grid", + "childrenIds": [ + "179:1554" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "179:1554": { + "id": "179:1554", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 2, + "gridColumnGap": 10, + "gridRowAnchorIndex": -1, + "gridRowCount": 2, + "gridRowGap": 10, + "height": 210, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Grid - child 가 1개밖에 없을 때", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 210, + "childrenIds": [ + "179:1555" + ], + "parentId": "145:1927" + }, + "extra": {}, + "fieldErrors": {} + }, + "179:1555": { + "id": "179:1555", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6235294342041016, + "g": 0.49803921580314636, + "r": 0.4117647111415863 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridColumnCount": 0, + "gridRowAnchorIndex": 1, + "height": 100, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884468", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "179:1554" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-218-587666c709.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-218-587666c709.json new file mode 100644 index 0000000..19d5c5b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-218-587666c709.json @@ -0,0 +1,158 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-218-587666c709", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 73" + }, + "request": { + "rootId": "245:1608" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "245:1608" + ], + "nodes": { + "245:1608": { + "id": "245:1608", + "type": "SECTION", + "fields": { + "name": "Mix Blend Mode", + "childrenIds": [ + "245:1595" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "245:1595": { + "id": "245:1595", + "type": "RECTANGLE", + "fields": { + "blendMode": "OVERLAY", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5cee49483aa40d5cbf1764b2d584efc365723714", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 413, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 0.800000011920929, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 4096, + "y": 4096 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413, + "childrenIds": [], + "parentId": "245:1608" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-219-c6446b7b2e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-219-c6446b7b2e.json new file mode 100644 index 0000000..63fe954 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-219-c6446b7b2e.json @@ -0,0 +1,158 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-219-c6446b7b2e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 74" + }, + "request": { + "rootId": "245:1608" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "245:1608" + ], + "nodes": { + "245:1608": { + "id": "245:1608", + "type": "SECTION", + "fields": { + "name": "Mix Blend Mode", + "childrenIds": [ + "245:1600" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "245:1600": { + "id": "245:1600", + "type": "RECTANGLE", + "fields": { + "blendMode": "SCREEN", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5cee49483aa40d5cbf1764b2d584efc365723714", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 413, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 0.800000011920929, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 4096, + "y": 4096 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413, + "childrenIds": [], + "parentId": "245:1608" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:a41981510611520a1c47fa7ab84eb8fc2ae29df4/38:20", + "name": "containerBackground" + }, + { + "id": "VariableID:7b0c74af99b6b0b15148212c8340b286b4f12630/38:82", + "name": "text" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/90:29", + "name": "primary" + }, + { + "id": "VariableID:1060bad3592be247585df7163f204873508facae/90:51", + "name": "primaryBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-220-5980153f26.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-220-5980153f26.json new file mode 100644 index 0000000..15c749f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-220-5980153f26.json @@ -0,0 +1,137 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-220-5980153f26", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 75" + }, + "request": { + "rootId": "245:1608" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "245:1608" + ], + "nodes": { + "245:1608": { + "id": "245:1608", + "type": "SECTION", + "fields": { + "name": "Mix Blend Mode", + "childrenIds": [ + "245:1607" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "245:1607": { + "id": "245:1607", + "type": "RECTANGLE", + "fields": { + "blendMode": "MULTIPLY", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5cee49483aa40d5cbf1764b2d584efc365723714", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 413, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image", + "opacity": 0.800000011920929, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 4096, + "y": 4096 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413, + "childrenIds": [], + "parentId": "245:1608" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-221-d003bdb336.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-221-d003bdb336.json new file mode 100644 index 0000000..5983d2e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-221-d003bdb336.json @@ -0,0 +1,114 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-221-d003bdb336", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 76" + }, + "request": { + "rootId": "245:1608" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "245:1608" + ], + "nodes": { + "245:1608": { + "id": "245:1608", + "type": "SECTION", + "fields": { + "name": "Mix Blend Mode", + "childrenIds": [ + "245:1609" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "245:1609": { + "id": "245:1609", + "type": "RECTANGLE", + "fields": { + "blendMode": "SOFT_LIGHT", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 100, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 39796", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "245:1608" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-222-f2d780c847.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-222-f2d780c847.json new file mode 100644 index 0000000..552c84c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-222-f2d780c847.json @@ -0,0 +1,168 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-222-f2d780c847", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 77" + }, + "request": { + "rootId": "245:1608" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "245:1608" + ], + "nodes": { + "245:1608": { + "id": "245:1608", + "type": "SECTION", + "fields": { + "name": "Mix Blend Mode", + "childrenIds": [ + "245:1614" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "245:1614": { + "id": "245:1614", + "type": "TEXT", + "fields": { + "blendMode": "DARKEN", + "characters": "데브파이브", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.09615384787321091, + "g": 0.09615384787321091, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 90, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "데브파이브", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "데브파이브", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.09615384787321091, + "g": 0.09615384787321091, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 308, + "childrenIds": [], + "parentId": "245:1608" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-223-4dc8092992.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-223-4dc8092992.json new file mode 100644 index 0000000..14d2e02 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-223-4dc8092992.json @@ -0,0 +1,2512 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-223-4dc8092992", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 78" + }, + "request": { + "rootId": "189:1785" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1785" + ], + "nodes": { + "189:1785": { + "id": "189:1785", + "type": "SECTION", + "fields": { + "name": "Test Case : 드론아레나", + "childrenIds": [ + "113:9" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "113:9": { + "id": "113:9", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MAX", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c94c4b118e67ccdd520018116c235719f1c770a6/7:138" + } + }, + "color": { + "b": 1, + "g": 0.9882352948188782, + "r": 0.9843137264251709 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 391, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 30, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 30, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Section1", + "opacity": 1, + "paddingBottom": 30, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 30, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:f5613063210cb55c4f22591497c139340720b4f9/2:116" + } + }, + "color": { + "b": 0.9490196108818054, + "g": 0.9137254953384399, + "r": 0.8941176533699036 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1060, + "childrenIds": [ + "113:10", + "113:11", + "113:22", + "113:23" + ], + "parentId": "189:1785" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:10": { + "id": "113:10", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "간편 로그인 연동", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "간편 로그인 연동", + "end": 9, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:1a8fd81b1ba260740f7ddf31569a7ab10c0ec384,23:15" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 980, + "childrenIds": [], + "parentId": "113:9" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:11": { + "id": "113:11", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 96, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884446", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 980, + "childrenIds": [ + "113:12", + "113:17" + ], + "parentId": "113:9" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:22": { + "id": "113:22", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:f5613063210cb55c4f22591497c139340720b4f9/2:116" + } + }, + "color": { + "b": 0.9490196108818054, + "g": 0.9137254953384399, + "r": 0.8941176533699036 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 39794", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 980, + "childrenIds": [], + "parentId": "113:9" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:23": { + "id": "113:23", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 144, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 1597884445", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 980, + "childrenIds": [ + "113:24", + "113:28", + "113:32" + ], + "parentId": "113:9" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:12": { + "id": "113:12", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 14697", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 980, + "childrenIds": [ + "113:13", + "113:14", + "113:15" + ], + "parentId": "113:11" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:17": { + "id": "113:17", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 14696", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 980, + "childrenIds": [ + "113:18", + "113:19", + "113:20" + ], + "parentId": "113:11" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:24": { + "id": "113:24", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 14701", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 980, + "childrenIds": [ + "113:25", + "113:26" + ], + "parentId": "113:23" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:28": { + "id": "113:28", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 14699", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 980, + "childrenIds": [ + "113:29", + "113:30" + ], + "parentId": "113:23" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:32": { + "id": "113:32", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 14700", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 980, + "childrenIds": [ + "113:33", + "113:34" + ], + "parentId": "113:23" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:13": { + "id": "113:13", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "카카오", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "카카오", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 801, + "childrenIds": [], + "parentId": "113:12" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:14": { + "id": "113:14", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "연결 전", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:b9921dbe36f26ff05978e014dac901b29f2a12f4/2:362" + } + }, + "color": { + "b": 0.5555557012557983, + "g": 0.5046297907829285, + "r": 0.5046297907829285 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "723,457 hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "연결 전", + "end": 4, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:b9921dbe36f26ff05978e014dac901b29f2a12f4/2:362" + } + }, + "color": { + "b": 0.5555557012557983, + "g": 0.5046297907829285, + "r": 0.5046297907829285 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:8de3e75e8aa9e74fc05518a1daedc751ba038ca3,2:423" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "childrenIds": [], + "parentId": "113:12" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:15": { + "id": "113:15", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:62aa73c4d05c5df2860e80c700538556e877e723/2:69" + } + }, + "color": { + "b": 0.886274516582489, + "g": 0.545098066329956, + "r": 0.24313725531101227 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 48098137", + "opacity": 1, + "paddingBottom": 4, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:62aa73c4d05c5df2860e80c700538556e877e723/2:69" + } + }, + "color": { + "b": 0.886274516582489, + "g": 0.545098066329956, + "r": 0.24313725531101227 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 73, + "childrenIds": [ + "113:16" + ], + "parentId": "113:12" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:18": { + "id": "113:18", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "구글", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "구글", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 711, + "childrenIds": [], + "parentId": "113:17" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:19": { + "id": "113:19", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "cooolvita@gmail.com", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:b9921dbe36f26ff05978e014dac901b29f2a12f4/2:362" + } + }, + "color": { + "b": 0.5555557012557983, + "g": 0.5046297907829285, + "r": 0.5046297907829285 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "723,457 hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "cooolvita@gmail.com", + "end": 19, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:b9921dbe36f26ff05978e014dac901b29f2a12f4/2:362" + } + }, + "color": { + "b": 0.5555557012557983, + "g": 0.5046297907829285, + "r": 0.5046297907829285 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -0.5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:8de3e75e8aa9e74fc05518a1daedc751ba038ca3,2:423" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 132, + "childrenIds": [], + "parentId": "113:17" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:20": { + "id": "113:20", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:62aa73c4d05c5df2860e80c700538556e877e723/2:69" + } + }, + "color": { + "b": 0.886274516582489, + "g": 0.545098066329956, + "r": 0.24313725531101227 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 48098137", + "opacity": 1, + "paddingBottom": 4, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:62aa73c4d05c5df2860e80c700538556e877e723/2:69" + } + }, + "color": { + "b": 0.886274516582489, + "g": 0.545098066329956, + "r": 0.24313725531101227 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 73, + "childrenIds": [ + "113:21" + ], + "parentId": "113:17" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:25": { + "id": "113:25", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "서비스 이용약관", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "서비스 이용약관", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 904, + "childrenIds": [], + "parentId": "113:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:26": { + "id": "113:26", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "ic:round-arrow-left", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "childrenIds": [ + "113:27" + ], + "parentId": "113:24" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:29": { + "id": "113:29", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "개인정보 처리방침", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "개인정보 처리방침", + "end": 9, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 904, + "childrenIds": [], + "parentId": "113:28" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:30": { + "id": "113:30", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "ic:round-arrow-left", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "childrenIds": [ + "113:31" + ], + "parentId": "113:28" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:33": { + "id": "113:33", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "회원 탈퇴", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Hotels", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0, + "strokes": [], + "styledTextSegments": [ + { + "characters": "회원 탈퇴", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137" + } + }, + "color": { + "b": 0.2078431397676468, + "g": 0.20000000298023224, + "r": 0.22745098173618317 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": -1 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ff39719a4f4432493ec910934cf96b8acdefc1ab,7:190" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 904, + "childrenIds": [], + "parentId": "113:32" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:34": { + "id": "113:34", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "ic:round-arrow-left", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "childrenIds": [ + "113:35" + ], + "parentId": "113:32" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:16": { + "id": "113:16", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "인증하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 16 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "인증하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "인증하기", + "end": 4, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 16 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:a3848da5fdda46625c1895179c2bcba88a32539a,24:34" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 49, + "childrenIds": [], + "parentId": "113:15" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:21": { + "id": "113:21", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "인증하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 16 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "인증하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "인증하기", + "end": 4, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PIXELS", + "value": 0 + }, + "lineHeight": { + "unit": "PIXELS", + "value": 16 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:a3848da5fdda46625c1895179c2bcba88a32539a,24:34" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 49, + "childrenIds": [], + "parentId": "113:20" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:27": { + "id": "113:27", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6e4f1696da68f73d5c140882dee1f94e56df5222/7:272" + } + }, + "color": { + "b": 0.6196078658103943, + "g": 0.6196078658103943, + "r": 0.6196078658103943 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 7.1804890632629395, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.59244441986084, + "childrenIds": [], + "parentId": "113:26" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:31": { + "id": "113:31", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6e4f1696da68f73d5c140882dee1f94e56df5222/7:272" + } + }, + "color": { + "b": 0.6196078658103943, + "g": 0.6196078658103943, + "r": 0.6196078658103943 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 7.1804890632629395, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.59244441986084, + "childrenIds": [], + "parentId": "113:30" + }, + "extra": {}, + "fieldErrors": {} + }, + "113:35": { + "id": "113:35", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6e4f1696da68f73d5c140882dee1f94e56df5222/7:272" + } + }, + "color": { + "b": 0.6196078658103943, + "g": 0.6196078658103943, + "r": 0.6196078658103943 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 7.1804890632629395, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.59244441986084, + "childrenIds": [], + "parentId": "113:34" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:f5613063210cb55c4f22591497c139340720b4f9/2:116", + "name": "border" + }, + { + "id": "VariableID:c94c4b118e67ccdd520018116c235719f1c770a6/7:138", + "name": "primaryBg" + }, + { + "id": "VariableID:57475e52516076fee3a8936d875fd8baaa61a342/2:137", + "name": "text" + }, + { + "id": "VariableID:b9921dbe36f26ff05978e014dac901b29f2a12f4/2:362", + "name": "gray500" + }, + { + "id": "VariableID:62aa73c4d05c5df2860e80c700538556e877e723/2:69", + "name": "primary" + }, + { + "id": "VariableID:6e4f1696da68f73d5c140882dee1f94e56df5222/7:272", + "name": "gray300" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-224-075a41e65c.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-224-075a41e65c.json new file mode 100644 index 0000000..8026657 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-224-075a41e65c.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-224-075a41e65c", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 79" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "188:1567" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1567": { + "id": "188:1567", + "type": "STAR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Star7", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-225-00fb8a129e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-225-00fb8a129e.json new file mode 100644 index 0000000..3242ef4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-225-00fb8a129e.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-225-00fb8a129e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 80" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "188:1568" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1568": { + "id": "188:1568", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Polygon1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-226-b2c28bcc8f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-226-b2c28bcc8f.json new file mode 100644 index 0000000..2ffaed9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-226-b2c28bcc8f.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-226-b2c28bcc8f", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 81" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "189:1590" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1590": { + "id": "189:1590", + "type": "POLYGON", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 100, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Polygon1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-227-bebc4e7262.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-227-bebc4e7262.json new file mode 100644 index 0000000..791fc47 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-227-bebc4e7262.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-227-bebc4e7262", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 82" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "188:1569" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1569": { + "id": "188:1569", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 4, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-228-221bd0c553.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-228-221bd0c553.json new file mode 100644 index 0000000..a2a4ce8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-228-221bd0c553.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-228-221bd0c553", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 83" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "216:1548" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "216:1548": { + "id": "216:1548", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line 8", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 0.5, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-229-9f57002cd6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-229-9f57002cd6.json new file mode 100644 index 0000000..8714528 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-229-9f57002cd6.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-229-9f57002cd6", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 84" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "189:1582" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1582": { + "id": "189:1582", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-230-2af59fd9fa.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-230-2af59fd9fa.json new file mode 100644 index 0000000..29b0888 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-230-2af59fd9fa.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-230-2af59fd9fa", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 85" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "189:1586" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1586": { + "id": "189:1586", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line 3", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 4, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 140, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-231-117d816fb9.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-231-117d816fb9.json new file mode 100644 index 0000000..76bdd35 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-231-117d816fb9.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-231-117d816fb9", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 86" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "199:1545" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "199:1545": { + "id": "199:1545", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line4", + "opacity": 1, + "reactions": [], + "rotation": 15.000000120055855, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 150, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-232-8e875ce9e3.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-232-8e875ce9e3.json new file mode 100644 index 0000000..a5d6b38 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-232-8e875ce9e3.json @@ -0,0 +1,105 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-232-8e875ce9e3", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 87" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "199:1554" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "199:1554": { + "id": "199:1554", + "type": "LINE", + "fields": { + "blendMode": "PASS_THROUGH", + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 0, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Line 7", + "opacity": 1, + "reactions": [], + "rotation": 90, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 131, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-233-0a60be5fbc.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-233-0a60be5fbc.json new file mode 100644 index 0000000..1b3e9e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-233-0a60be5fbc.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-233-0a60be5fbc", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 88" + }, + "request": { + "rootId": "188:1572" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "188:1572" + ], + "nodes": { + "188:1572": { + "id": "188:1572", + "type": "SECTION", + "fields": { + "name": "다양한 도형", + "childrenIds": [ + "188:1571" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1571": { + "id": "188:1571", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 60, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector4", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 280, + "childrenIds": [], + "parentId": "188:1572" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-234-01ad9a0db0.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-234-01ad9a0db0.json new file mode 100644 index 0000000..52475f5 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-234-01ad9a0db0.json @@ -0,0 +1,905 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-234-01ad9a0db0", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 89" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "188:1552" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1552": { + "id": "188:1552", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "DevupUI", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 128, + "childrenIds": [ + "188:1553", + "188:1557" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1553": { + "id": "188:1553", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "188:1554", + "188:1555", + "188:1556" + ], + "parentId": "188:1552" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1557": { + "id": "188:1557", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 3", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 92, + "childrenIds": [ + "188:1558" + ], + "parentId": "188:1552" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1554": { + "id": "188:1554", + "type": "STAR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9968286752700806, + "g": 0.8097218871116638, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9263890385627747, + "g": 0.7285662889480591, + "r": 0.6626253724098206 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Star 5", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 28, + "childrenIds": [], + "parentId": "188:1553" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1555": { + "id": "188:1555", + "type": "STAR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Star 6", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 28, + "childrenIds": [], + "parentId": "188:1553" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1556": { + "id": "188:1556", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.940277636051178, + "r": 0.9651618599891663 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 1, + "r": 1 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.180328369140625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 16.983606338500977, + "childrenIds": [], + "parentId": "188:1553" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1558": { + "id": "188:1558", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Devup UI", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 92, + "childrenIds": [ + "188:1559", + "188:1560", + "188:1561", + "188:1562", + "188:1563", + "188:1564", + "188:1565" + ], + "parentId": "188:1557" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1559": { + "id": "188:1559", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.238091468811035, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.97971248626709, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1560": { + "id": "188:1560", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.471328735351562, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.797364234924316, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1561": { + "id": "188:1561", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.30708885192871, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 12.350691795349121, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1562": { + "id": "188:1562", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.545185089111328, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 10.839245796203613, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1563": { + "id": "188:1563", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.350822448730469, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.983627319335938, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1564": { + "id": "188:1564", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.739547729492188, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 12.350696563720703, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + }, + "188:1565": { + "id": "188:1565", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.238091468811035, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.538261413574219, + "childrenIds": [], + "parentId": "188:1558" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-235-8a3992468b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-235-8a3992468b.json new file mode 100644 index 0000000..a65a738 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-235-8a3992468b.json @@ -0,0 +1,909 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-235-8a3992468b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 90" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1760" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1760": { + "id": "189:1760", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "DevupUI", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 128, + "childrenIds": [ + "189:1761", + "189:1765" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1761": { + "id": "189:1761", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Icon", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 28, + "y": 28 + }, + "visible": true, + "width": 28, + "childrenIds": [ + "189:1762", + "189:1763", + "189:1764" + ], + "parentId": "189:1760" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1765": { + "id": "189:1765", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.3333330154418945, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 6.6666669845581055, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Logo", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 92, + "childrenIds": [ + "189:1766" + ], + "parentId": "189:1760" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1762": { + "id": "189:1762", + "type": "STAR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9968286752700806, + "g": 0.8097218871116638, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9263890385627747, + "g": 0.7285662889480591, + "r": 0.6626253724098206 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Star 5", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 28, + "childrenIds": [], + "parentId": "189:1761" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1763": { + "id": "189:1763", + "type": "STAR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Star 6", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 28, + "childrenIds": [], + "parentId": "189:1761" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1764": { + "id": "189:1764", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.940277636051178, + "r": 0.9651618599891663 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 1, + "r": 1 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.180328369140625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 16.983606338500977, + "childrenIds": [], + "parentId": "189:1761" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1766": { + "id": "189:1766", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Devup UI", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 92, + "childrenIds": [ + "189:1767", + "189:1768", + "189:1769", + "189:1770", + "189:1771", + "189:1772", + "189:1773" + ], + "parentId": "189:1765" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1767": { + "id": "189:1767", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.238091468811035, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.97971248626709, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1768": { + "id": "189:1768", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.471328735351562, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.797364234924316, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1769": { + "id": "189:1769", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.30708885192871, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 12.350691795349121, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1770": { + "id": "189:1770", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.545185089111328, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 10.839245796203613, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1771": { + "id": "189:1771", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.350822448730469, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.983627319335938, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1772": { + "id": "189:1772", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.739547729492188, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 12.350696563720703, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1773": { + "id": "189:1773", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40" + } + }, + "color": { + "b": 0.18431372940540314, + "g": 0.18431372940540314, + "r": 0.18431372940540314 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.238091468811035, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.538261413574219, + "childrenIds": [], + "parentId": "189:1766" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-236-621c6d6a9e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-236-621c6d6a9e.json new file mode 100644 index 0000000..6bbae4a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-236-621c6d6a9e.json @@ -0,0 +1,323 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-236-621c6d6a9e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 91" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1695" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1695": { + "id": "189:1695", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 8, + "paddingRight": 8, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 8, + "paddingLeft": 8, + "paddingRight": 8, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112" + } + }, + "color": { + "b": 0.9215686321258545, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 40, + "childrenIds": [ + "189:1726" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1726": { + "id": "189:1726", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4.999663352966309, + "paddingLeft": 8.99951171875, + "paddingRight": 6.999662399291992, + "paddingTop": 4.99951171875, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "back", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": -180, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 16, + "y": 16 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "childrenIds": [ + "189:1727" + ], + "parentId": "189:1695" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1727": { + "id": "189:1727", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70" + } + }, + "color": { + "b": 0.38823530077934265, + "g": 0.3333333432674408, + "r": 0.29411765933036804 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 14.000824928283691, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 8.000825881958008, + "childrenIds": [], + "parentId": "189:1726" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-237-01ee478666.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-237-01ee478666.json new file mode 100644 index 0000000..81b4332 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-237-01ee478666.json @@ -0,0 +1,310 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-237-01ee478666", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 92" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1690" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1690": { + "id": "189:1690", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227" + } + }, + "color": { + "b": 1, + "g": 0.9607843160629272, + "r": 0.9803921580314636 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 48, + "y": 48 + }, + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 40, + "childrenIds": [ + "189:1731" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1731": { + "id": "189:1731", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 20, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.291666269302368, + "paddingLeft": 2.2916667461395264, + "paddingRight": 2.291666269302368, + "paddingTop": 2.2916667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "plus", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 16, + "y": 16 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "189:1732" + ], + "parentId": "189:1690" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1732": { + "id": "189:1732", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47" + } + }, + "color": { + "b": 0.9019607901573181, + "g": 0.12156862765550613, + "r": 0.529411792755127 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.416666984558105, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 1 (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 2.5, + "strokes": [], + "visible": true, + "width": 15.416666984558105, + "childrenIds": [], + "parentId": "189:1731" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-238-1a8cf8c870.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-238-1a8cf8c870.json new file mode 100644 index 0000000..8353e20 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-238-1a8cf8c870.json @@ -0,0 +1,346 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-238-1a8cf8c870", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 93" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1744" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1744": { + "id": "189:1744", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227" + } + }, + "color": { + "b": 1, + "g": 0.9607843160629272, + "r": 0.9803921580314636 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 48, + "y": 48 + }, + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 40, + "childrenIds": [ + "189:1745" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1745": { + "id": "189:1745", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "plus", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 16, + "y": 16 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "189:1746", + "189:1747" + ], + "parentId": "189:1744" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1746": { + "id": "189:1746", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.6682692170143127, + "r": 0.841636061668396 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.416666984558105, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 1 (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 2.5, + "strokes": [], + "visible": true, + "width": 15.416666984558105, + "childrenIds": [], + "parentId": "189:1745" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1747": { + "id": "189:1747", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47" + } + }, + "color": { + "b": 0.9019607901573181, + "g": 0.12156862765550613, + "r": 0.529411792755127 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.416666984558105, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 1 (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 2.5, + "strokes": [], + "visible": true, + "width": 15.416666984558105, + "childrenIds": [], + "parentId": "189:1745" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-239-a6dada3682.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-239-a6dada3682.json new file mode 100644 index 0000000..c192733 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-239-a6dada3682.json @@ -0,0 +1,285 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-239-a6dada3682", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 94" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1719" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1719": { + "id": "189:1719", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 48, + "childrenIds": [ + "189:1720" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1720": { + "id": "189:1720", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.3333327770233154, + "paddingLeft": 2.6491129398345947, + "paddingRight": 2.654266119003296, + "paddingTop": 2.3333332538604736, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "cog", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "189:1721" + ], + "parentId": "189:1719" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1721": { + "id": "189:1721", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23.33333396911621, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 22.69662094116211, + "childrenIds": [], + "parentId": "189:1720" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-240-77d56a1585.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-240-77d56a1585.json new file mode 100644 index 0000000..1344e97 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-240-77d56a1585.json @@ -0,0 +1,346 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-240-77d56a1585", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 95" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1744" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1744": { + "id": "189:1744", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227" + } + }, + "color": { + "b": 1, + "g": 0.9607843160629272, + "r": 0.9803921580314636 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 48, + "y": 48 + }, + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 40, + "childrenIds": [ + "189:1745" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1745": { + "id": "189:1745", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "plus", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 16, + "y": 16 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "189:1746", + "189:1747" + ], + "parentId": "189:1744" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1746": { + "id": "189:1746", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.6682692170143127, + "r": 0.841636061668396 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.416666984558105, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 1 (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 2.5, + "strokes": [], + "visible": true, + "width": 15.416666984558105, + "childrenIds": [], + "parentId": "189:1745" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1747": { + "id": "189:1747", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47" + } + }, + "color": { + "b": 0.9019607901573181, + "g": 0.12156862765550613, + "r": 0.529411792755127 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.416666984558105, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 1 (Stroke)", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 2.5, + "strokes": [], + "visible": true, + "width": 15.416666984558105, + "childrenIds": [], + "parentId": "189:1745" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-241-e171ef72ce.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-241-e171ef72ce.json new file mode 100644 index 0000000..5a20a88 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-241-e171ef72ce.json @@ -0,0 +1,285 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-241-e171ef72ce", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 96" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1719" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1719": { + "id": "189:1719", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 48, + "childrenIds": [ + "189:1720" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1720": { + "id": "189:1720", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.3333327770233154, + "paddingLeft": 2.6491129398345947, + "paddingRight": 2.654266119003296, + "paddingTop": 2.3333332538604736, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "cog", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "189:1721" + ], + "parentId": "189:1719" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1721": { + "id": "189:1721", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23.33333396911621, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 22.69662094116211, + "childrenIds": [], + "parentId": "189:1720" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-242-5c198a8490.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-242-5c198a8490.json new file mode 100644 index 0000000..5e74d1f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-242-5c198a8490.json @@ -0,0 +1,321 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-242-5c198a8490", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 97" + }, + "request": { + "rootId": "189:1599" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "189:1599" + ], + "nodes": { + "189:1599": { + "id": "189:1599", + "type": "SECTION", + "fields": { + "name": "SVG - detail", + "childrenIds": [ + "189:1736" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1736": { + "id": "189:1736", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "clipsContent": false, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Button", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 48, + "childrenIds": [ + "189:1737" + ], + "parentId": "189:1599" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1737": { + "id": "189:1737", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "cog", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "189:1738", + "189:1739" + ], + "parentId": "189:1736" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1738": { + "id": "189:1738", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.1586538404226303, + "g": 0.1586538404226303, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23.33333396911621, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 22.69662094116211, + "childrenIds": [], + "parentId": "189:1737" + }, + "extra": {}, + "fieldErrors": {} + }, + "189:1739": { + "id": "189:1739", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 23.33333396911621, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 22.69662094116211, + "childrenIds": [], + "parentId": "189:1737" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-243-14366a47ff.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-243-14366a47ff.json new file mode 100644 index 0000000..6f1531e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-243-14366a47ff.json @@ -0,0 +1,257 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-243-14366a47ff", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 98" + }, + "request": { + "rootId": "244:1553" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "244:1553" + ], + "nodes": { + "244:1553": { + "id": "244:1553", + "type": "SECTION", + "fields": { + "name": "Decorative Text", + "childrenIds": [ + "241:1549" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "241:1549": { + "id": "241:1549", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "16.8s", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.950320303440094, + "g": 0.6934240460395813, + "r": 0.4188108444213867 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7932692170143127, + "g": 0.20721584558486938, + "r": 0.5100101232528687 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -1, + 6.123234262925839E-17, + 1 + ], + [ + -9.68716443142322E-17, + -1.5820338726043701, + 1.291016936302185 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 47, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 129.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "16.8s", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "16.8s", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.950320303440094, + "g": 0.6934240460395813, + "r": 0.4188108444213867 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7932692170143127, + "g": 0.20721584558486938, + "r": 0.5100101232528687 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -1, + 6.123234262925839E-17, + 1 + ], + [ + -9.68716443142322E-17, + -1.5820338726043701, + 1.291016936302185 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 36, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 129.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:4dd924de606291d62751e055b2339398e6c20129,19:44" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "244:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-244-4ccea91f13.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-244-4ccea91f13.json new file mode 100644 index 0000000..f12c489 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-244-4ccea91f13.json @@ -0,0 +1,232 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-244-4ccea91f13", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 99" + }, + "request": { + "rootId": "244:1553" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "244:1553" + ], + "nodes": { + "244:1553": { + "id": "244:1553", + "type": "SECTION", + "fields": { + "name": "Decorative Text", + "childrenIds": [ + "244:1548" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "244:1548": { + "id": "244:1548", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "홈페이지와 앱 제작", + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.43921568989753723, + "r": 0.48627451062202454 + }, + "offset": { + "x": 0, + "y": 0 + }, + "radius": 12, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.02083294279873371, + "r": 0.29826346039772034 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan 2 TTF", + "style": "Regular" + }, + "fontSize": 38, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 46, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "홈페이지와 앱 제작", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 3, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "styledTextSegments": [ + { + "characters": "홈페이지와 앱 제작", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.02083294279873371, + "r": 0.29826346039772034 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan 2 TTF", + "style": "Regular" + }, + "fontSize": 38, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 319, + "childrenIds": [], + "parentId": "244:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-245-537356bcf4.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-245-537356bcf4.json new file mode 100644 index 0000000..080b989 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-245-537356bcf4.json @@ -0,0 +1,227 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-245-537356bcf4", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 100" + }, + "request": { + "rootId": "244:1553" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "244:1553" + ], + "nodes": { + "244:1553": { + "id": "244:1553", + "type": "SECTION", + "fields": { + "name": "Decorative Text", + "childrenIds": [ + "244:1564" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "244:1564": { + "id": "244:1564", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "온글과 함께라면", + "dashPattern": [], + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 59, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "온글과 함께라면", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "온글", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0" + } + }, + "color": { + "b": 0.9490196108818054, + "g": 0.24313725531101227, + "r": 0.2980392277240753 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "ExtraBold" + }, + "fontSize": 42, + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + }, + { + "characters": "과 함께라면", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Medium" + }, + "fontSize": 40, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 2, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 242, + "childrenIds": [], + "parentId": "244:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:228af354eb8741f69bcd91fe730fec0505e9eac9/19:40", + "name": "text" + }, + { + "id": "VariableID:5ed5fe4e2c110aae522cfe81f189c59552683358/18:227", + "name": "primaryBgLight" + }, + { + "id": "VariableID:51a40441a4e76d70d58452cb534b842a89c22c63/14:47", + "name": "primary" + }, + { + "id": "VariableID:331c673285290a0918108f25061f5c757824db3b/11:20", + "name": "containerBackground" + }, + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:93d8aadc9ec1c35e7c24bdf723b9b05a01b75a2d/14:70", + "name": "textLight" + }, + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-246-295f39e09b.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-246-295f39e09b.json new file mode 100644 index 0000000..291a15e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-246-295f39e09b.json @@ -0,0 +1,215 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-246-295f39e09b", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 101" + }, + "request": { + "rootId": "244:1553" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "244:1553" + ], + "nodes": { + "244:1553": { + "id": "244:1553", + "type": "SECTION", + "fields": { + "name": "Decorative Text", + "childrenIds": [ + "244:1573" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "244:1573": { + "id": "244:1573", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "데브파이브", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "501cbd2c326417bbe006176f93aa0d7429d935b2", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 90, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "데브파이브", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "데브파이브", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "501cbd2c326417bbe006176f93aa0d7429d935b2", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 308, + "childrenIds": [], + "parentId": "244:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-247-39d6959685.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-247-39d6959685.json new file mode 100644 index 0000000..08a9a3c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-247-39d6959685.json @@ -0,0 +1,229 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-247-39d6959685", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 102" + }, + "request": { + "rootId": "244:1553" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "244:1553" + ], + "nodes": { + "244:1553": { + "id": "244:1553", + "type": "SECTION", + "fields": { + "name": "Decorative Text", + "childrenIds": [ + "244:1578" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "244:1578": { + "id": "244:1578", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "데브파이브", + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 1, + "b": 1, + "g": 0.43921568989753723, + "r": 0.48627451062202454 + }, + "offset": { + "x": 0, + "y": 0 + }, + "radius": 12, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.4000000059604645, + "b": 0.9964476227760315, + "g": 0.7868587970733643, + "r": 1 + }, + "offset": { + "x": 0, + "y": 10 + }, + "radius": 24, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 90, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "데브파이브", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "styledTextSegments": [ + { + "characters": "데브파이브", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Jalnan Gothic TTF", + "style": "Regular" + }, + "fontSize": 64, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -5 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 308, + "childrenIds": [], + "parentId": "244:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:4be0713ea9f483833095fc5a0baa288fccc81e47/173:0", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-248-d1bc18e068.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-248-d1bc18e068.json new file mode 100644 index 0000000..87f6e3a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-248-d1bc18e068.json @@ -0,0 +1,185 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-248-d1bc18e068", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 103" + }, + "request": { + "rootId": "520:2035" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "520:2035" + ], + "nodes": { + "520:2035": { + "id": "520:2035", + "type": "SECTION", + "fields": { + "name": "List", + "childrenIds": [ + "387:1575" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "387:1575": { + "id": "387:1575", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "어떤 증상이 가장 힘들고 일상생활에 영향을 주나요?\n증상이 언제부터 시작되었나요?\n증상이 시간이 지나면서 어떻게 변했나요?\n스트레스나 상황에 따라 증상이 달라지나요?", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.2549019753932953, + "r": 0.21568627655506134 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 120, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "어떤 증상이 가장 힘들고 일상생활에 영향을 주나요? 증상이 언제부터 시작되었나요? 증상이 시간이 지나면서 어떻게 변했나요? 스트레스나 상황에 따라 증상이 달라지나요?", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "어떤 증상이 가장 힘들고 일상생활에 영향을 주나요?\n증상이 언제부터 시작되었나요?\n증상이 시간이 지나면서 어떻게 변했나요?\n스트레스나 상황에 따라 증상이 달라지나요?", + "end": 95, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.2549019753932953, + "r": 0.21568627655506134 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "hyperlink": null, + "indentation": 1, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "listOptions": { + "type": "UNORDERED" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:52e722002759e248c2864a7e8ac3a317bda530d6,723:121" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 312, + "childrenIds": [], + "parentId": "520:2035" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:1500634352fc7d420979f2b85b3736d4b0a410de/14:65", + "name": "text" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-249-6b8a42981d.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-249-6b8a42981d.json new file mode 100644 index 0000000..b9247c3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-249-6b8a42981d.json @@ -0,0 +1,1383 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-249-6b8a42981d", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 104" + }, + "request": { + "rootId": "351:1546", + "operationInput": { + "targetComponent": "GradientButton" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "351:1546" + ], + "nodes": { + "351:1546": { + "id": "351:1546", + "type": "COMPONENT_SET", + "fields": { + "blendMode": "PASS_THROUGH", + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "active", + "default", + "disabled", + "hover" + ] + } + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 2 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": -2, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 6, + "showShadowBehindNode": false, + "spread": -1, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.20000000298023224, + "r": 0.5764706134796143 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8980392217636108, + "g": 0.27450981736183167, + "r": 0.30980393290519714 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "id": "351:1551", + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "351:1547", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "351:1547", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "type": "COMPONENT", + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 174 + }, + "effects": [], + "fills": [], + "height": 110, + "isAsset": false, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "GradientButton", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9607843160629272, + "g": 0.21960784494876862, + "r": 0.5411764979362488 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "childrenIds": [ + "351:1547", + "351:1549", + "351:1551", + "351:1553" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1547": { + "id": "351:1547", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 6, + "showShadowBehindNode": false, + "spread": -4, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 10 + }, + "radius": 15, + "showShadowBehindNode": false, + "spread": -3, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8078431487083435, + "g": 0.13333334028720856, + "r": 0.4941176474094391 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7921568751335144, + "g": 0.21960784494876862, + "r": 0.26274511218070984 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=hover", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "351:1549", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": null, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "351:1549", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": null, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "width": 174, + "childrenIds": [ + "351:1548" + ], + "parentId": "351:1546" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1549": { + "id": "351:1549", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8078431487083435, + "g": 0.13333334028720856, + "r": 0.4941176474094391 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7921568751335144, + "g": 0.21960784494876862, + "r": 0.26274511218070984 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active", + "opacity": 0.800000011920929, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active" + }, + "visible": true, + "width": 174, + "childrenIds": [ + "351:1550" + ], + "parentId": "351:1546" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1551": { + "id": "351:1551", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 2 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": -2, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 6, + "showShadowBehindNode": false, + "spread": -1, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.20000000298023224, + "r": 0.5764706134796143 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8980392217636108, + "g": 0.27450981736183167, + "r": 0.30980393290519714 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "351:1547", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "351:1547", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 174, + "childrenIds": [ + "351:1552" + ], + "parentId": "351:1546" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1553": { + "id": "351:1553", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": true, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 2 + }, + "radius": 4, + "showShadowBehindNode": false, + "spread": -2, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.10000000149011612, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 6, + "showShadowBehindNode": false, + "spread": -1, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112" + } + }, + "color": { + "b": 0.9215686321258545, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=disabled", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "disabled" + }, + "visible": true, + "width": 174, + "childrenIds": [ + "351:1554" + ], + "parentId": "351:1546" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1548": { + "id": "351:1548", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자세히 알아보기 →", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Text", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자세히 알아보기 →", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:34c356e42f6c53205f63e2d290404cfe897daf77,257:23" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 114, + "childrenIds": [], + "parentId": "351:1547" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1550": { + "id": "351:1550", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자세히 알아보기 →", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Text", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자세히 알아보기 →", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:34c356e42f6c53205f63e2d290404cfe897daf77,257:23" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 114, + "childrenIds": [], + "parentId": "351:1549" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1552": { + "id": "351:1552", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자세히 알아보기 →", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Text", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자세히 알아보기 →", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:34c356e42f6c53205f63e2d290404cfe897daf77,257:23" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 114, + "childrenIds": [], + "parentId": "351:1551" + }, + "extra": {}, + "fieldErrors": {} + }, + "351:1554": { + "id": "351:1554", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "자세히 알아보기 →", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:447524240a084f4401116412e7f6bff5fe9ce064/14:114" + } + }, + "color": { + "b": 0.686274528503418, + "g": 0.6392157077789307, + "r": 0.6117647290229797 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Text", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "자세히 알아보기 →", + "end": 10, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:447524240a084f4401116412e7f6bff5fe9ce064/14:114" + } + }, + "color": { + "b": 0.686274528503418, + "g": 0.6392157077789307, + "r": 0.6117647290229797 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Pretendard", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:34c356e42f6c53205f63e2d290404cfe897daf77,257:23" + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "CENTER", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 114, + "childrenIds": [], + "parentId": "351:1553" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:447524240a084f4401116412e7f6bff5fe9ce064/14:114", + "name": "gray400" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-250-935ccdb80f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-250-935ccdb80f.json new file mode 100644 index 0000000..5109da7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-250-935ccdb80f.json @@ -0,0 +1,5107 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-250-935ccdb80f", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 105" + }, + "request": { + "rootId": "536:2019", + "operationInput": { + "targetComponent": "button" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "536:2019" + ], + "nodes": { + "536:2019": { + "id": "536:2019", + "type": "COMPONENT_SET", + "fields": { + "blendMode": "PASS_THROUGH", + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "active", + "default", + "hover" + ] + }, + "size": { + "defaultValue": "Md", + "type": "VARIANT", + "variantOptions": [ + "Md", + "Sm" + ] + }, + "variant": { + "defaultValue": "primary", + "type": "VARIANT", + "variantOptions": [ + "primary", + "white" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "cornerRadius": 5, + "counterAxisAlignItems": "MIN", + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "id": "536:2020", + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Desktop, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2022", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2022", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 12, + "topRightRadius": 12, + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 191 + }, + "effects": [], + "fills": [], + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 10, + "paddingRight": 10, + "paddingTop": 10, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "button", + "opacity": 1, + "primaryAxisAlignItems": "MIN", + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9607843160629272, + "g": 0.21960784494876862, + "r": 0.5411764979362488 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "childrenIds": [ + "536:2020", + "536:2022", + "536:2024", + "536:2026", + "536:2028", + "536:2030", + "536:2032", + "536:2034", + "536:2036", + "536:2038", + "536:2040", + "536:2042", + "536:2044", + "536:2046", + "536:2048", + "536:2050", + "536:2052", + "536:2054", + "536:2056", + "536:2058" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2020": { + "id": "536:2020", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Desktop, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2022", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2022", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2021" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2022": { + "id": "536:2022", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6fda38b621cee7138fefe2f548fb0ac32bed50d2/184:19" + } + }, + "color": { + "b": 0.12215694040060043, + "g": 0.17384839057922363, + "r": 0.24198707938194275 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=hover, viewport=Desktop, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2024", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2024", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2023" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2024": { + "id": "536:2024", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:e541fd0850144a6d8ce0d82c7b1cda4ab6de8634/214:234" + } + }, + "color": { + "b": 0.10539940744638443, + "g": 0.14288927614688873, + "r": 0.19230769574642181 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Desktop, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2025" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2026": { + "id": "536:2026", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 51, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Mobile, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2028", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2028", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Mobile" + }, + "visible": true, + "width": 149, + "childrenIds": [ + "536:2027" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2028": { + "id": "536:2028", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6fda38b621cee7138fefe2f548fb0ac32bed50d2/184:19" + } + }, + "color": { + "b": 0.12215694040060043, + "g": 0.17384839057922363, + "r": 0.24198707938194275 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 51, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Mobile, size=Md, variant=primary", + "opacity": 1, + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "primary", + "viewport": "Mobile" + }, + "visible": true, + "width": 149, + "childrenIds": [ + "536:2029" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2030": { + "id": "536:2030", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Desktop, size=Sm, variant=primary", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2032", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2032", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2031" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2032": { + "id": "536:2032", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6fda38b621cee7138fefe2f548fb0ac32bed50d2/184:19" + } + }, + "color": { + "b": 0.12215694040060043, + "g": 0.17384839057922363, + "r": 0.24198707938194275 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=hover, viewport=Desktop, size=Sm, variant=primary", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2034", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2034", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2033" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2034": { + "id": "536:2034", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:e541fd0850144a6d8ce0d82c7b1cda4ab6de8634/214:234" + } + }, + "color": { + "b": 0.10539940744638443, + "g": 0.14288927614688873, + "r": 0.19230769574642181 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Desktop, size=Sm, variant=primary", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2035" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2036": { + "id": "536:2036", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 41, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Mobile, size=Sm, variant=primary", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2038", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2038", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "primary", + "viewport": "Mobile" + }, + "visible": true, + "width": 110, + "childrenIds": [ + "536:2037" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2038": { + "id": "536:2038", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:6fda38b621cee7138fefe2f548fb0ac32bed50d2/184:19" + } + }, + "color": { + "b": 0.12215694040060043, + "g": 0.17384839057922363, + "r": 0.24198707938194275 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 41, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Mobile, size=Sm, variant=primary", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "primary", + "viewport": "Mobile" + }, + "visible": true, + "width": 110, + "childrenIds": [ + "536:2039" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2040": { + "id": "536:2040", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:66d5566c6c181693c4432ba889ac096a2cc5ae87/10:20" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Desktop, size=Md, variant=white", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2042", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2042", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2041" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2042": { + "id": "536:2042", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:de57c6fe2f9f2d0bac7251b1cb0473a0e25aa741/11:0" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=hover, viewport=Desktop, size=Md, variant=white", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2044", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2044", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2043" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2044": { + "id": "536:2044", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": false, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:aaa26483266ca762b4f299e7f324b88cd3986a3f/218:287" + } + }, + "color": { + "b": 0.8549392223358154, + "g": 0.8950223922729492, + "r": 0.9150639772415161 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Desktop, size=Md, variant=white", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 191, + "childrenIds": [ + "536:2045" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2046": { + "id": "536:2046", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:66d5566c6c181693c4432ba889ac096a2cc5ae87/10:20" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 51, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Mobile, size=Md, variant=white", + "opacity": 1, + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2048", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2048", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "white", + "viewport": "Mobile" + }, + "visible": true, + "width": 149, + "childrenIds": [ + "536:2047" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2048": { + "id": "536:2048", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:de57c6fe2f9f2d0bac7251b1cb0473a0e25aa741/11:0" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 51, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Mobile, size=Md, variant=white", + "opacity": 1, + "paddingBottom": 16, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 16, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "white", + "viewport": "Mobile" + }, + "visible": true, + "width": 149, + "childrenIds": [ + "536:2049" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2050": { + "id": "536:2050", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:66d5566c6c181693c4432ba889ac096a2cc5ae87/10:20" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Desktop, size=Sm, variant=white", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2052", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2052", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2051" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2052": { + "id": "536:2052", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:de57c6fe2f9f2d0bac7251b1cb0473a0e25aa741/11:0" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=hover, viewport=Desktop, size=Sm, variant=white", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2054", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2054", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2053" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2054": { + "id": "536:2054", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:aaa26483266ca762b4f299e7f324b88cd3986a3f/218:287" + } + }, + "color": { + "b": 0.8549392223358154, + "g": 0.8950223922729492, + "r": 0.9150639772415161 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 46, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Desktop, size=Sm, variant=white", + "opacity": 1, + "paddingBottom": 14, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 14, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "visible": true, + "width": 123, + "childrenIds": [ + "536:2055" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2056": { + "id": "536:2056", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:66d5566c6c181693c4432ba889ac096a2cc5ae87/10:20" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 41, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=default, viewport=Mobile, size=Sm, variant=white", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [ + { + "action": { + "destinationId": "536:2058", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "536:2058", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.20000000298023224, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_PRESS" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "white", + "viewport": "Mobile" + }, + "visible": true, + "width": 110, + "childrenIds": [ + "536:2057" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2058": { + "id": "536:2058", + "type": "COMPONENT", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "clipsContent": false, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:de57c6fe2f9f2d0bac7251b1cb0473a0e25aa741/11:0" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 41, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "effect=active, viewport=Mobile, size=Sm, variant=white", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "white", + "viewport": "Mobile" + }, + "visible": true, + "width": 110, + "childrenIds": [ + "536:2059" + ], + "parentId": "536:2019" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2021": { + "id": "536:2021", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2020" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2023": { + "id": "536:2023", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2022" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2025": { + "id": "536:2025", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2024" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2027": { + "id": "536:2027", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:5ccd36654caf58d0aac160577ccf843fb83effcd,50:134" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 89, + "childrenIds": [], + "parentId": "536:2026" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2029": { + "id": "536:2029", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:5ccd36654caf58d0aac160577ccf843fb83effcd,50:134" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 89, + "childrenIds": [], + "parentId": "536:2028" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2031": { + "id": "536:2031", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2030" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2033": { + "id": "536:2033", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2032" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2035": { + "id": "536:2035", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2034" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2037": { + "id": "536:2037", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e9ebfd71c5ce53c0bee7d13e5bfbfdd3602bbc4c,214:240" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 78, + "childrenIds": [], + "parentId": "536:2036" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2039": { + "id": "536:2039", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e9ebfd71c5ce53c0bee7d13e5bfbfdd3602bbc4c,214:240" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 78, + "childrenIds": [], + "parentId": "536:2038" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2041": { + "id": "536:2041", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2040" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2043": { + "id": "536:2043", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2042" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2045": { + "id": "536:2045", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 20, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f067bb28d04c8d3b5404525c3bb062c7a5c3f8c6,50:23" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 111, + "childrenIds": [], + "parentId": "536:2044" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2047": { + "id": "536:2047", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:5ccd36654caf58d0aac160577ccf843fb83effcd,50:134" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 89, + "childrenIds": [], + "parentId": "536:2046" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2049": { + "id": "536:2049", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:5ccd36654caf58d0aac160577ccf843fb83effcd,50:134" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 89, + "childrenIds": [], + "parentId": "536:2048" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2051": { + "id": "536:2051", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2050" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2053": { + "id": "536:2053", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2052" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2055": { + "id": "536:2055", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:2c8bbaddeba2edbdc9706ea2efbd3b2d46aac5fa,214:239" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 83, + "childrenIds": [], + "parentId": "536:2054" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2057": { + "id": "536:2057", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e9ebfd71c5ce53c0bee7d13e5bfbfdd3602bbc4c,214:240" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 78, + "childrenIds": [], + "parentId": "536:2056" + }, + "extra": {}, + "fieldErrors": {} + }, + "536:2059": { + "id": "536:2059", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청하기", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 14, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e9ebfd71c5ce53c0bee7d13e5bfbfdd3602bbc4c,214:240" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 78, + "childrenIds": [], + "parentId": "536:2058" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:54a5e49a31d11583de0ae1faa3ec4bf26bd03a86/14:112", + "name": "gray200" + }, + { + "id": "VariableID:447524240a084f4401116412e7f6bff5fe9ce064/14:114", + "name": "gray400" + }, + { + "id": "VariableID:c00308f0d374bc5a508ccdf159c175403715413b/171:260", + "name": "primary" + }, + { + "id": "VariableID:6fda38b621cee7138fefe2f548fb0ac32bed50d2/184:19", + "name": "primaryBold" + }, + { + "id": "VariableID:e541fd0850144a6d8ce0d82c7b1cda4ab6de8634/214:234", + "name": "primaryExBold" + }, + { + "id": "VariableID:66d5566c6c181693c4432ba889ac096a2cc5ae87/10:20", + "name": "containerBackground" + }, + { + "id": "VariableID:19c4aef6f32a229732ad97d11bc8a6e9c6d7654e/171:277", + "name": "primaryAccent" + }, + { + "id": "VariableID:de57c6fe2f9f2d0bac7251b1cb0473a0e25aa741/11:0", + "name": "background" + }, + { + "id": "VariableID:aaa26483266ca762b4f299e7f324b88cd3986a3f/218:287", + "name": "backgroundBold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-251-50acddfb96.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-251-50acddfb96.json new file mode 100644 index 0000000..29fe904 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-251-50acddfb96.json @@ -0,0 +1,2902 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-251-50acddfb96", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 106" + }, + "request": { + "rootId": "284:18782" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "284:18782" + ], + "nodes": { + "284:18782": { + "id": "284:18782", + "type": "SECTION", + "fields": { + "name": "UnderConstruction", + "childrenIds": [ + "284:18593" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18593": { + "id": "284:18593", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:642" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 1080, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 120, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 120, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Desktop", + "opacity": 1, + "paddingBottom": 120, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 120, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "284:18783", + "284:18625" + ], + "parentId": "284:18782" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18783": { + "id": "284:18783", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1578.6072998046875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "backgroundImage", + "opacity": 0.20000000298023224, + "reactions": [], + "rotation": -11.242728725472414, + "visible": true, + "width": 2471.312255859375, + "x": -196.2255859375, + "y": -908, + "childrenIds": [ + "284:18784", + "284:18785", + "284:18786", + "284:18787", + "284:18788" + ], + "parentId": "284:18593" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18625": { + "id": "284:18625", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 762, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 120, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 120, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086061", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 669, + "childrenIds": [ + "284:18689", + "284:18684" + ], + "parentId": "284:18593" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18784": { + "id": "284:18784", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1479.8109130859375, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 2", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 2402.24169921875, + "childrenIds": [], + "parentId": "284:18783" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18785": { + "id": "284:18785", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1479.8109130859375, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 3", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 2402.24169921875, + "childrenIds": [], + "parentId": "284:18783" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18786": { + "id": "284:18786", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1479.8109130859375, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 4", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 2402.24169921875, + "childrenIds": [], + "parentId": "284:18783" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18787": { + "id": "284:18787", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1479.8109130859375, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 5", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472416, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 2402.24169921875, + "childrenIds": [], + "parentId": "284:18783" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18788": { + "id": "284:18788", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1479.8109130859375, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 6", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472416, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 2402.24169921875, + "childrenIds": [], + "parentId": "284:18783" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18689": { + "id": "284:18689", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 520, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 60, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 60, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086066", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 669, + "childrenIds": [ + "284:18621", + "284:18629", + "284:18631" + ], + "parentId": "284:18625" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18684": { + "id": "284:18684", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 122, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086065", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 368, + "childrenIds": [ + "284:18685", + "284:18662", + "284:18633" + ], + "parentId": "284:18625" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18621": { + "id": "284:18621", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.30980393290519714, + "g": 0.529411792755127, + "r": 0.6941176652908325 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 104, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path1208", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.244274377822876, + "strokes": [], + "targetAspectRatio": { + "x": 211.70425415039062, + "y": 110.56629180908203 + }, + "visible": true, + "width": 200, + "childrenIds": [], + "parentId": "284:18689" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18629": { + "id": "284:18629", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 138, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086062", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 669, + "childrenIds": [ + "284:18628", + "284:18623" + ], + "parentId": "284:18689" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18631": { + "id": "284:18631", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 158, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086063", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 525, + "childrenIds": [ + "284:18626", + "284:18630" + ], + "parentId": "284:18689" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18685": { + "id": "284:18685", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제 최신 소식 확인하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:638" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 17, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "제주국제관악제 최신 소식 확인하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제 최신 소식 확인하기", + "end": 18, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:638" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 17, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:1588167b8be246784a2d7bbf2363c5b98a418e70," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 241, + "childrenIds": [], + "parentId": "284:18684" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18662": { + "id": "284:18662", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 30, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086064", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 156, + "childrenIds": [ + "284:18663", + "284:18666", + "284:18670", + "284:18673", + "284:18678" + ], + "parentId": "284:18684" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18633": { + "id": "284:18633", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "문의 : 064-722-8704 / bandfestival@hanmail.net", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 17, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "문의 : 064-722-8704 / bandfestival@hanmail.net", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "문의 : 064-722-8704 / bandfestival@hanmail.net", + "end": 44, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 17, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f3fe0b8adf37a80fc9553b745496cf5b44c4aba9," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 368, + "childrenIds": [], + "parentId": "284:18684" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18628": { + "id": "284:18628", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Under Construction", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 32, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 43, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Under Construction", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Under Construction", + "end": 18, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 32, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:14819e9e5daae015642942d4c39508e2b388720c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 321, + "childrenIds": [], + "parentId": "284:18629" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18623": { + "id": "284:18623", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제 리뉴얼 알림", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 56, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 75, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "제주국제관악제 리뉴얼 알림", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제 리뉴얼 알림", + "end": 14, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 56, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:9b31c24f538a5e45ca1ffbd51f55bccaf93525aa," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 669, + "childrenIds": [], + "parentId": "284:18629" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18626": { + "id": "284:18626", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "더 나은 서비스 제공을 위해 시스템 점검 및 리뉴얼을 진행 중입니다.\n이용에 불편을 드려 죄송하며, 빠른 시일 내에 다시 찾아뵙겠습니다.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 80, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "더 나은 서비스 제공을 위해 시스템 점검 및 리뉴얼을 진행 중입니다. 이용에 불편을 드려 죄송하며, 빠른 시일 내에 다시 찾아뵙겠습니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "더 나은 서비스 제공을 위해 시스템 점검 및 리뉴얼을 진행 중입니다.\n이용에 불편을 드려 죄송하며, 빠른 시일 내에 다시 찾아뵙겠습니다.", + "end": 76, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:c70470a187185991705af339d5d2c1c4e00a599b," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 525, + "childrenIds": [], + "parentId": "284:18631" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18630": { + "id": "284:18630", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "We are currently updating our website to serve you better. \nWe apologize for the inconvenience.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:68:1448" + } + }, + "color": { + "b": 0.350098580121994, + "g": 0.350098580121994, + "r": 0.38461539149284363 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 58, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "We are currently updating our website to serve you better. We apologize for the inconvenience.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "We are currently updating our website to serve you better. \nWe apologize for the inconvenience.", + "end": 95, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:68:1448" + } + }, + "color": { + "b": 0.350098580121994, + "g": 0.350098580121994, + "r": 0.38461539149284363 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 415, + "childrenIds": [], + "parentId": "284:18631" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18663": { + "id": "284:18663", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "twitter_5968830 (1) 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 1227, + "y": 1227 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": false, + "width": 32, + "childrenIds": [ + "284:18664", + "284:18665" + ], + "parentId": "284:18662" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18666": { + "id": "284:18666", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.45098039507865906, + "g": 0.8588235378265381, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.30588236451148987, + "g": 0.6784313917160034, + "r": 0.9921568632125854 + }, + "position": 0.07999999821186066 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18039216101169586, + "g": 0.5137255191802979, + "r": 0.9843137264251709 + }, + "position": 0.15000000596046448 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.12941177189350128, + "g": 0.45098039507865906, + "r": 0.9803921580314636 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18431372940540314, + "g": 0.4117647111415863, + "r": 0.9647058844566345 + }, + "position": 0.23000000417232513 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3529411852359772, + "g": 0.29019609093666077, + "r": 0.9098039269447327 + }, + "position": 0.3700000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.4588235318660736, + "g": 0.21176470816135406, + "r": 0.8784313797950745 + }, + "position": 0.47999998927116394 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.49803921580314636, + "g": 0.18431372940540314, + "r": 0.8666666746139526 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5921568870544434, + "g": 0.239215686917305, + "r": 0.7058823704719543 + }, + "position": 0.6800000071525574 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8313725590705872, + "g": 0.3764705955982208, + "r": 0.3019607961177826 + }, + "position": 0.9700000286102295 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8588235378265381, + "g": 0.3921568691730499, + "r": 0.25882354378700256 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -0.2444278746843338, + -0.8524705171585083, + 1.048449158668518 + ], + [ + 0.8524705171585083, + -0.2444278746843338, + 0.19597867131233215 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "instagram_15713420 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18667", + "284:18668", + "284:18669" + ], + "parentId": "284:18662" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18670": { + "id": "284:18670", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "facebook_1384053 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 682.6666870117188, + "y": 682.6666870117188 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18671", + "284:18672" + ], + "parentId": "284:18662" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18673": { + "id": "284:18673", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "youtube_3991722 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18674" + ], + "parentId": "284:18662" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18678": { + "id": "284:18678", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 21", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 533.3333129882812, + "y": 533.3333129882812 + }, + "visible": false, + "width": 32, + "childrenIds": [ + "284:18679", + "284:18681" + ], + "parentId": "284:18662" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18664": { + "id": "284:18664", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.458450317382812, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 16.55889320373535, + "childrenIds": [], + "parentId": "284:18663" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18665": { + "id": "284:18665", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18663" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18667": { + "id": "284:18667", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 21.473751068115234, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 21.582500457763672, + "childrenIds": [], + "parentId": "284:18666" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18668": { + "id": "284:18668", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.108752250671387, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.108752250671387, + "childrenIds": [], + "parentId": "284:18666" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18669": { + "id": "284:18669", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2.6337499618530273, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.6337509155273438, + "childrenIds": [], + "parentId": "284:18666" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18671": { + "id": "284:18671", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.40392157435417175, + "r": 0.25882354378700256 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18670" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18672": { + "id": "284:18672", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.167238235473633, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 14.093750953674316, + "childrenIds": [], + "parentId": "284:18670" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18674": { + "id": "284:18674", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18675" + ], + "parentId": "284:18673" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18679": { + "id": "284:18679", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g36", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18680" + ], + "parentId": "284:18678" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18681": { + "id": "284:18681", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.251760482788086, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g92", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 10.399999618530273, + "childrenIds": [ + "284:18682" + ], + "parentId": "284:18678" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18675": { + "id": "284:18675", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "02.youtube", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18676", + "284:18677" + ], + "parentId": "284:18674" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18680": { + "id": "284:18680", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0.8823529481887817, + "r": 0.9803921580314636 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path38", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333332538604736, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18679" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18682": { + "id": "284:18682", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.251760482788086, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path94", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333332538604736, + "strokes": [], + "visible": true, + "width": 10.399999618530273, + "childrenIds": [], + "parentId": "284:18681" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18676": { + "id": "284:18676", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0.9215686321258545 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "background", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18675" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18677": { + "id": "284:18677", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 14.616372108459473, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "icon", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 20.000892639160156, + "childrenIds": [], + "parentId": "284:18675" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:10:642", + "name": "background" + }, + { + "id": "VariableID:171:6908", + "name": "primaryAccent" + }, + { + "id": "VariableID:10:641", + "name": "text" + }, + { + "id": "VariableID:68:1448", + "name": "textLight" + }, + { + "id": "VariableID:10:638", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-252-49e979239e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-252-49e979239e.json new file mode 100644 index 0000000..583075a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-252-49e979239e.json @@ -0,0 +1,2891 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-252-49e979239e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 107" + }, + "request": { + "rootId": "284:18782" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "284:18782" + ], + "nodes": { + "284:18782": { + "id": "284:18782", + "type": "SECTION", + "fields": { + "name": "UnderConstruction", + "childrenIds": [ + "284:18736" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18736": { + "id": "284:18736", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:642" + } + }, + "color": { + "b": 0.929411768913269, + "g": 0.9529411792755127, + "r": 0.9647058844566345 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 852, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 76, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 60, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 60, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 76, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Mobile", + "opacity": 1, + "paddingBottom": 60, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 60, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 393, + "childrenIds": [ + "284:18804", + "284:18746" + ], + "parentId": "284:18782" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18804": { + "id": "284:18804", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 497.8604431152344, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "backgroundImage", + "opacity": 0.20000000298023224, + "reactions": [], + "rotation": -11.242728725472414, + "visible": true, + "width": 779.4011840820312, + "x": -183.93421936035156, + "y": -255, + "childrenIds": [ + "284:18805", + "284:18806", + "284:18807", + "284:18808", + "284:18809" + ], + "parentId": "284:18736" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18746": { + "id": "284:18746", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 715, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 60, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 60, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086061", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 353, + "childrenIds": [ + "284:18747", + "284:18755" + ], + "parentId": "284:18736" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18805": { + "id": "284:18805", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 466.7019348144531, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 2", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 1.2000000476837158, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 757.61767578125, + "childrenIds": [], + "parentId": "284:18804" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18806": { + "id": "284:18806", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 466.7019348144531, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 3", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472412, + "strokeAlign": "CENTER", + "strokeWeight": 1.2000000476837158, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 757.61767578125, + "childrenIds": [], + "parentId": "284:18804" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18807": { + "id": "284:18807", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 466.7019348144531, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 4", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 1.2000000476837158, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 757.61767578125, + "childrenIds": [], + "parentId": "284:18804" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18808": { + "id": "284:18808", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 466.7019348144531, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 5", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 1.2000000476837158, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 757.61767578125, + "childrenIds": [], + "parentId": "284:18804" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18809": { + "id": "284:18809", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 466.7019348144531, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 6", + "opacity": 1, + "reactions": [], + "rotation": -11.242728725472414, + "strokeAlign": "CENTER", + "strokeWeight": 1.2000000476837158, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.41960784792900085, + "g": 0.6431372761726379, + "r": 0.7843137383460999 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 757.61767578125, + "childrenIds": [], + "parentId": "284:18804" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18747": { + "id": "284:18747", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 502, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086066", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 353, + "childrenIds": [ + "284:18748", + "284:18749", + "284:18752" + ], + "parentId": "284:18746" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18755": { + "id": "284:18755", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 153, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086065", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 227, + "childrenIds": [ + "284:18757", + "284:18758", + "284:18756" + ], + "parentId": "284:18746" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18748": { + "id": "284:18748", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.30980393290519714, + "g": 0.529411792755127, + "r": 0.6941176652908325 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 52, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path1208", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.244274377822876, + "strokes": [], + "targetAspectRatio": { + "x": 211.70425415039062, + "y": 110.56629180908203 + }, + "visible": true, + "width": 100, + "childrenIds": [], + "parentId": "284:18747" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18749": { + "id": "284:18749", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 156, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086062", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 353, + "childrenIds": [ + "284:18750", + "284:18751" + ], + "parentId": "284:18747" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18752": { + "id": "284:18752", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 234, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086063", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 353, + "childrenIds": [ + "284:18753", + "284:18754" + ], + "parentId": "284:18747" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18757": { + "id": "284:18757", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제 최신 소식 확인하기", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:638" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "제주국제관악제 최신 소식 확인하기", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제 최신 소식 확인하기", + "end": 18, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:638" + } + }, + "color": { + "b": 0.17345693707466125, + "g": 0.2507188618183136, + "r": 0.3525640070438385 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:4fd1225444ddbbfd36aa07500d572aa253bdd93d," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 227, + "childrenIds": [], + "parentId": "284:18755" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18758": { + "id": "284:18758", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 30, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 26086064", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 156, + "childrenIds": [ + "284:18759", + "284:18762", + "284:18766", + "284:18769", + "284:18774" + ], + "parentId": "284:18755" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18756": { + "id": "284:18756", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "문의 : 064-722-8704 / \nbandfestival@hanmail.net", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 54, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "문의 : 064-722-8704 / bandfestival@hanmail.net", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "문의 : 064-722-8704 / \nbandfestival@hanmail.net", + "end": 45, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 16, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:79f1bafd5cc1856c48f9459f6aeb415762061b9b," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 195, + "childrenIds": [], + "parentId": "284:18755" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18750": { + "id": "284:18750", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Under Construction", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Under Construction", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Under Construction", + "end": 18, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:3b473a78704138bee802a56e5cc5985142b1cadd," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 201, + "childrenIds": [], + "parentId": "284:18749" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18751": { + "id": "284:18751", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제 \n리뉴얼 알림", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 35, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 106, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "제주국제관악제 리뉴얼 알림", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제 \n리뉴얼 알림", + "end": 15, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 35, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:274c0fed1bc528170a95a809d99939559908f2de," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 353, + "childrenIds": [], + "parentId": "284:18749" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18753": { + "id": "284:18753", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "더 나은 서비스 제공을 위해 \n시스템 점검 및 리뉴얼을 진행 중입니다.\n이용에 불편을 드려 죄송하며, \n빠른 시일 내에 다시 찾아뵙겠습니다.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 17, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 136, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "더 나은 서비스 제공을 위해 시스템 점검 및 리뉴얼을 진행 중입니다. 이용에 불편을 드려 죄송하며, 빠른 시일 내에 다시 찾아뵙겠습니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "더 나은 서비스 제공을 위해 \n시스템 점검 및 리뉴얼을 진행 중입니다.\n이용에 불편을 드려 죄송하며, \n빠른 시일 내에 다시 찾아뵙겠습니다.", + "end": 78, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 17, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 200 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:efc082632af0578b31d7c37ad1d216886c8a3f11," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 353, + "childrenIds": [], + "parentId": "284:18752" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18754": { + "id": "284:18754", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "We are currently updating our website \nto serve you better. \nWe apologize for the inconvenience.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:68:1448" + } + }, + "color": { + "b": 0.350098580121994, + "g": 0.350098580121994, + "r": 0.38461539149284363 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 78, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "We are currently updating our website to serve you better. We apologize for the inconvenience.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "We are currently updating our website \nto serve you better. \nWe apologize for the inconvenience.", + "end": 96, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:68:1448" + } + }, + "color": { + "b": 0.350098580121994, + "g": 0.350098580121994, + "r": 0.38461539149284363 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 15, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:9385fb03675cd3793e5cd5ff37b1b3f1c6d3a704," + } + ], + "textAlignHorizontal": "CENTER", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 353, + "childrenIds": [], + "parentId": "284:18752" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18759": { + "id": "284:18759", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "twitter_5968830 (1) 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 1227, + "y": 1227 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": false, + "width": 32, + "childrenIds": [ + "284:18760", + "284:18761" + ], + "parentId": "284:18758" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18762": { + "id": "284:18762", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.45098039507865906, + "g": 0.8588235378265381, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.30588236451148987, + "g": 0.6784313917160034, + "r": 0.9921568632125854 + }, + "position": 0.07999999821186066 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18039216101169586, + "g": 0.5137255191802979, + "r": 0.9843137264251709 + }, + "position": 0.15000000596046448 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.12941177189350128, + "g": 0.45098039507865906, + "r": 0.9803921580314636 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18431372940540314, + "g": 0.4117647111415863, + "r": 0.9647058844566345 + }, + "position": 0.23000000417232513 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3529411852359772, + "g": 0.29019609093666077, + "r": 0.9098039269447327 + }, + "position": 0.3700000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.4588235318660736, + "g": 0.21176470816135406, + "r": 0.8784313797950745 + }, + "position": 0.47999998927116394 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.49803921580314636, + "g": 0.18431372940540314, + "r": 0.8666666746139526 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5921568870544434, + "g": 0.239215686917305, + "r": 0.7058823704719543 + }, + "position": 0.6800000071525574 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8313725590705872, + "g": 0.3764705955982208, + "r": 0.3019607961177826 + }, + "position": 0.9700000286102295 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8588235378265381, + "g": 0.3921568691730499, + "r": 0.25882354378700256 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -0.2444278746843338, + -0.8524705171585083, + 1.048449158668518 + ], + [ + 0.8524705171585083, + -0.2444278746843338, + 0.19597867131233215 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "instagram_15713420 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18763", + "284:18764", + "284:18765" + ], + "parentId": "284:18758" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18766": { + "id": "284:18766", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "facebook_1384053 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 682.6666870117188, + "y": 682.6666870117188 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18767", + "284:18768" + ], + "parentId": "284:18758" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18769": { + "id": "284:18769", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "youtube_3991722 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18770" + ], + "parentId": "284:18758" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18774": { + "id": "284:18774", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 21", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 533.3333129882812, + "y": 533.3333129882812 + }, + "visible": false, + "width": 32, + "childrenIds": [ + "284:18775", + "284:18777" + ], + "parentId": "284:18758" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18760": { + "id": "284:18760", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.458450317382812, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 16.55889320373535, + "childrenIds": [], + "parentId": "284:18759" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18761": { + "id": "284:18761", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18759" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18763": { + "id": "284:18763", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 21.473751068115234, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 21.582500457763672, + "childrenIds": [], + "parentId": "284:18762" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18764": { + "id": "284:18764", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.108752250671387, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.108752250671387, + "childrenIds": [], + "parentId": "284:18762" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18765": { + "id": "284:18765", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2.6337499618530273, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.6337509155273438, + "childrenIds": [], + "parentId": "284:18762" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18767": { + "id": "284:18767", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.40392157435417175, + "r": 0.25882354378700256 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18766" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18768": { + "id": "284:18768", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.167238235473633, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 14.093750953674316, + "childrenIds": [], + "parentId": "284:18766" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18770": { + "id": "284:18770", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18771" + ], + "parentId": "284:18769" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18775": { + "id": "284:18775", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g36", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18776" + ], + "parentId": "284:18774" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18777": { + "id": "284:18777", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.251760482788086, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g92", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 10.399999618530273, + "childrenIds": [ + "284:18778" + ], + "parentId": "284:18774" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18771": { + "id": "284:18771", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "02.youtube", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "284:18772", + "284:18773" + ], + "parentId": "284:18770" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18776": { + "id": "284:18776", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0.8823529481887817, + "r": 0.9803921580314636 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path38", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333332538604736, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18775" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18778": { + "id": "284:18778", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19.251760482788086, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path94", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333332538604736, + "strokes": [], + "visible": true, + "width": 10.399999618530273, + "childrenIds": [], + "parentId": "284:18777" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18772": { + "id": "284:18772", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0.9215686321258545 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "background", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "284:18771" + }, + "extra": {}, + "fieldErrors": {} + }, + "284:18773": { + "id": "284:18773", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 14.616372108459473, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "icon", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 20.000892639160156, + "childrenIds": [], + "parentId": "284:18771" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:68:1448", + "name": "textLight" + }, + { + "id": "VariableID:10:642", + "name": "background" + }, + { + "id": "VariableID:171:6908", + "name": "primaryAccent" + }, + { + "id": "VariableID:10:641", + "name": "text" + }, + { + "id": "VariableID:10:638", + "name": "primary" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-253-347a2e5fb2.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-253-347a2e5fb2.json new file mode 100644 index 0000000..a87c0a2 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-253-347a2e5fb2.json @@ -0,0 +1,8231 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-253-347a2e5fb2", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 108" + }, + "request": { + "rootId": "213:7244" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "213:7244" + ], + "nodes": { + "213:7244": { + "id": "213:7244", + "type": "SECTION", + "fields": { + "name": "/greetings", + "childrenIds": [ + "213:7478" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7478": { + "id": "213:7478", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 1729, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Tablet", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 992, + "childrenIds": [ + "213:7479", + "213:7480", + "213:7499", + "213:7500" + ], + "parentId": "213:7244" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7479": { + "id": "213:7479", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "4076983ed3c0dea3155b4af4ec695ec542634399", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.45345190167427063, + 0.3905264437198639 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 0.699999988079071, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 300, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 58, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "PageHeader", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 58, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 992, + "childrenIds": [ + "I213:7479;213:7277" + ], + "parentId": "213:7478" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7480": { + "id": "213:7480", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:643" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 1077, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 100, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 100, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 100, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "section 1", + "opacity": 1, + "paddingBottom": 100, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 40, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 992, + "childrenIds": [ + "213:7482", + "213:7488" + ], + "parentId": "213:7478" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7499": { + "id": "213:7499", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.149038165807724, + "g": 0.149038165807724, + "r": 0.149038165807724 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 352, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 60, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "footer", + "opacity": 1, + "paddingBottom": 60, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 992, + "childrenIds": [ + "I213:7499;68:1654" + ], + "parentId": "213:7478" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7500": { + "id": "213:7500", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 600, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 600, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "header", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "reactions": [ + { + "action": { + "destinationId": "46:6034", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": null, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "46:6034", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": null, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_CLICK" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 992, + "x": 0, + "y": 0, + "childrenIds": [ + "I213:7500;44:5971", + "I213:7500;46:6027" + ], + "parentId": "213:7478" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7277": { + "id": "I213:7479;213:7277", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 115, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 562", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [ + "I213:7479;213:7278", + "I213:7479;213:7279" + ], + "parentId": "213:7479" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7482": { + "id": "213:7482", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 571", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [ + "213:7481", + "213:7483", + "213:7484", + "213:7485", + "213:7486", + "213:7487" + ], + "parentId": "213:7480" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7488": { + "id": "213:7488", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 767.0000610351562, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 501", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [ + "213:7489", + "213:7490" + ], + "parentId": "213:7480" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1654": { + "id": "I213:7499;68:1654", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 232, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 526", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [ + "I213:7499;68:1655", + "I213:7499;68:1674", + "I213:7499;68:1675" + ], + "parentId": "213:7499" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;44:5971": { + "id": "I213:7500;44:5971", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 443", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 177.982421875, + "childrenIds": [ + "I213:7500;133:10515" + ], + "parentId": "213:7500" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;46:6027": { + "id": "I213:7500;46:6027", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 50, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 50, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 444", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 52, + "childrenIds": [ + "I213:7500;46:6047" + ], + "parentId": "213:7500" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278": { + "id": "I213:7479;213:7278", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 18, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "breadcurmb", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 178, + "childrenIds": [ + "I213:7479;213:7278;50:1756", + "I213:7479;213:7278;50:1757", + "I213:7479;213:7278;50:1761", + "I213:7479;213:7278;50:1763", + "I213:7479;213:7278;50:1765" + ], + "parentId": "I213:7479;213:7277" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7279": { + "id": "I213:7479;213:7279", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "GREETINGS", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Playfair Display", + "style": "Bold" + }, + "fontSize": 50, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 67, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Title", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "GREETINGS", + "end": 9, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Playfair Display", + "style": "Bold" + }, + "fontSize": 50, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:6e0529e27135cf05658c9075e357ecf3b190da24," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 289, + "childrenIds": [], + "parentId": "I213:7479;213:7277" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7481": { + "id": "213:7481", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 289, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 572", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 389, + "x": -23, + "y": 194, + "childrenIds": [], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7483": { + "id": "213:7483", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Tab", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 90, + "childrenIds": [ + "I213:7483;54:2462" + ], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7484": { + "id": "213:7484", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7485": { + "id": "213:7485", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 3", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 143, + "childrenIds": [ + "I213:7485;54:2460" + ], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7486": { + "id": "213:7486", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7487": { + "id": "213:7487", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 4", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 72, + "childrenIds": [ + "I213:7487;54:2462" + ], + "parentId": "213:7482" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7489": { + "id": "213:7489", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "23f101b5f266ecacdde37d7ea9b1e342196b8515", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 300, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 568", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 400, + "childrenIds": [], + "parentId": "213:7488" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7490": { + "id": "213:7490", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 767.0000610351562, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 40, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 567", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 472, + "childrenIds": [ + "213:7491", + "213:7494", + "213:7495", + "213:7496" + ], + "parentId": "213:7488" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1655": { + "id": "I213:7499;68:1655", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 531", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [ + "I213:7499;68:1656", + "I213:7499;68:1657" + ], + "parentId": "I213:7499;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1674": { + "id": "I213:7499;68:1674", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 14", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 912, + "childrenIds": [], + "parentId": "I213:7499;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1675": { + "id": "I213:7499;68:1675", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 136, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 529", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I213:7499;68:1676", + "I213:7499;68:1704" + ], + "parentId": "I213:7499;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10515": { + "id": "I213:7500;133:10515", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30.000164031982422, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 30", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 415.9013671875, + "y": 81.02861785888672 + }, + "visible": true, + "width": 153.982421875, + "childrenIds": [ + "I213:7500;133:10516", + "I213:7500;133:10537" + ], + "parentId": "I213:7500;44:5971" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;46:6047": { + "id": "I213:7500;46:6047", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "header", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "I213:7500;46:6048", + "I213:7500;46:6049", + "I213:7500;46:6050" + ], + "parentId": "I213:7500;46:6027" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1756": { + "id": "I213:7479;213:7278;50:1756", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 18, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 561", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 41, + "childrenIds": [ + "I213:7479;213:7278;50:1750", + "I213:7479;213:7278;50:1754" + ], + "parentId": "I213:7479;213:7278" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1757": { + "id": "I213:7479;213:7278;50:1757", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 5, + "paddingRight": 5, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7479;213:7278;50:1759" + ], + "parentId": "I213:7479;213:7278" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1761": { + "id": "I213:7479;213:7278;50:1761", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "소개", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Depth 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "소개", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:c9269b8818d6678db3025facd648c4029405049c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 26, + "childrenIds": [], + "parentId": "I213:7479;213:7278" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1763": { + "id": "I213:7479;213:7278;50:1763", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 5, + "paddingRight": 5, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 2", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7479;213:7278;50:1764" + ], + "parentId": "I213:7479;213:7278" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1765": { + "id": "I213:7479;213:7278;50:1765", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "인사말", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Depth 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "인사말", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:c9269b8818d6678db3025facd648c4029405049c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 39, + "childrenIds": [], + "parentId": "I213:7479;213:7278" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7483;54:2462": { + "id": "I213:7483;54:2462", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "조직위원장", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "조직위원장", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:4078465cecdee1d3afc8edc86a7904e4cc447d34," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 90, + "childrenIds": [], + "parentId": "213:7483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7485;54:2460": { + "id": "I213:7485;54:2460", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주특별자치도사", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주특별자치도사", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e687bd52bd0aa299c4f22136f8355dfb11adc5b5," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 143, + "childrenIds": [], + "parentId": "213:7485" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7487;54:2462": { + "id": "I213:7487;54:2462", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "예술감독", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "예술감독", + "end": 4, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:4078465cecdee1d3afc8edc86a7904e4cc447d34," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 72, + "childrenIds": [], + "parentId": "213:7487" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7491": { + "id": "213:7491", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 64.00007629394531, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 27", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 177.03269958496094, + "y": 110.89899444580078 + }, + "visible": true, + "width": 102.1656494140625, + "childrenIds": [ + "213:7492", + "213:7493" + ], + "parentId": "213:7490" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7494": { + "id": "213:7494", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "“ 섬, 그 바람의 울림! ”\n희망찬 봄을 여는 관악의 울림이 더 \n널리,\r더 멀리 퍼져나가기를 기원합니다.\r", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 126, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "“ 섬, 그 바람의 울림! ” 희망찬 봄을 여는 관악의 울림이 더 널리, 더 멀리 퍼져나가기를 기원합니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "“ 섬, 그 바람의 울림! ”\n희망찬 봄을 여는 관악의 울림이 더 \n널리,\r더 멀리 퍼져나가기를 기원합니다.\r", + "end": 61, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "MaruBuri", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:c0c3068e9ce4c80f78e12c4a0d078ef9d01b9e94," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 472, + "childrenIds": [], + "parentId": "213:7490" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7495": { + "id": "213:7495", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "음악과 자연이 함께 어우러지는 제주국제관악제가 30주년을 맞게 되었습니다.\r\n\r\n제주국제관악제를 아껴주시는 모든 분들과 함께 세계 속의 제주관악의 역사를 써 왔음에 깊이 감사드립니다.\r\n그동안 힘들고 어려운 순간들 속에서도 관악의 힘찬 울림은 우리에게 큰 위로와 보람을 안겨주었습니다.\r\n새로운 세대를 여는 앞으로의 시간과 함께 켜켜이 쌓여가는 역사 속에서, 세계를 향한 우리의 각오와 노력이 더해질 것입니다.\r\n\r\n희망찬 봄을 여는 관악의 울림이 더 널리, 더 멀리 퍼져나가기를 기원합니다.\r\n감사합니다.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 377, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "음악과 자연이 함께 어우러지는 제주국제관악제가 30주년을 맞게 되었습니다. 제주국제관악제를 아껴주시는 모든 분들과 함께 세계 속의 제주관악의 역사를 써 왔음에 깊이 감사드립니다. 그동안 힘들고 어려운 순간들 속에서도 관악의 힘찬 울림은 우리에게 큰 위로와 보람을 안겨주었습니다. 새로운 세대를 여는 앞으로의 시간과 함께 켜켜이 쌓여가는 역사 속에서, 세계를 향한 우리의 각오와 노력이 더해질 것입니다. 희망찬 봄을 여는 관악의 울림이 더 널리, 더 멀리 퍼져나가기를 기원합니다. 감사합니다.", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "음악과 자연이 함께 어우러지는 제주국제관악제가 30주년을 맞게 되었습니다.\r\n\r\n제주국제관악제를 아껴주시는 모든 분들과 함께 세계 속의 제주관악의 역사를 써 왔음에 깊이 감사드립니다.\r\n그동안 힘들고 어려운 순간들 속에서도 관악의 힘찬 울림은 우리에게 큰 위로와 보람을 안겨주었습니다.\r\n새로운 세대를 여는 앞으로의 시간과 함께 켜켜이 쌓여가는 역사 속에서, 세계를 향한 우리의 각오와 노력이 더해질 것입니다.\r\n\r\n희망찬 봄을 여는 관악의 울림이 더 널리, 더 멀리 퍼져나가기를 기원합니다.\r\n감사합니다.", + "end": 283, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 472, + "childrenIds": [], + "parentId": "213:7490" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7496": { + "id": "213:7496", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MAX", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 80, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 566", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 472, + "childrenIds": [ + "213:7497", + "213:7498" + ], + "parentId": "213:7490" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1656": { + "id": "I213:7499;68:1656", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "로고 영역", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "NanumMyeongjo", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 35, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "로고 영역", + "opacity": 0.5, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "로고 영역", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "NanumMyeongjo", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 110, + "childrenIds": [], + "parentId": "I213:7499;68:1655" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1657": { + "id": "I213:7499;68:1657", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 535", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 120, + "childrenIds": [ + "I213:7499;77:2677", + "I213:7499;77:2725", + "I213:7499;77:2764" + ], + "parentId": "I213:7499;68:1655" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1676": { + "id": "I213:7499;68:1676", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 88, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 530", + "opacity": 0.800000011920929, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I213:7499;68:1677", + "I213:7499;68:1686", + "I213:7499;68:1692" + ], + "parentId": "I213:7499;68:1675" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1704": { + "id": "I213:7499;68:1704", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "opacity": 0.6000000238418579, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "end": 40, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 379, + "childrenIds": [], + "parentId": "I213:7499;68:1675" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10516": { + "id": "I213:7500;133:10516", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30.000164031982422, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 153.982421875, + "childrenIds": [ + "I213:7500;133:10517", + "I213:7500;133:10518", + "I213:7500;133:10519", + "I213:7500;133:10520", + "I213:7500;133:10521", + "I213:7500;133:10522", + "I213:7500;133:10523", + "I213:7500;133:10524", + "I213:7500;133:10525", + "I213:7500;133:10526", + "I213:7500;133:10527", + "I213:7500;133:10528", + "I213:7500;133:10529", + "I213:7500;133:10530", + "I213:7500;133:10531", + "I213:7500;133:10532", + "I213:7500;133:10533", + "I213:7500;133:10534", + "I213:7500;133:10535", + "I213:7500;133:10536" + ], + "parentId": "I213:7500;133:10515" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10537": { + "id": "I213:7500;133:10537", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 5.830033779144287, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Jeju International Wind Ensemble Festival", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 116.6743392944336, + "childrenIds": [], + "parentId": "I213:7500;133:10515" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;46:6048": { + "id": "I213:7500;46:6048", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 16", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 21, + "childrenIds": [], + "parentId": "I213:7500;46:6047" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;46:6049": { + "id": "I213:7500;46:6049", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 17", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [], + "parentId": "I213:7500;46:6047" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;46:6050": { + "id": "I213:7500;46:6050", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 18", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 21, + "childrenIds": [], + "parentId": "I213:7500;46:6047" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1750": { + "id": "I213:7479;213:7278;50:1750", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 18, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.8613268733024597, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0.8630860447883606, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 18, + "childrenIds": [ + "I213:7479;213:7278;50:1751" + ], + "parentId": "I213:7479;213:7278;50:1756" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1754": { + "id": "I213:7479;213:7278;50:1754", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "홈", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "홈", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "홈", + "end": 1, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 14, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:c9269b8818d6678db3025facd648c4029405049c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 13, + "childrenIds": [], + "parentId": "I213:7479;213:7278;50:1756" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1759": { + "id": "I213:7479;213:7278;50:1759", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 12, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 8", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "I213:7479;213:7278;50:1757" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1764": { + "id": "I213:7479;213:7278;50:1764", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 12, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 8", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "I213:7479;213:7278;50:1763" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7492": { + "id": "213:7492", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 53.65919876098633, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path1200", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.9019865989685059, + "strokes": [], + "visible": true, + "width": 67.4652099609375, + "childrenIds": [], + "parentId": "213:7491" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7493": { + "id": "213:7493", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 55.77351760864258, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path1202", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.9019865989685059, + "strokes": [], + "visible": true, + "width": 71.2408447265625, + "childrenIds": [], + "parentId": "213:7491" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7497": { + "id": "213:7497", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제조직위원장\r", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "제주국제관악제조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제조직위원장\r", + "end": 13, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 177, + "childrenIds": [], + "parentId": "213:7496" + }, + "extra": {}, + "fieldErrors": {} + }, + "213:7498": { + "id": "213:7498", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "양승보", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 24, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 41, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 10 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "양승보", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "양승보", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 24, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 10 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:ebafb381cd0d9be4c0523f8b50e36dffc0f68e05," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 72, + "childrenIds": [], + "parentId": "213:7496" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2677": { + "id": "I213:7499;77:2677", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.45098039507865906, + "g": 0.8588235378265381, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.30588236451148987, + "g": 0.6784313917160034, + "r": 0.9921568632125854 + }, + "position": 0.07999999821186066 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18039216101169586, + "g": 0.5137255191802979, + "r": 0.9843137264251709 + }, + "position": 0.15000000596046448 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.12941177189350128, + "g": 0.45098039507865906, + "r": 0.9803921580314636 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18431372940540314, + "g": 0.4117647111415863, + "r": 0.9647058844566345 + }, + "position": 0.23000000417232513 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3529411852359772, + "g": 0.29019609093666077, + "r": 0.9098039269447327 + }, + "position": 0.3700000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.4588235318660736, + "g": 0.21176470816135406, + "r": 0.8784313797950745 + }, + "position": 0.47999998927116394 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.49803921580314636, + "g": 0.18431372940540314, + "r": 0.8666666746139526 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5921568870544434, + "g": 0.239215686917305, + "r": 0.7058823704719543 + }, + "position": 0.6800000071525574 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8313725590705872, + "g": 0.3764705955982208, + "r": 0.3019607961177826 + }, + "position": 0.9700000286102295 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8588235378265381, + "g": 0.3921568691730499, + "r": 0.25882354378700256 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -0.2444278746843338, + -0.8524705171585083, + 1.048449158668518 + ], + [ + 0.8524705171585083, + -0.2444278746843338, + 0.19597867131233215 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "instagram_15713420 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I213:7499;77:2678", + "I213:7499;77:2679", + "I213:7499;77:2680" + ], + "parentId": "I213:7499;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2725": { + "id": "I213:7499;77:2725", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "facebook_1384053 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 682.6666870117188, + "y": 682.6666870117188 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I213:7499;77:2726", + "I213:7499;77:2727" + ], + "parentId": "I213:7499;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2764": { + "id": "I213:7499;77:2764", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "youtube_3991722 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I213:7499;77:2765" + ], + "parentId": "I213:7499;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1677": { + "id": "I213:7499;68:1677", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 527", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I213:7499;68:1678", + "I213:7499;68:1685" + ], + "parentId": "I213:7499;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1686": { + "id": "I213:7499;68:1686", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 528", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 293, + "childrenIds": [ + "I213:7499;68:1687", + "I213:7499;68:1690", + "I213:7499;68:1691" + ], + "parentId": "I213:7499;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1692": { + "id": "I213:7499;68:1692", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 529", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 221, + "childrenIds": [ + "I213:7499;68:1693", + "I213:7499;68:1703" + ], + "parentId": "I213:7499;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10517": { + "id": "I213:7500;133:10517", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 13.171428680419922, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path945", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 18.49951934814453, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10518": { + "id": "I213:7500;133:10518", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path947", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 17.490215301513672, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10519": { + "id": "I213:7500;133:10519", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.375526428222656, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path949", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 17.024404525756836, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10520": { + "id": "I213:7500;133:10520", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.420724868774414, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path951", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 9.252727508544922, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10521": { + "id": "I213:7500;133:10521", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 9.98578929901123, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path953", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 10.852328300476074, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10522": { + "id": "I213:7500;133:10522", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path955", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.515344142913818, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10523": { + "id": "I213:7500;133:10523", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path957", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 3.565117120742798, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10524": { + "id": "I213:7500;133:10524", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.420724868774414, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path959", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 9.252727508544922, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10525": { + "id": "I213:7500;133:10525", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path961", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.518599987030029, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10526": { + "id": "I213:7500;133:10526", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path963", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 3.5650970935821533, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10527": { + "id": "I213:7500;133:10527", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.420724868774414, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path965", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 9.252727508544922, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10528": { + "id": "I213:7500;133:10528", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path967", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.518599987030029, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10529": { + "id": "I213:7500;133:10529", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 17.57588768005371, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path969", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 3.5650970935821533, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10530": { + "id": "I213:7500;133:10530", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.412591934204102, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path971", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 6.687436103820801, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10531": { + "id": "I213:7500;133:10531", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.279176235198975, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path973", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 17.441381454467773, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10532": { + "id": "I213:7500;133:10532", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 5.919386863708496, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path975", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 16.735925674438477, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10533": { + "id": "I213:7500;133:10533", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.224323272705078, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path977", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 14.989752769470215, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10534": { + "id": "I213:7500;133:10534", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 5.361597537994385, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 3.1670901775360107, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10535": { + "id": "I213:7500;133:10535", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.726161956787109, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 6.231622219085693, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7500;133:10536": { + "id": "I213:7500;133:10536", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29.99993324279785, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 18.866247177124023, + "childrenIds": [], + "parentId": "I213:7500;133:10516" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1751": { + "id": "I213:7479;213:7278;50:1751", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer_2_00000008110966642969673030000014418892031612672181_", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 18.001651763916016, + "childrenIds": [ + "I213:7479;213:7278;50:1752" + ], + "parentId": "I213:7479;213:7278;50:1750" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2678": { + "id": "I213:7499;77:2678", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 21.473751068115234, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 21.582500457763672, + "childrenIds": [], + "parentId": "I213:7499;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2679": { + "id": "I213:7499;77:2679", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.108752250671387, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.108752250671387, + "childrenIds": [], + "parentId": "I213:7499;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2680": { + "id": "I213:7499;77:2680", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2.6337499618530273, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.6337509155273438, + "childrenIds": [], + "parentId": "I213:7499;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2726": { + "id": "I213:7499;77:2726", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.40392157435417175, + "r": 0.25882354378700256 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "I213:7499;77:2725" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2727": { + "id": "I213:7499;77:2727", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.167238235473633, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 14.093750953674316, + "childrenIds": [], + "parentId": "I213:7499;77:2725" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2765": { + "id": "I213:7499;77:2765", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "I213:7499;77:2766" + ], + "parentId": "I213:7499;77:2764" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1678": { + "id": "I213:7499;68:1678", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "location_847372 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1679", + "I213:7499;68:1682" + ], + "parentId": "I213:7499;68:1677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1685": { + "id": "I213:7499;68:1685", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "end": 40, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 453, + "childrenIds": [], + "parentId": "I213:7499;68:1677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1687": { + "id": "I213:7499;68:1687", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "telephone_3095610 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1688" + ], + "parentId": "I213:7499;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1690": { + "id": "I213:7499;68:1690", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Tel. 064-722-8704", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Tel. 064-722-8704", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Tel. 064-722-8704", + "end": 17, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 125, + "childrenIds": [], + "parentId": "I213:7499;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1691": { + "id": "I213:7499;68:1691", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Fax. 064-753-2208", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Fax. 064-753-2208", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Fax. 064-753-2208", + "end": 17, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 128, + "childrenIds": [], + "parentId": "I213:7499;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1693": { + "id": "I213:7499;68:1693", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g453", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 23.999998092651367, + "y": 23.999998092651367 + }, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1694" + ], + "parentId": "I213:7499;68:1692" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1703": { + "id": "I213:7499;68:1703", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "bandfestival@hanmail.net\r", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "bandfestival@hanmail.net", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "bandfestival@hanmail.net\r", + "end": 25, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 193, + "childrenIds": [], + "parentId": "I213:7499;68:1692" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1752": { + "id": "I213:7479;213:7278;50:1752", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer_1-2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 18.001651763916016, + "childrenIds": [ + "I213:7479;213:7278;50:1753" + ], + "parentId": "I213:7479;213:7278;50:1751" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2766": { + "id": "I213:7499;77:2766", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "02.youtube", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "I213:7499;77:2767", + "I213:7499;77:2768" + ], + "parentId": "I213:7499;77:2765" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1679": { + "id": "I213:7499;68:1679", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.397499084472656, + "childrenIds": [ + "I213:7499;68:1680" + ], + "parentId": "I213:7499;68:1678" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1682": { + "id": "I213:7499;68:1682", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 4.655625343322754, + "childrenIds": [ + "I213:7499;68:1683" + ], + "parentId": "I213:7499;68:1678" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1688": { + "id": "I213:7499;68:1688", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13, + "childrenIds": [ + "I213:7499;68:1689" + ], + "parentId": "I213:7499;68:1687" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1694": { + "id": "I213:7499;68:1694", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g455", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1695" + ], + "parentId": "I213:7499;68:1693" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7479;213:7278;50:1753": { + "id": "I213:7479;213:7278;50:1753", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "_01.Home", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 18.001651763916016, + "childrenIds": [], + "parentId": "I213:7479;213:7278;50:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2767": { + "id": "I213:7499;77:2767", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0.9215686321258545 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "background", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "I213:7499;77:2766" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;77:2768": { + "id": "I213:7499;77:2768", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 14.616372108459473, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "icon", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 20.000892639160156, + "childrenIds": [], + "parentId": "I213:7499;77:2766" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1680": { + "id": "I213:7499;68:1680", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.397499084472656, + "childrenIds": [ + "I213:7499;68:1681" + ], + "parentId": "I213:7499;68:1679" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1683": { + "id": "I213:7499;68:1683", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 4.655625343322754, + "childrenIds": [ + "I213:7499;68:1684" + ], + "parentId": "I213:7499;68:1682" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1689": { + "id": "I213:7499;68:1689", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 5.688889026641846, + "strokes": [], + "visible": true, + "width": 13, + "childrenIds": [], + "parentId": "I213:7499;68:1688" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1695": { + "id": "I213:7499;68:1695", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Clip path group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1696", + "I213:7499;68:1698" + ], + "parentId": "I213:7499;68:1694" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1681": { + "id": "I213:7499;68:1681", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.397499084472656, + "childrenIds": [], + "parentId": "I213:7499;68:1680" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1684": { + "id": "I213:7499;68:1684", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.655625343322754, + "childrenIds": [], + "parentId": "I213:7499;68:1683" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1696": { + "id": "I213:7499;68:1696", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "clipPath461", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I213:7499;68:1697" + ], + "parentId": "I213:7499;68:1695" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1698": { + "id": "I213:7499;68:1698", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.047109603881836, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g457", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.06243896484375, + "childrenIds": [ + "I213:7499;68:1699", + "I213:7499;68:1701" + ], + "parentId": "I213:7499;68:1695" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1697": { + "id": "I213:7499;68:1697", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path459", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.800000011920929, + "strokes": [], + "visible": true, + "width": 16, + "childrenIds": [], + "parentId": "I213:7499;68:1696" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1699": { + "id": "I213:7499;68:1699", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.324453353881836, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g463", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.06243896484375, + "childrenIds": [ + "I213:7499;68:1700" + ], + "parentId": "I213:7499;68:1698" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1701": { + "id": "I213:7499;68:1701", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.0416259765625, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g467", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.0624361038208, + "childrenIds": [ + "I213:7499;68:1702" + ], + "parentId": "I213:7499;68:1698" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1700": { + "id": "I213:7499;68:1700", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.324453353881836, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path465", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0.800000011920929, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 15.06243896484375, + "childrenIds": [], + "parentId": "I213:7499;68:1699" + }, + "extra": {}, + "fieldErrors": {} + }, + "I213:7499;68:1702": { + "id": "I213:7499;68:1702", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.0416259765625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path469", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0.800000011920929, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 15.0624361038208, + "childrenIds": [], + "parentId": "I213:7499;68:1701" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:10:643", + "name": "containerBackground" + }, + { + "id": "VariableID:10:644", + "name": "border" + }, + { + "id": "VariableID:10:641", + "name": "text" + }, + { + "id": "VariableID:171:6908", + "name": "primaryAccent" + }, + { + "id": "VariableID:171:5244", + "name": "gold" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-254-9f340b6a10.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-254-9f340b6a10.json new file mode 100644 index 0000000..eaba728 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-254-9f340b6a10.json @@ -0,0 +1,16546 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-254-9f340b6a10", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 109" + }, + "request": { + "rootId": "277:19369" + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "277:19369" + ], + "nodes": { + "277:19369": { + "id": "277:19369", + "type": "SECTION", + "fields": { + "name": "location", + "childrenIds": [ + "277:17529" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17529": { + "id": "277:17529", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 1702, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Desktop", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "277:17530", + "277:17531", + "277:17554", + "277:17555", + "277:17556" + ], + "parentId": "277:19369" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17530": { + "id": "277:17530", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "4076983ed3c0dea3155b4af4ec695ec542634399", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.3123779892921448, + 0.46091413497924805 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0, + "g": 0, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0, + "g": 0, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 6.123234262925839E-17, + 1, + 0 + ], + [ + -1, + 6.123234262925839E-17, + 1 + ] + ], + "opacity": 0.699999988079071, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 400, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 84, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "PageHeader", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 84, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "I277:17530;213:7257" + ], + "parentId": "277:17529" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17531": { + "id": "277:17531", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:643" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 950, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 60, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 120, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 60, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "section 1", + "opacity": 1, + "paddingBottom": 120, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "277:17532", + "277:17536" + ], + "parentId": "277:17529" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17554": { + "id": "277:17554", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.149038165807724, + "g": 0.149038165807724, + "r": 0.149038165807724 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 352, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 60, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "footer", + "opacity": 1, + "paddingBottom": 60, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 60, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "childrenIds": [ + "I277:17554;68:1654" + ], + "parentId": "277:17529" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17555": { + "id": "277:17555", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "clipsContent": true, + "constraints": { + "horizontal": "MAX", + "vertical": "CENTER" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.25, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 20, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + }, + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 10, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.15383313596248627, + "g": 0.22511640191078186, + "r": 0.318910151720047 + }, + "opacity": 0.8999999761581421, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 424, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "ABSOLUTE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "FloatingButton", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.5, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "visible": true, + "width": 100, + "x": 1770, + "childrenIds": [ + "I277:17555;171:5150" + ], + "parentId": "277:17529" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17556": { + "id": "277:17556", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 600, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 600, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "header", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "reactions": [ + { + "action": { + "destinationId": "34:2647", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 1.2000000476837158, + "easing": { + "type": "LINEAR" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "34:2647", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 1.2000000476837158, + "easing": { + "type": "LINEAR" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_CLICK" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1920, + "x": 0, + "y": 0, + "childrenIds": [ + "I277:17556;34:2569", + "I277:17556;34:2579" + ], + "parentId": "277:17529" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7257": { + "id": "I277:17530;213:7257", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 134, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 562", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "I277:17530;213:7258", + "I277:17530;213:7259" + ], + "parentId": "277:17530" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17532": { + "id": "277:17532", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 571", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "277:17533", + "277:17534", + "277:17535" + ], + "parentId": "277:17531" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17536": { + "id": "277:17536", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 640, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 80, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 643", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "277:17537" + ], + "parentId": "277:17531" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1654": { + "id": "I277:17554;68:1654", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 232, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "minHeight": null, + "minWidth": null, + "name": "Frame 526", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "I277:17554;68:1655", + "I277:17554;68:1674", + "I277:17554;68:1675" + ], + "parentId": "277:17554" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5150": { + "id": "I277:17555;171:5150", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 424, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 450", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [ + "I277:17555;171:5151", + "I277:17555;171:5156", + "I277:17555;171:5163", + "I277:17555;171:5169" + ], + "parentId": "277:17555" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2569": { + "id": "I277:17556;34:2569", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 443", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1143, + "childrenIds": [ + "I277:17556;50:2356", + "I277:17556;34:2571" + ], + "parentId": "277:17556" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2579": { + "id": "I277:17556;34:2579", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 444", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 297, + "childrenIds": [ + "I277:17556;34:2586", + "I277:17556;34:2580" + ], + "parentId": "277:17556" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258": { + "id": "I277:17530;213:7258", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 19, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "breadcurmb", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 207, + "childrenIds": [ + "I277:17530;213:7258;50:1756", + "I277:17530;213:7258;50:1757", + "I277:17530;213:7258;50:1761", + "I277:17530;213:7258;50:1763", + "I277:17530;213:7258;50:1765" + ], + "parentId": "I277:17530;213:7257" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7259": { + "id": "I277:17530;213:7259", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "LOCATION", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Playfair Display", + "style": "Bold" + }, + "fontSize": 64, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 85, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Title", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "LOCATION", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Playfair Display", + "style": "Bold" + }, + "fontSize": 64, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": 0 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:cca59f87ffdc9e6e157e35d40d94b328c40a0548," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 337, + "childrenIds": [], + "parentId": "I277:17530;213:7257" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17533": { + "id": "277:17533", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 3", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 116, + "childrenIds": [ + "I277:17533;54:2460" + ], + "parentId": "277:17532" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17534": { + "id": "277:17534", + "type": "ELLIPSE", + "fields": { + "arcData": { + "endingAngle": 6.2831854820251465, + "innerRadius": 0, + "startingAngle": 0 + }, + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Ellipse 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "277:17532" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17535": { + "id": "277:17535", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 70, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Tab", + "opacity": 1, + "paddingBottom": 20, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 20, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 3, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 90, + "childrenIds": [ + "I277:17535;54:2462" + ], + "parentId": "277:17532" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17537": { + "id": "277:17537", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 640, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 501", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "277:17538" + ], + "parentId": "277:17536" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1655": { + "id": "I277:17554;68:1655", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 30, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 531", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "I277:17554;68:1656", + "I277:17554;68:1657" + ], + "parentId": "I277:17554;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1674": { + "id": "I277:17554;68:1674", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 1, + "isAsset": false, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 14", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "I277:17554;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1675": { + "id": "I277:17554;68:1675", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 136, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 529", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I277:17554;68:1676", + "I277:17554;68:1704" + ], + "parentId": "I277:17554;68:1654" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5151": { + "id": "I277:17555;171:5151", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 446", + "opacity": 1, + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [ + "I277:17555;171:5152", + "I277:17555;171:5155" + ], + "parentId": "I277:17555;171:5150" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5156": { + "id": "I277:17555;171:5156", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 447", + "opacity": 1, + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 100, + "childrenIds": [ + "I277:17555;171:5157", + "I277:17555;171:5162" + ], + "parentId": "I277:17555;171:5150" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5163": { + "id": "I277:17555;171:5163", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 448", + "opacity": 1, + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 98, + "childrenIds": [ + "I277:17555;171:5164", + "I277:17555;171:5168" + ], + "parentId": "I277:17555;171:5150" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5169": { + "id": "I277:17555;171:5169", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 449", + "opacity": 1, + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 98, + "childrenIds": [ + "I277:17555;171:5170", + "I277:17555;171:5177" + ], + "parentId": "I277:17555;171:5150" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;50:2356": { + "id": "I277:17556;50:2356", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 565", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 300, + "childrenIds": [ + "I277:17556;133:9956" + ], + "parentId": "I277:17556;34:2569" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2571": { + "id": "I277:17556;34:2571", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 442", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 843, + "childrenIds": [ + "I277:17556;34:2573", + "I277:17556;34:2574", + "I277:17556;34:2575", + "I277:17556;34:2576", + "I277:17556;34:2577", + "I277:17556;34:2578" + ], + "parentId": "I277:17556;34:2569" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2586": { + "id": "I277:17556;34:2586", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 0, + "strokeLeftWeight": 1, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 139, + "childrenIds": [ + "I277:17556;34:2587", + "I277:17556;34:2600" + ], + "parentId": "I277:17556;34:2579" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2580": { + "id": "I277:17556;34:2580", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 0, + "strokeLeftWeight": 1, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 158, + "childrenIds": [ + "I277:17556;34:2581", + "I277:17556;34:2585" + ], + "parentId": "I277:17556;34:2579" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1756": { + "id": "I277:17530;213:7258;50:1756", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 19, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 561", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 43, + "childrenIds": [ + "I277:17530;213:7258;50:1750", + "I277:17530;213:7258;50:1754" + ], + "parentId": "I277:17530;213:7258" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1757": { + "id": "I277:17530;213:7258;50:1757", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 5, + "paddingRight": 5, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17530;213:7258;50:1759" + ], + "parentId": "I277:17530;213:7258" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1761": { + "id": "I277:17530;213:7258;50:1761", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "소개", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Depth 1", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "소개", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:da240f2f70f3e4531438c635e8155554c9c9d0f7," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 30, + "childrenIds": [], + "parentId": "I277:17530;213:7258" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1763": { + "id": "I277:17530;213:7258;50:1763", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2, + "paddingLeft": 5, + "paddingRight": 5, + "paddingTop": 2, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 2", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17530;213:7258;50:1764" + ], + "parentId": "I277:17530;213:7258" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1765": { + "id": "I277:17530;213:7258;50:1765", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "오시는 길", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Depth 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "오시는 길", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:da240f2f70f3e4531438c635e8155554c9c9d0f7," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 62, + "childrenIds": [], + "parentId": "I277:17530;213:7258" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17533;54:2460": { + "id": "I277:17533;54:2460", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "공연 및 경연장", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "공연 및 경연장", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 20, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:e687bd52bd0aa299c4f22136f8355dfb11adc5b5," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 116, + "childrenIds": [], + "parentId": "277:17533" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17535;54:2462": { + "id": "I277:17535;54:2462", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "조직위원회", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "조직위원장", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "조직위원회", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 20, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:4078465cecdee1d3afc8edc86a7904e4cc447d34," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 90, + "childrenIds": [], + "parentId": "277:17535" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17538": { + "id": "277:17538", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 640, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 638", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [ + "277:17539", + "277:17540", + "277:17541", + "277:17542", + "277:17543", + "277:17544", + "277:17545", + "277:17546", + "277:17547", + "277:17548" + ], + "parentId": "277:17537" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1656": { + "id": "I277:17554;68:1656", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "로고 영역", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "NanumMyeongjo", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 35, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "로고 영역", + "opacity": 0.5, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "로고 영역", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "NanumMyeongjo", + "style": "Bold" + }, + "fontSize": 28, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "" + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 110, + "childrenIds": [], + "parentId": "I277:17554;68:1655" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1657": { + "id": "I277:17554;68:1657", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 535", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 120, + "childrenIds": [ + "I277:17554;77:2677", + "I277:17554;77:2725", + "I277:17554;77:2764" + ], + "parentId": "I277:17554;68:1655" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1676": { + "id": "I277:17554;68:1676", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 88, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 530", + "opacity": 0.800000011920929, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I277:17554;68:1677", + "I277:17554;68:1686", + "I277:17554;68:1692" + ], + "parentId": "I277:17554;68:1675" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1704": { + "id": "I277:17554;68:1704", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "opacity": 0.6000000238418579, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "COPYRIGHT ⓒ제주국제관악제. ALL RIGHTS RESERVED.", + "end": 40, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 379, + "childrenIds": [], + "parentId": "I277:17554;68:1675" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5152": { + "id": "I277:17555;171:5152", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "search_4203984 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "I277:17555;171:5153" + ], + "parentId": "I277:17555;171:5151" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5155": { + "id": "I277:17555;171:5155", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "통합검색", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "통합검색", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "통합검색", + "end": 4, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:af2c2d451afbf61b90185abd8ec740962e11662c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 55, + "childrenIds": [], + "parentId": "I277:17555;171:5151" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5157": { + "id": "I277:17555;171:5157", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "ticket_18765939 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "I277:17555;171:5158", + "I277:17555;171:5159", + "I277:17555;171:5160", + "I277:17555;171:5161" + ], + "parentId": "I277:17555;171:5156" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5162": { + "id": "I277:17555;171:5162", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "신청/예매", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "신청/예매", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "신청/예매", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:af2c2d451afbf61b90185abd8ec740962e11662c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 60, + "childrenIds": [], + "parentId": "I277:17555;171:5156" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5164": { + "id": "I277:17555;171:5164", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "calendar_3239948 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "I277:17555;171:5165" + ], + "parentId": "I277:17555;171:5163" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5168": { + "id": "I277:17555;171:5168", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "전체 일정", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "전체 일정", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "전체 일정", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:af2c2d451afbf61b90185abd8ec740962e11662c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 58, + "childrenIds": [], + "parentId": "I277:17555;171:5163" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5170": { + "id": "I277:17555;171:5170", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "location_847372 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 28, + "childrenIds": [ + "I277:17555;171:5171", + "I277:17555;171:5174" + ], + "parentId": "I277:17555;171:5169" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5177": { + "id": "I277:17555;171:5177", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "오시는 길", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 18, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "오시는 길", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "오시는 길", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 15, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:af2c2d451afbf61b90185abd8ec740962e11662c," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 58, + "childrenIds": [], + "parentId": "I277:17555;171:5169" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9956": { + "id": "I277:17556;133:9956", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 45.99993133544922, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group 30", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 415.9013671875, + "y": 81.02861785888672 + }, + "visible": true, + "width": 236.107421875, + "childrenIds": [ + "I277:17556;133:9957", + "I277:17556;133:9978" + ], + "parentId": "I277:17556;50:2356" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2573": { + "id": "I277:17556;34:2573", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 4, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 113, + "childrenIds": [ + "I277:17556;34:2573;50:2387" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2574": { + "id": "I277:17556;34:2574", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 167, + "childrenIds": [ + "I277:17556;34:2574;7:129" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2575": { + "id": "I277:17556;34:2575", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 192, + "childrenIds": [ + "I277:17556;34:2575;7:129" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2576": { + "id": "I277:17556;34:2576", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 129, + "childrenIds": [ + "I277:17556;34:2576;7:129" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2577": { + "id": "I277:17556;34:2577", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 129, + "childrenIds": [ + "I277:17556;34:2577;7:129" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2578": { + "id": "I277:17556;34:2578", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "menu", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 113, + "childrenIds": [ + "I277:17556;34:2578;7:129" + ], + "parentId": "I277:17556;34:2571" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2587": { + "id": "I277:17556;34:2587", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "globe_18165265 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "I277:17556;34:2588", + "I277:17556;34:2589", + "I277:17556;34:2590", + "I277:17556;34:2591", + "I277:17556;34:2592", + "I277:17556;34:2593", + "I277:17556;34:2594", + "I277:17556;34:2595", + "I277:17556;34:2596", + "I277:17556;34:2597", + "I277:17556;34:2598", + "I277:17556;34:2599" + ], + "parentId": "I277:17556;34:2586" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2600": { + "id": "I277:17556;34:2600", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "한국어", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "한국어", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "한국어", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 49, + "childrenIds": [], + "parentId": "I277:17556;34:2586" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2581": { + "id": "I277:17556;34:2581", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "tickets_785683 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "I277:17556;34:2582" + ], + "parentId": "I277:17556;34:2580" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2585": { + "id": "I277:17556;34:2585", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "참가 신청", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "참가 신청", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "참가 신청", + "end": 5, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 68, + "childrenIds": [], + "parentId": "I277:17556;34:2580" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1750": { + "id": "I277:17530;213:7258;50:1750", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 18, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.8613268733024597, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0.8630860447883606, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "home-button_9073161 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 18, + "childrenIds": [ + "I277:17530;213:7258;50:1751" + ], + "parentId": "I277:17530;213:7258;50:1756" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1754": { + "id": "I277:17530;213:7258;50:1754", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "홈", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 19, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "홈", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "홈", + "end": 1, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:da240f2f70f3e4531438c635e8155554c9c9d0f7," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 15, + "childrenIds": [], + "parentId": "I277:17530;213:7258;50:1756" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1759": { + "id": "I277:17530;213:7258;50:1759", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 12, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 8", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "I277:17530;213:7258;50:1757" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1764": { + "id": "I277:17530;213:7258;50:1764", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 12, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector 8", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6, + "childrenIds": [], + "parentId": "I277:17530;213:7258;50:1763" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17539": { + "id": "277:17539", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "41161089f7ed48e103409ba56d4ae5c186193221", + "imageTransform": [ + [ + 0.8277602195739746, + 0, + 0.07187990099191666 + ], + [ + 0, + 0.7760251760482788, + 0.04593859612941742 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 640, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "image 22", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "childrenIds": [], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17540": { + "id": "277:17540", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 570, + "y": 80, + "childrenIds": [ + "I277:17540;209:7929", + "I277:17540;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17541": { + "id": "277:17541", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 1019, + "y": 131, + "childrenIds": [ + "I277:17541;209:7929", + "I277:17541;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17542": { + "id": "277:17542", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 266, + "y": 203, + "childrenIds": [ + "I277:17542;209:7929", + "I277:17542;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17543": { + "id": "277:17543", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 660, + "y": 413, + "childrenIds": [ + "I277:17543;209:7929", + "I277:17543;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17544": { + "id": "277:17544", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 540, + "y": 85, + "childrenIds": [ + "I277:17544;209:7929", + "I277:17544;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17545": { + "id": "277:17545", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 558, + "y": 125, + "childrenIds": [ + "I277:17545;209:7929", + "I277:17545;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17546": { + "id": "277:17546", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 690, + "y": 74, + "childrenIds": [ + "I277:17546;209:7929", + "I277:17546;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17547": { + "id": "277:17547", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.30000001192092896, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 10, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": false, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "MapPin", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [ + { + "action": { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + }, + "actions": [ + { + "destinationId": "277:19378", + "navigation": "CHANGE_TO", + "resetVideoPosition": false, + "transition": { + "duration": 0.30000001192092896, + "easing": { + "type": "EASE_OUT" + }, + "type": "SMART_ANIMATE" + }, + "type": "NODE" + } + ], + "trigger": { + "type": "ON_HOVER" + } + } + ], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 46, + "x": 593, + "y": 97, + "childrenIds": [ + "I277:17547;209:7929", + "I277:17547;209:7961" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17548": { + "id": "277:17548", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "CENTER", + "vertical": "MIN" + }, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "a": 0.15000000596046448, + "b": 0, + "g": 0, + "r": 0 + }, + "offset": { + "x": 0, + "y": 4 + }, + "radius": 8, + "showShadowBehindNode": false, + "spread": 0, + "type": "DROP_SHADOW", + "visible": true + } + ], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 49, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "ABSOLUTE", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 646", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 540, + "y": 16, + "childrenIds": [ + "277:17549", + "277:17550", + "277:17551", + "277:17552" + ], + "parentId": "277:17538" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2677": { + "id": "I277:17554;77:2677", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.45098039507865906, + "g": 0.8588235378265381, + "r": 1 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.30588236451148987, + "g": 0.6784313917160034, + "r": 0.9921568632125854 + }, + "position": 0.07999999821186066 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18039216101169586, + "g": 0.5137255191802979, + "r": 0.9843137264251709 + }, + "position": 0.15000000596046448 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.12941177189350128, + "g": 0.45098039507865906, + "r": 0.9803921580314636 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.18431372940540314, + "g": 0.4117647111415863, + "r": 0.9647058844566345 + }, + "position": 0.23000000417232513 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3529411852359772, + "g": 0.29019609093666077, + "r": 0.9098039269447327 + }, + "position": 0.3700000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.4588235318660736, + "g": 0.21176470816135406, + "r": 0.8784313797950745 + }, + "position": 0.47999998927116394 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.49803921580314636, + "g": 0.18431372940540314, + "r": 0.8666666746139526 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5921568870544434, + "g": 0.239215686917305, + "r": 0.7058823704719543 + }, + "position": 0.6800000071525574 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8313725590705872, + "g": 0.3764705955982208, + "r": 0.3019607961177826 + }, + "position": 0.9700000286102295 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8588235378265381, + "g": 0.3921568691730499, + "r": 0.25882354378700256 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + -0.2444278746843338, + -0.8524705171585083, + 1.048449158668518 + ], + [ + 0.8524705171585083, + -0.2444278746843338, + 0.19597867131233215 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "instagram_15713420 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I277:17554;77:2678", + "I277:17554;77:2679", + "I277:17554;77:2680" + ], + "parentId": "I277:17554;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2725": { + "id": "I277:17554;77:2725", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "facebook_1384053 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 682.6666870117188, + "y": 682.6666870117188 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I277:17554;77:2726", + "I277:17554;77:2727" + ], + "parentId": "I277:17554;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2764": { + "id": "I277:17554;77:2764", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 4, + "bottomRightRadius": 4, + "clipsContent": true, + "cornerRadius": 4, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "youtube_3991722 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 4, + "topRightRadius": 4, + "visible": true, + "width": 32, + "childrenIds": [ + "I277:17554;77:2765" + ], + "parentId": "I277:17554;68:1657" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1677": { + "id": "I277:17554;68:1677", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 527", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 481, + "childrenIds": [ + "I277:17554;68:1678", + "I277:17554;68:1685" + ], + "parentId": "I277:17554;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1686": { + "id": "I277:17554;68:1686", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 528", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 293, + "childrenIds": [ + "I277:17554;68:1687", + "I277:17554;68:1690", + "I277:17554;68:1691" + ], + "parentId": "I277:17554;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1692": { + "id": "I277:17554;68:1692", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": false, + "cornerRadius": 0, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": false, + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 529", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 221, + "childrenIds": [ + "I277:17554;68:1693", + "I277:17554;68:1703" + ], + "parentId": "I277:17554;68:1676" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5153": { + "id": "I277:17555;171:5153", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.997966766357422, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 28.000003814697266, + "childrenIds": [ + "I277:17555;171:5154" + ], + "parentId": "I277:17555;171:5152" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5158": { + "id": "I277:17555;171:5158", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.972986221313477, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 27.99759292602539, + "childrenIds": [], + "parentId": "I277:17555;171:5157" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5159": { + "id": "I277:17555;171:5159", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.2972183227539062, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 3.2974374294281006, + "childrenIds": [], + "parentId": "I277:17555;171:5157" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5160": { + "id": "I277:17555;171:5160", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.551968574523926, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.552187919616699, + "childrenIds": [], + "parentId": "I277:17555;171:5157" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5161": { + "id": "I277:17555;171:5161", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.2972192764282227, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 3.297438383102417, + "childrenIds": [], + "parentId": "I277:17555;171:5157" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5165": { + "id": "I277:17555;171:5165", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 26.962982177734375, + "childrenIds": [ + "I277:17555;171:5166" + ], + "parentId": "I277:17555;171:5164" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5171": { + "id": "I277:17555;171:5171", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 23.44562339782715, + "childrenIds": [ + "I277:17555;171:5172" + ], + "parentId": "I277:17555;171:5170" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5174": { + "id": "I277:17555;171:5174", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8.147344589233398, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 8.147343635559082, + "childrenIds": [ + "I277:17555;171:5175" + ], + "parentId": "I277:17555;171:5170" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9957": { + "id": "I277:17556;133:9957", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 46.00004959106445, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 236.10748291015625, + "childrenIds": [ + "I277:17556;133:9958", + "I277:17556;133:9959", + "I277:17556;133:9960", + "I277:17556;133:9961", + "I277:17556;133:9962", + "I277:17556;133:9963", + "I277:17556;133:9964", + "I277:17556;133:9965", + "I277:17556;133:9966", + "I277:17556;133:9967", + "I277:17556;133:9968", + "I277:17556;133:9969", + "I277:17556;133:9970", + "I277:17556;133:9971", + "I277:17556;133:9972", + "I277:17556;133:9973", + "I277:17556;133:9974", + "I277:17556;133:9975", + "I277:17556;133:9976", + "I277:17556;133:9977" + ], + "parentId": "I277:17556;133:9956" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9978": { + "id": "I277:17556;133:9978", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8.939447402954102, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Jeju International Wind Ensemble Festival", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 178.90097045898438, + "childrenIds": [], + "parentId": "I277:17556;133:9956" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2573;50:2387": { + "id": "I277:17556;34:2573;50:2387", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "소개", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "소개", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 33, + "childrenIds": [], + "parentId": "I277:17556;34:2573" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2574;7:129": { + "id": "I277:17556;34:2574;7:129", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "일정 및 예매", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "일정 및 예매", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 87, + "childrenIds": [], + "parentId": "I277:17556;34:2574" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2575;7:129": { + "id": "I277:17556;34:2575;7:129", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "제주국제관악제", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "제주국제관악제", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 112, + "childrenIds": [], + "parentId": "I277:17556;34:2575" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2576;7:129": { + "id": "I277:17556;34:2576;7:129", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "콩쿠르", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "콩쿠르", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 49, + "childrenIds": [], + "parentId": "I277:17556;34:2576" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2577;7:129": { + "id": "I277:17556;34:2577;7:129", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "갤러리", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "갤러리", + "end": 3, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 49, + "childrenIds": [], + "parentId": "I277:17556;34:2577" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2578;7:129": { + "id": "I277:17556;34:2578;7:129", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "소식", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "텍스트", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "소식", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Medium" + }, + "fontSize": 18, + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -4 + }, + "lineHeight": { + "unit": "AUTO" + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:b9b47b913dbbffc206de7eaa3fe185f78b83909e," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 33, + "childrenIds": [], + "parentId": "I277:17556;34:2578" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2588": { + "id": "I277:17556;34:2588", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.2199997901916504, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.0799994468688965, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2589": { + "id": "I277:17556;34:2589", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.220001220703125, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.080000400543213, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2590": { + "id": "I277:17556;34:2590", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.940000057220459, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.980000019073486, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2591": { + "id": "I277:17556;34:2591", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.2199997901916504, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.0799994468688965, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2592": { + "id": "I277:17556;34:2592", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.419999599456787, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 5.060000419616699, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2593": { + "id": "I277:17556;34:2593", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.419999599456787, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 5.060000419616699, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2594": { + "id": "I277:17556;34:2594", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.3199996948242188, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 6.319998741149902, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2595": { + "id": "I277:17556;34:2595", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.320000171661377, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 6.299999237060547, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2596": { + "id": "I277:17556;34:2596", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.93999981880188, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 5, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2597": { + "id": "I277:17556;34:2597", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.2200000286102295, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.080000400543213, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2598": { + "id": "I277:17556;34:2598", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.420000076293945, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 5.059999465942383, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2599": { + "id": "I277:17556;34:2599", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.419999599456787, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 5.060000419616699, + "childrenIds": [], + "parentId": "I277:17556;34:2587" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2582": { + "id": "I277:17556;34:2582", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "I277:17556;34:2583" + ], + "parentId": "I277:17556;34:2581" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1751": { + "id": "I277:17530;213:7258;50:1751", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer_2_00000008110966642969673030000014418892031612672181_", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 18.001651763916016, + "childrenIds": [ + "I277:17530;213:7258;50:1752" + ], + "parentId": "I277:17530;213:7258;50:1750" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7929": { + "id": "I277:17540;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17540" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7961": { + "id": "I277:17540;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17540;209:7962" + ], + "parentId": "277:17540" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7929": { + "id": "I277:17541;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8368" + } + }, + "color": { + "b": 0.2031760811805725, + "g": 0.5464741587638855, + "r": 0.2832789123058319 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17541" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7961": { + "id": "I277:17541;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17541;209:7962" + ], + "parentId": "277:17541" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7929": { + "id": "I277:17542;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8368" + } + }, + "color": { + "b": 0.2031760811805725, + "g": 0.5464741587638855, + "r": 0.2832789123058319 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17542" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7961": { + "id": "I277:17542;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17542;209:7962" + ], + "parentId": "277:17542" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7929": { + "id": "I277:17543;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17543" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7961": { + "id": "I277:17543;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17543;209:7962" + ], + "parentId": "277:17543" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7929": { + "id": "I277:17544;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8368" + } + }, + "color": { + "b": 0.2031760811805725, + "g": 0.5464741587638855, + "r": 0.2832789123058319 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17544" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7961": { + "id": "I277:17544;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17544;209:7962" + ], + "parentId": "277:17544" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7929": { + "id": "I277:17545;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8369" + } + }, + "color": { + "b": 0.5010863542556763, + "g": 0.21851886808872223, + "r": 0.7836538553237915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17545" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7961": { + "id": "I277:17545;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17545;209:7962" + ], + "parentId": "277:17545" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7929": { + "id": "I277:17546;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8369" + } + }, + "color": { + "b": 0.5010863542556763, + "g": 0.21851886808872223, + "r": 0.7836538553237915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17546" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7961": { + "id": "I277:17546;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17546;209:7962" + ], + "parentId": "277:17546" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7929": { + "id": "I277:17547;209:7929", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 57, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.30000001192092896, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 46, + "childrenIds": [], + "parentId": "277:17547" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7961": { + "id": "I277:17547;209:7961", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "clipsContent": true, + "cornerRadius": 1000, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 30, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Frame 645", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 30, + "childrenIds": [ + "I277:17547;209:7962" + ], + "parentId": "277:17547" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17549": { + "id": "277:17549", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 47, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 7", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 30, + "paddingRight": 30, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 100, + "childrenIds": [ + "I277:17549;209:8055" + ], + "parentId": "277:17548" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17550": { + "id": "277:17550", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:643" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 49, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 6", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 120, + "childrenIds": [ + "I277:17550;209:8082", + "I277:17550;209:8051" + ], + "parentId": "277:17548" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17551": { + "id": "277:17551", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:643" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 49, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 8", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 150, + "childrenIds": [ + "I277:17551;209:8082", + "I277:17551;209:8051" + ], + "parentId": "277:17548" + }, + "extra": {}, + "fieldErrors": {} + }, + "277:17552": { + "id": "277:17552", + "type": "INSTANCE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 10, + "bottomRightRadius": 10, + "clipsContent": false, + "cornerRadius": 10, + "counterAxisAlignItems": "CENTER", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:643" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 49, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Component 9", + "opacity": 1, + "paddingBottom": 10, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 10, + "primaryAxisAlignItems": "CENTER", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:644" + } + }, + "color": { + "b": 0.8480873703956604, + "g": 0.8742666244506836, + "r": 0.8894230723381042 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 10, + "topRightRadius": 10, + "visible": true, + "width": 140, + "childrenIds": [ + "I277:17552;209:8082", + "I277:17552;209:8051" + ], + "parentId": "277:17548" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2678": { + "id": "I277:17554;77:2678", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 21.473751068115234, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 21.582500457763672, + "childrenIds": [], + "parentId": "I277:17554;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2679": { + "id": "I277:17554;77:2679", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.108752250671387, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 11.108752250671387, + "childrenIds": [], + "parentId": "I277:17554;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2680": { + "id": "I277:17554;77:2680", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 2.6337499618530273, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 2.6337509155273438, + "childrenIds": [], + "parentId": "I277:17554;77:2677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2726": { + "id": "I277:17554;77:2726", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.40392157435417175, + "r": 0.25882354378700256 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "I277:17554;77:2725" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2727": { + "id": "I277:17554;77:2727", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.167238235473633, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.3333333730697632, + "strokes": [], + "visible": true, + "width": 14.093750953674316, + "childrenIds": [], + "parentId": "I277:17554;77:2725" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2765": { + "id": "I277:17554;77:2765", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer 2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "I277:17554;77:2766" + ], + "parentId": "I277:17554;77:2764" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1678": { + "id": "I277:17554;68:1678", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "location_847372 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1679", + "I277:17554;68:1682" + ], + "parentId": "I277:17554;68:1677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1685": { + "id": "I277:17554;68:1685", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "63196 제주특별자치도 제주시 동광로 51, 3층 제주국제관악조직위원회", + "end": 40, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 453, + "childrenIds": [], + "parentId": "I277:17554;68:1677" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1687": { + "id": "I277:17554;68:1687", + "type": "FRAME", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "counterAxisSpacing": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "gridColumnAnchorIndex": -1, + "gridColumnCount": 0, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "telephone_3095610 1", + "opacity": 1, + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1688" + ], + "parentId": "I277:17554;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1690": { + "id": "I277:17554;68:1690", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Tel. 064-722-8704", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Tel. 064-722-8704", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Tel. 064-722-8704", + "end": 17, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 125, + "childrenIds": [], + "parentId": "I277:17554;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1691": { + "id": "I277:17554;68:1691", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "Fax. 064-753-2208", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Fax. 064-753-2208", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "Fax. 064-753-2208", + "end": 17, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 128, + "childrenIds": [], + "parentId": "I277:17554;68:1686" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1693": { + "id": "I277:17554;68:1693", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": true, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g453", + "opacity": 1, + "reactions": [], + "rotation": 0, + "targetAspectRatio": { + "x": 23.999998092651367, + "y": 23.999998092651367 + }, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1694" + ], + "parentId": "I277:17554;68:1692" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1703": { + "id": "I277:17554;68:1703", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "bandfestival@hanmail.net\r", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 24, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "bandfestival@hanmail.net", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "bandfestival@hanmail.net\r", + "end": 25, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:25557e24c16e64a16d54b5feaa0433a2c5201551," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 193, + "childrenIds": [], + "parentId": "I277:17554;68:1692" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5154": { + "id": "I277:17555;171:5154", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27.997966766357422, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 16, + "strokes": [], + "visible": true, + "width": 28.000003814697266, + "childrenIds": [], + "parentId": "I277:17555;171:5153" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5166": { + "id": "I277:17555;171:5166", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 26.962982177734375, + "childrenIds": [ + "I277:17555;171:5167" + ], + "parentId": "I277:17555;171:5165" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5172": { + "id": "I277:17555;171:5172", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 23.44562339782715, + "childrenIds": [ + "I277:17555;171:5173" + ], + "parentId": "I277:17555;171:5171" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5175": { + "id": "I277:17555;171:5175", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8.147344589233398, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 8.147343635559082, + "childrenIds": [ + "I277:17555;171:5176" + ], + "parentId": "I277:17555;171:5174" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9958": { + "id": "I277:17556;133:9958", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20.196331024169922, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path945", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 28.365982055664062, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9959": { + "id": "I277:17556;133:9959", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path947", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 26.818378448486328, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9960": { + "id": "I277:17556;133:9960", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.909249305725098, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path949", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 26.10413360595703, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9961": { + "id": "I277:17556;133:9961", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 25.178619384765625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path951", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 14.187540054321289, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9962": { + "id": "I277:17556;133:9962", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.311651229858398, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path953", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 16.64026641845703, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9963": { + "id": "I277:17556;133:9963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path955", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 8.456875801086426, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9964": { + "id": "I277:17556;133:9964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path957", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.466522693634033, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9965": { + "id": "I277:17556;133:9965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 25.178619384765625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path959", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 14.187540054321289, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9966": { + "id": "I277:17556;133:9966", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path961", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 8.461868286132812, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9967": { + "id": "I277:17556;133:9967", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path963", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.46649169921875, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9968": { + "id": "I277:17556;133:9968", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 25.178619384765625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path965", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 14.187540054321289, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9969": { + "id": "I277:17556;133:9969", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path967", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 8.461868286132812, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9970": { + "id": "I277:17556;133:9970", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 26.949880599975586, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path969", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 5.46649169921875, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9971": { + "id": "I277:17556;133:9971", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 15.966085433959961, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path971", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 10.254087448120117, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9972": { + "id": "I277:17556;133:9972", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 9.628137588500977, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path973", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 26.743497848510742, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9973": { + "id": "I277:17556;133:9973", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 9.076457023620605, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path975", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 25.66179847717285, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9974": { + "id": "I277:17556;133:9974", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 9.544029235839844, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path977", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 22.984329223632812, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9975": { + "id": "I277:17556;133:9975", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8.221173286437988, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.856213569641113, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9976": { + "id": "I277:17556;133:9976", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 7.246831893920898, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 9.555171012878418, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;133:9977": { + "id": "I277:17556;133:9977", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 46.000213623046875, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 28.92829704284668, + "childrenIds": [], + "parentId": "I277:17556;133:9957" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2583": { + "id": "I277:17556;34:2583", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 20, + "childrenIds": [ + "I277:17556;34:2584" + ], + "parentId": "I277:17556;34:2582" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1752": { + "id": "I277:17530;213:7258;50:1752", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Layer_1-2", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 18.001651763916016, + "childrenIds": [ + "I277:17530;213:7258;50:1753" + ], + "parentId": "I277:17530;213:7258;50:1751" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7962": { + "id": "I277:17540;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17540;209:7963", + "I277:17540;209:7964", + "I277:17540;209:7965" + ], + "parentId": "I277:17540;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7962": { + "id": "I277:17541;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17541;209:7963", + "I277:17541;209:7964", + "I277:17541;209:7965" + ], + "parentId": "I277:17541;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7962": { + "id": "I277:17542;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17542;209:7963", + "I277:17542;209:7964", + "I277:17542;209:7965" + ], + "parentId": "I277:17542;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7962": { + "id": "I277:17543;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17543;209:7963", + "I277:17543;209:7964", + "I277:17543;209:7965" + ], + "parentId": "I277:17543;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7962": { + "id": "I277:17544;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17544;209:7963", + "I277:17544;209:7964", + "I277:17544;209:7965" + ], + "parentId": "I277:17544;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7962": { + "id": "I277:17545;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17545;209:7963", + "I277:17545;209:7964", + "I277:17545;209:7965" + ], + "parentId": "I277:17545;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7962": { + "id": "I277:17546;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17546;209:7963", + "I277:17546;209:7964", + "I277:17546;209:7965" + ], + "parentId": "I277:17546;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7962": { + "id": "I277:17547;209:7962", + "type": "BOOLEAN_OPERATION", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:5244" + } + }, + "color": { + "b": 0.30288460850715637, + "g": 0.6394230723381042, + "r": 0.807692289352417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.00092315673828, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Union", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0, + "strokes": [], + "visible": true, + "width": 14, + "childrenIds": [ + "I277:17547;209:7963", + "I277:17547;209:7964", + "I277:17547;209:7965" + ], + "parentId": "I277:17547;209:7961" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17549;209:8055": { + "id": "I277:17549;209:8055", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "전체", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 27, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "전체", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "전체", + "end": 2, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Bold" + }, + "fontSize": 16, + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 170.00000476837158 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:f212c236f8ecb48fa3acd80695f2462fa1a80282," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 30, + "childrenIds": [], + "parentId": "277:17549" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17550;209:8082": { + "id": "I277:17550;209:8082", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "cornerRadius": 1000, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:171:6908" + } + }, + "color": { + "b": 0.1003836914896965, + "g": 0.2665456235408783, + "r": 0.48557692766189575 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 31", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "277:17550" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17550;209:8051": { + "id": "I277:17550;209:8051", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "메인 공연장", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "전체", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "메인 공연장", + "end": 6, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 76, + "childrenIds": [], + "parentId": "277:17550" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17551;209:8082": { + "id": "I277:17551;209:8082", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "cornerRadius": 1000, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8368" + } + }, + "color": { + "b": 0.2031760811805725, + "g": 0.5464741587638855, + "r": 0.2832789123058319 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 31", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "277:17551" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17551;209:8051": { + "id": "I277:17551;209:8051", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "우리동네 관악제", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "전체", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "우리동네 관악제", + "end": 8, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 105, + "childrenIds": [], + "parentId": "277:17551" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17552;209:8082": { + "id": "I277:17552;209:8082", + "type": "RECTANGLE", + "fields": { + "blendMode": "PASS_THROUGH", + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "cornerRadius": 1000, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:209:8369" + } + }, + "color": { + "b": 0.5010863542556763, + "g": 0.21851886808872223, + "r": 0.7836538553237915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Rectangle 31", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [], + "targetAspectRatio": { + "x": 100, + "y": 100 + }, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 8, + "childrenIds": [], + "parentId": "277:17552" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17552;209:8051": { + "id": "I277:17552;209:8051", + "type": "TEXT", + "fields": { + "blendMode": "PASS_THROUGH", + "characters": "콩쿠르 경연장", + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 29, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "전체", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "strokes": [], + "styledTextSegments": [ + { + "characters": "콩쿠르 경연장", + "end": 7, + "fillStyleId": "", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:10:641" + } + }, + "color": { + "b": 0.11372549086809158, + "g": 0.125490203499794, + "r": 0.14509804546833038 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "Noto Sans KR", + "style": "Regular" + }, + "fontSize": 16, + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 179.99999523162842 + }, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textCase": "ORIGINAL", + "textDecoration": "NONE", + "textStyleId": "S:0714e91638efb392b8350fc7b736633442d95452," + } + ], + "textAlignHorizontal": "LEFT", + "textAlignVertical": "TOP", + "textAutoResize": "WIDTH_AND_HEIGHT", + "textTruncation": "DISABLED", + "visible": true, + "width": 90, + "childrenIds": [], + "parentId": "277:17552" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2766": { + "id": "I277:17554;77:2766", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "02.youtube", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 32, + "childrenIds": [ + "I277:17554;77:2767", + "I277:17554;77:2768" + ], + "parentId": "I277:17554;77:2765" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1679": { + "id": "I277:17554;68:1679", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.397499084472656, + "childrenIds": [ + "I277:17554;68:1680" + ], + "parentId": "I277:17554;68:1678" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1682": { + "id": "I277:17554;68:1682", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 4.655625343322754, + "childrenIds": [ + "I277:17554;68:1683" + ], + "parentId": "I277:17554;68:1678" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1688": { + "id": "I277:17554;68:1688", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13, + "childrenIds": [ + "I277:17554;68:1689" + ], + "parentId": "I277:17554;68:1687" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1694": { + "id": "I277:17554;68:1694", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g455", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1695" + ], + "parentId": "I277:17554;68:1693" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5167": { + "id": "I277:17555;171:5167", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1.583384394645691, + "strokes": [], + "visible": true, + "width": 26.962982177734375, + "childrenIds": [], + "parentId": "I277:17555;171:5166" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5173": { + "id": "I277:17555;171:5173", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 28, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 23.44562339782715, + "childrenIds": [], + "parentId": "I277:17555;171:5172" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17555;171:5176": { + "id": "I277:17555;171:5176", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 8.147344589233398, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 8.147343635559082, + "childrenIds": [], + "parentId": "I277:17555;171:5175" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17556;34:2584": { + "id": "I277:17556;34:2584", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 20, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 20, + "childrenIds": [], + "parentId": "I277:17556;34:2583" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17530;213:7258;50:1753": { + "id": "I277:17530;213:7258;50:1753", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16.27558708190918, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "_01.Home", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 18.001651763916016, + "childrenIds": [], + "parentId": "I277:17530;213:7258;50:1752" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7963": { + "id": "I277:17540;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17540;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7964": { + "id": "I277:17540;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17540;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17540;209:7965": { + "id": "I277:17540;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17540;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7963": { + "id": "I277:17541;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17541;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7964": { + "id": "I277:17541;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17541;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17541;209:7965": { + "id": "I277:17541;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17541;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7963": { + "id": "I277:17542;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17542;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7964": { + "id": "I277:17542;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17542;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17542;209:7965": { + "id": "I277:17542;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17542;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7963": { + "id": "I277:17543;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17543;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7964": { + "id": "I277:17543;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17543;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17543;209:7965": { + "id": "I277:17543;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17543;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7963": { + "id": "I277:17544;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17544;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7964": { + "id": "I277:17544;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17544;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17544;209:7965": { + "id": "I277:17544;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17544;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7963": { + "id": "I277:17545;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17545;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7964": { + "id": "I277:17545;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17545;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17545;209:7965": { + "id": "I277:17545;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17545;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7963": { + "id": "I277:17546;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17546;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7964": { + "id": "I277:17546;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17546;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17546;209:7965": { + "id": "I277:17546;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17546;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7963": { + "id": "I277:17547;209:7963", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.9319562911987305, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path979", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 2.313538074493408, + "childrenIds": [], + "parentId": "I277:17547;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7964": { + "id": "I277:17547;209:7964", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 3.4659557342529297, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path981", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 4.552157402038574, + "childrenIds": [], + "parentId": "I277:17547;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17547;209:7965": { + "id": "I277:17547;209:7965", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.05098039284348488, + "g": 0.5058823823928833, + "r": 0.7529411911964417 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 22.000608444213867, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path983", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.8754388689994812, + "strokes": [], + "visible": true, + "width": 13.781664848327637, + "childrenIds": [], + "parentId": "I277:17547;209:7962" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2767": { + "id": "I277:17554;77:2767", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0.9215686321258545 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 32, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "background", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 32, + "childrenIds": [], + "parentId": "I277:17554;77:2766" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;77:2768": { + "id": "I277:17554;77:2768", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 14.616372108459473, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "icon", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 2.909090995788574, + "strokes": [], + "visible": true, + "width": 20.000892639160156, + "childrenIds": [], + "parentId": "I277:17554;77:2766" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1680": { + "id": "I277:17554;68:1680", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 13.397499084472656, + "childrenIds": [ + "I277:17554;68:1681" + ], + "parentId": "I277:17554;68:1679" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1683": { + "id": "I277:17554;68:1683", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 4.655625343322754, + "childrenIds": [ + "I277:17554;68:1684" + ], + "parentId": "I277:17554;68:1682" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1689": { + "id": "I277:17554;68:1689", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 5.688889026641846, + "strokes": [], + "visible": true, + "width": 13, + "childrenIds": [], + "parentId": "I277:17554;68:1688" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1695": { + "id": "I277:17554;68:1695", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 1, + "layoutMode": "NONE", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Clip path group", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1696", + "I277:17554;68:1698" + ], + "parentId": "I277:17554;68:1694" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1681": { + "id": "I277:17554;68:1681", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 13.397499084472656, + "childrenIds": [], + "parentId": "I277:17554;68:1680" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1684": { + "id": "I277:17554;68:1684", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 4.655625343322754, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "Vector", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 1, + "strokes": [], + "visible": true, + "width": 4.655625343322754, + "childrenIds": [], + "parentId": "I277:17554;68:1683" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1696": { + "id": "I277:17554;68:1696", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "clipPath461", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 16, + "childrenIds": [ + "I277:17554;68:1697" + ], + "parentId": "I277:17554;68:1695" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1698": { + "id": "I277:17554;68:1698", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 11.047109603881836, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g457", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.06243896484375, + "childrenIds": [ + "I277:17554;68:1699", + "I277:17554;68:1701" + ], + "parentId": "I277:17554;68:1695" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1697": { + "id": "I277:17554;68:1697", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 16, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path459", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "INSIDE", + "strokeWeight": 0.800000011920929, + "strokes": [], + "visible": true, + "width": 16, + "childrenIds": [], + "parentId": "I277:17554;68:1696" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1699": { + "id": "I277:17554;68:1699", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.324453353881836, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g463", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.06243896484375, + "childrenIds": [ + "I277:17554;68:1700" + ], + "parentId": "I277:17554;68:1698" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1701": { + "id": "I277:17554;68:1701", + "type": "GROUP", + "fields": { + "blendMode": "PASS_THROUGH", + "effects": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.0416259765625, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "g467", + "opacity": 1, + "reactions": [], + "rotation": 0, + "visible": true, + "width": 15.0624361038208, + "childrenIds": [ + "I277:17554;68:1702" + ], + "parentId": "I277:17554;68:1698" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1700": { + "id": "I277:17554;68:1700", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 6.324453353881836, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path465", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0.800000011920929, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 15.06243896484375, + "childrenIds": [], + "parentId": "I277:17554;68:1699" + }, + "extra": {}, + "fieldErrors": {} + }, + "I277:17554;68:1702": { + "id": "I277:17554;68:1702", + "type": "VECTOR", + "fields": { + "blendMode": "PASS_THROUGH", + "cornerRadius": 0, + "dashPattern": [], + "effects": [], + "fills": [], + "gridColumnAnchorIndex": -1, + "gridRowAnchorIndex": -1, + "height": 10.0416259765625, + "isAsset": false, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "minHeight": null, + "minWidth": null, + "name": "path469", + "opacity": 1, + "reactions": [], + "rotation": 0, + "strokeAlign": "CENTER", + "strokeWeight": 0.800000011920929, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 15.0624361038208, + "childrenIds": [], + "parentId": "I277:17554;68:1701" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": { + "raw": { + "variables": [ + { + "id": "VariableID:10:643", + "name": "containerBackground" + }, + { + "id": "VariableID:10:644", + "name": "border" + }, + { + "id": "VariableID:171:6908", + "name": "primaryAccent" + }, + { + "id": "VariableID:10:641", + "name": "text" + }, + { + "id": "VariableID:171:5244", + "name": "gold" + }, + { + "id": "VariableID:209:8368", + "name": "mapCountry" + }, + { + "id": "VariableID:209:8369", + "name": "mapCompetition" + } + ] + } + }, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-255-d01d8c7de6.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-255-d01d8c7de6.json new file mode 100644 index 0000000..a2e396b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-255-d01d8c7de6.json @@ -0,0 +1,235 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-255-d01d8c7de6", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods buildTree preserves extracted component declaration while inlining commented asset instance usage: inline instance usage keeps commented reference 1" + }, + "request": { + "rootId": "captured:169", + "operationInput": { + "inlineComponentInstance": "toast-status-instance" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:169" + ], + "nodes": { + "captured:169": { + "id": "captured:169", + "type": "FRAME", + "fields": { + "effects": [], + "fills": [], + "height": 48, + "itemSpacing": 12, + "layoutMode": "HORIZONTAL", + "name": "Toast", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "reactions": [], + "strokes": [], + "visible": true, + "width": 580, + "childrenIds": [ + "toast-status-instance" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "toast-status-instance": { + "id": "toast-status-instance", + "type": "INSTANCE", + "fields": { + "componentProperties": { + "status": { + "type": "VARIANT", + "value": "error" + } + }, + "height": 24, + "name": "Status", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null, + "mainComponentId": "status-error" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-error": { + "id": "status-error", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=error", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "error" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-set": { + "id": "status-set", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "status": { + "defaultValue": "success", + "type": "VARIANT", + "variantOptions": [ + "success", + "warning", + "error" + ] + } + }, + "defaultVariant": { + "effects": [], + "fills": [], + "height": 24, + "id": "status-success", + "layoutMode": "NONE", + "name": "status=success", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24 + }, + "name": "Status", + "childrenIds": [ + "status-success", + "status-warning", + "status-error" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "status-success-glyph": { + "id": "status-success-glyph", + "type": "VECTOR", + "fields": { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "status-success": { + "id": "status-success", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=success", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-warning": { + "id": "status-warning", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=warning", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "warning" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-256-baf32cc08e.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-256-baf32cc08e.json new file mode 100644 index 0000000..b3334ec --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-256-baf32cc08e.json @@ -0,0 +1,235 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-256-baf32cc08e", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen Tree Methods buildTree preserves extracted component declaration while inlining commented asset instance usage: inline instance usage keeps extracted Status declaration 1" + }, + "request": { + "rootId": "captured:169", + "operationInput": { + "targetComponent": "Status" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "captured:169" + ], + "nodes": { + "captured:169": { + "id": "captured:169", + "type": "FRAME", + "fields": { + "effects": [], + "fills": [], + "height": 48, + "itemSpacing": 12, + "layoutMode": "HORIZONTAL", + "name": "Toast", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "reactions": [], + "strokes": [], + "visible": true, + "width": 580, + "childrenIds": [ + "toast-status-instance" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "toast-status-instance": { + "id": "toast-status-instance", + "type": "INSTANCE", + "fields": { + "componentProperties": { + "status": { + "type": "VARIANT", + "value": "error" + } + }, + "height": 24, + "name": "Status", + "visible": true, + "width": 24, + "childrenIds": [], + "parentId": null, + "mainComponentId": "status-error" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-error": { + "id": "status-error", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=error", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "error" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-set": { + "id": "status-set", + "type": "COMPONENT_SET", + "fields": { + "componentPropertyDefinitions": { + "status": { + "defaultValue": "success", + "type": "VARIANT", + "variantOptions": [ + "success", + "warning", + "error" + ] + } + }, + "defaultVariant": { + "effects": [], + "fills": [], + "height": 24, + "id": "status-success", + "layoutMode": "NONE", + "name": "status=success", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24 + }, + "name": "Status", + "childrenIds": [ + "status-success", + "status-warning", + "status-error" + ], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "status-success-glyph": { + "id": "status-success-glyph", + "type": "VECTOR", + "fields": { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "visible": true, + "childrenIds": [], + "parentId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "status-success": { + "id": "status-success", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=success", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + }, + "status-warning": { + "id": "status-warning", + "type": "COMPONENT", + "fields": { + "effects": [], + "fills": [], + "height": 24, + "layoutMode": "NONE", + "name": "status=warning", + "reactions": [], + "strokes": [], + "variantProperties": { + "status": "warning" + }, + "visible": true, + "width": 24, + "childrenIds": [ + "status-success-glyph" + ], + "parentId": "status-set" + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-root-257-f23261dd4f.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-257-f23261dd4f.json new file mode 100644 index 0000000..68ec79c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-257-f23261dd4f.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-root-257-f23261dd4f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "registerCodegen should register codegen 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "language": "devup-ui", + "node": { + "name": "Test", + "type": "COMPONENT", + "visible": true + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "COMPONENT", + "fields": { + "name": "Test", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-root-258-5cfe8baba5.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-258-5cfe8baba5.json new file mode 100644 index 0000000..7474058 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-258-5cfe8baba5.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-root-258-5cfe8baba5", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "registerCodegen should register codegen 2" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "language": "devup-ui", + "node": { + "name": "Main", + "type": "FRAME", + "visible": true + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "Main", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-root-259-0ae0aa9528.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-259-0ae0aa9528.json new file mode 100644 index 0000000..5807390 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-259-0ae0aa9528.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-root-259-0ae0aa9528", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "registerCodegen should register codegen 3" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "language": "other", + "node": { + "name": "Other", + "type": "FRAME", + "visible": true + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "Other", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/upstream-root-260-2dfc3ae054.json b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-260-2dfc3ae054.json new file mode 100644 index 0000000..57f90f7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-root-260-2dfc3ae054.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": 1, + "id": "upstream-root-260-2dfc3ae054", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "registerCodegen should generate responsive code when root node is SECTION 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "children": [ + { + "children": [], + "height": 200, + "layoutMode": "VERTICAL", + "name": "MobileFrame", + "type": "FRAME", + "visible": true, + "width": 375 + }, + { + "children": [], + "height": 200, + "layoutMode": "HORIZONTAL", + "name": "DesktopFrame", + "type": "FRAME", + "visible": true, + "width": 1440 + } + ], + "name": "ResponsiveSection", + "type": "SECTION", + "visible": true + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "
    " + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "SECTION", + "fields": { + "name": "ResponsiveSection", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-266-4cd888ffd0.json b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-266-4cd888ffd0.json new file mode 100644 index 0000000..721b4c6 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-266-4cd888ffd0.json @@ -0,0 +1,108 @@ +{ + "schemaVersion": 1, + "id": "upstream-responsive-266-4cd888ffd0", + "operation": "responsive-tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "ResponsiveCodegen generateVariantOnlyMergedCode renders OR conditional for child existing in multiple but not all variants 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "treesByVariant": [ + [ + "scroll", + { + "children": [ + { + "children": [], + "component": "Box", + "nodeName": "PartialChild", + "nodeType": "FRAME", + "props": { + "id": "PartialChild" + } + } + ], + "component": "Flex", + "nodeName": "Root", + "nodeType": "FRAME", + "props": {} + } + ], + [ + "hover", + { + "children": [ + { + "children": [], + "component": "Box", + "nodeName": "PartialChild", + "nodeType": "FRAME", + "props": { + "id": "PartialChildHover" + } + } + ], + "component": "Flex", + "nodeName": "Root", + "nodeType": "FRAME", + "props": {} + } + ], + [ + "default", + { + "children": [], + "component": "Flex", + "nodeName": "Root", + "nodeType": "FRAME", + "props": {} + } + ] + ], + "variantKey": "status" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "responsive-or-condition", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-267-88b21cad2a.json b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-267-88b21cad2a.json new file mode 100644 index 0000000..0492b15 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-267-88b21cad2a.json @@ -0,0 +1,788 @@ +{ + "schemaVersion": 1, + "id": "upstream-responsive-267-88b21cad2a", + "operation": "responsive-tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "ResponsiveCodegen generateVariantResponsiveComponents handles effect + viewport + size + variant (4 dimensions) 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "mockTree": { + "component": "Box", + "props": { + "id": "RootTablet" + }, + "children": [ + { + "component": "Box", + "props": { + "id": "Shared" + }, + "children": [], + "nodeType": "FRAME", + "nodeName": "Shared" + } + ], + "nodeType": "FRAME", + "nodeName": "RootTablet" + }, + "children": [ + { + "children": [], + "fills": [ + { + "color": { + "b": 0.17, + "g": 0.25, + "r": 0.35 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Desktop, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.12, + "g": 0.17, + "r": 0.24 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Desktop, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.1, + "g": 0.14, + "r": 0.19 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Desktop, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.17, + "g": 0.25, + "r": 0.35 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Mobile, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.12, + "g": 0.17, + "r": 0.24 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Mobile, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.1, + "g": 0.14, + "r": 0.19 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Mobile, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.17, + "g": 0.25, + "r": 0.35 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Desktop, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.12, + "g": 0.17, + "r": 0.24 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Desktop, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.1, + "g": 0.14, + "r": 0.19 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Desktop, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.17, + "g": 0.25, + "r": 0.35 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Mobile, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.12, + "g": 0.17, + "r": 0.24 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Mobile, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.1, + "g": 0.14, + "r": 0.19 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Mobile, size=Sm, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "primary", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Desktop, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.95, + "g": 0.95, + "r": 0.95 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Desktop, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.9, + "g": 0.9, + "r": 0.9 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Desktop, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "white", + "viewport": "Desktop" + }, + "width": 191 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Mobile, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.95, + "g": 0.95, + "r": 0.95 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Mobile, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Md", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.9, + "g": 0.9, + "r": 0.9 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Mobile, size=Md, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Md", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Desktop, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.95, + "g": 0.95, + "r": 0.95 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Desktop, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.9, + "g": 0.9, + "r": 0.9 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 46, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Desktop, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "white", + "viewport": "Desktop" + }, + "width": 123 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Mobile, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Sm", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.95, + "g": 0.95, + "r": 0.95 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=hover, viewport=Mobile, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + "size": "Sm", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + }, + { + "children": [], + "fills": [ + { + "color": { + "b": 0.9, + "g": 0.9, + "r": 0.9 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 51, + "layoutMode": "HORIZONTAL", + "name": "effect=active, viewport=Mobile, size=Sm, variant=white", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "active", + "size": "Sm", + "variant": "white", + "viewport": "Mobile" + }, + "width": 149 + } + ], + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "active", + "default", + "hover" + ] + }, + "size": { + "defaultValue": "Md", + "type": "VARIANT", + "variantOptions": [ + "Md", + "Sm" + ] + }, + "variant": { + "defaultValue": "primary", + "type": "VARIANT", + "variantOptions": [ + "primary", + "white" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "defaultVariant": { + "children": [], + "fills": [ + { + "color": { + "b": 0.17, + "g": 0.25, + "r": 0.35 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "layoutMode": "HORIZONTAL", + "name": "effect=default, viewport=Desktop, size=Md, variant=primary", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + "size": "Md", + "variant": "primary", + "viewport": "Desktop" + }, + "width": 191 + }, + "name": "Button", + "type": "COMPONENT_SET" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "COMPONENT_SET", + "fields": { + "name": "Button", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-268-7dd1d5c323.json b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-268-7dd1d5c323.json new file mode 100644 index 0000000..008f811 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-268-7dd1d5c323.json @@ -0,0 +1,114 @@ +{ + "schemaVersion": 1, + "id": "upstream-responsive-268-7dd1d5c323", + "operation": "responsive-tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "ResponsiveCodegen generateVariantOnlyMergedCode with structurally equivalent asset children merges asset-like children even when node names differ 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "treesByVariant": [ + [ + "up", + { + "children": [ + { + "children": [], + "component": "Box", + "nodeName": "trend-up 1", + "nodeType": "FRAME", + "props": { + "aspectRatio": "1", + "bg": "$success", + "boxSize": "16px", + "maskImage": "url('/icons/trend-up 1.svg')", + "maskPos": "center", + "maskRepeat": "no-repeat", + "maskSize": "contain" + } + } + ], + "component": "Center", + "nodeName": "Root", + "nodeType": "FRAME", + "props": { + "gap": "4px" + } + } + ], + [ + "down", + { + "children": [ + { + "children": [], + "component": "Box", + "nodeName": "trend-down 1", + "nodeType": "FRAME", + "props": { + "aspectRatio": "1", + "bg": "$error", + "boxSize": "16px", + "maskImage": "url('/icons/trend-down 1.svg')", + "maskPos": "center", + "maskRepeat": "no-repeat", + "maskSize": "contain" + } + } + ], + "component": "Center", + "nodeName": "Root", + "nodeType": "FRAME", + "props": { + "gap": "4px" + } + } + ] + ], + "variantKey": "grpah" + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "responsive-asset-merge", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-261-928195cb2b.json b/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-261-928195cb2b.json new file mode 100644 index 0000000..0c9f07a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-261-928195cb2b.json @@ -0,0 +1,373 @@ +{ + "schemaVersion": 1, + "id": "upstream-viewport-261-928195cb2b", + "operation": "responsive-tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen effect-only COMPONENT_SET generates snapshot for asset-like Status ComponentSet as Image src variants 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "children": [ + { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.4705882353, + "g": 0.6352941176, + "r": 0.0549019608 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-success-bg", + "isAsset": true, + "name": "Ellipse 128", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + }, + { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-success-fg", + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 24, + "id": "status-success", + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "status=success", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24 + }, + { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.1411764706, + "g": 0.7137254902, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-warning-bg", + "isAsset": true, + "name": "Ellipse 128", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + }, + { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-warning-fg", + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 24, + "id": "status-warning", + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "status=warning", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "warning" + }, + "visible": true, + "width": 24 + }, + { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.2666666667, + "g": 0.0784313725, + "r": 0.8784313725 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-error-bg", + "isAsset": true, + "name": "Ellipse 128", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + }, + { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-error-fg", + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 24, + "id": "status-error", + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "status=error", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "error" + }, + "visible": true, + "width": 24 + } + ], + "componentPropertyDefinitions": { + "status": { + "defaultValue": "success", + "type": "VARIANT", + "variantOptions": [ + "success", + "warning", + "error" + ] + } + }, + "defaultVariant": { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.4705882353, + "g": 0.6352941176, + "r": 0.0549019608 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-success-bg", + "isAsset": true, + "name": "Ellipse 128", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + }, + { + "effects": [], + "fills": [ + { + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20, + "id": "status-success-fg", + "isAsset": true, + "name": "Glyph", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true, + "width": 20 + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 24, + "id": "status-success", + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "status=success", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "status": "success" + }, + "visible": true, + "width": 24 + }, + "effects": [], + "fills": [], + "height": 500, + "name": "Status", + "reactions": [], + "strokes": [], + "type": "COMPONENT_SET", + "visible": true, + "width": 500 + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "COMPONENT_SET", + "fields": { + "name": "Status", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-262-0f19b3123e.json b/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-262-0f19b3123e.json new file mode 100644 index 0000000..0a82f51 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-262-0f19b3123e.json @@ -0,0 +1,223 @@ +{ + "schemaVersion": 1, + "id": "upstream-viewport-262-0f19b3123e", + "operation": "responsive-tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen effect-only COMPONENT_SET generates boolean prop for true/false variant component sets 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "children": [ + { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.5, + "g": 0.44, + "r": 0.42 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "id": "속성 1=false-vector", + "isAsset": true, + "name": "Vector", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 20, + "id": "privacy-false", + "isAsset": true, + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "속성 1=false", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "속성 1": "false" + }, + "visible": true, + "width": 20 + }, + { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.5, + "g": 0.44, + "r": 0.42 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "id": "속성 1=true-vector", + "isAsset": true, + "name": "Vector", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 20, + "id": "privacy-true", + "isAsset": true, + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "속성 1=true", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "속성 1": "true" + }, + "visible": true, + "width": 20 + } + ], + "componentPropertyDefinitions": { + "속성 1": { + "defaultValue": "false", + "type": "VARIANT", + "variantOptions": [ + "false", + "true" + ] + } + }, + "defaultVariant": { + "children": [ + { + "effects": [], + "fills": [ + { + "color": { + "b": 0.5, + "g": 0.44, + "r": 0.42 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "id": "속성 1=false-vector", + "isAsset": true, + "name": "Vector", + "reactions": [], + "strokes": [], + "type": "VECTOR", + "visible": true + } + ], + "cornerRadius": 0, + "counterAxisAlignItems": "MIN", + "effects": [], + "fills": [], + "height": 20, + "id": "privacy-false", + "isAsset": true, + "itemSpacing": 0, + "layoutMode": "NONE", + "name": "속성 1=false", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "reactions": [], + "strokes": [], + "type": "COMPONENT", + "variantProperties": { + "속성 1": "false" + }, + "visible": true, + "width": 20 + }, + "effects": [], + "fills": [], + "height": 500, + "name": "Privacy", + "reactions": [], + "strokes": [], + "type": "COMPONENT_SET", + "visible": true, + "width": 500 + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "COMPONENT_SET", + "fields": { + "name": "Privacy", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-263-d2763f9b9f.json b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-263-d2763f9b9f.json new file mode 100644 index 0000000..710d735 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-263-d2763f9b9f.json @@ -0,0 +1,66 @@ +{ + "schemaVersion": 1, + "id": "upstream-render-263-d2763f9b9f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "renderComponent interface snapshot VARIANT + BOOLEAN + INSTANCE_SWAP mixed interface 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "code": "
    \n {leftIcon}\n buttonLg\n {rightIcon}\n
    ", + "name": "Button", + "variantOrder": ["leftIcon", "showLeftIcon", "rightIcon", "showRightIcon", "size", "variant"], + "variants": { + "leftIcon": "React.ReactNode", + "rightIcon": "React.ReactNode", + "showLeftIcon": "boolean", + "showRightIcon": "boolean", + "size": "'lg' | 'md' | 'sm'", + "variant": "'primary' | 'ghost' | 'disabled'" + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "Button", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-264-51e29ada52.json b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-264-51e29ada52.json new file mode 100644 index 0000000..6d648c8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-264-51e29ada52.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-render-264-51e29ada52", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "renderComponent interface snapshot BOOLEAN-only interface (all optional) 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "code": "\n {showBadge && }\n {showIcon && }\n", + "name": "Card", + "variants": { + "showBadge": "boolean", + "showIcon": "boolean" + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "Card", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-265-94e906e79b.json b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-265-94e906e79b.json new file mode 100644 index 0000000..2ca66dd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-265-94e906e79b.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "id": "upstream-render-265-94e906e79b", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "renderComponent interface snapshot INSTANCE_SWAP-only interface (all required) 1" + }, + "request": { + "rootId": "fixture:root", + "operationInput": { + "code": "\n {leftIcon}\n label\n {rightIcon}\n", + "name": "IconButton", + "variants": { + "leftIcon": "React.ReactNode", + "rightIcon": "React.ReactNode" + } + } + }, + "payload": { + "target": { + "fileKey": "syntheticFixtureFile", + "nodeId": null, + "branchKey": null + }, + "scope": "node", + "metadata": { + "content": [ + { + "type": "text", + "text": "" + } + ] + }, + "snapshot": { + "fileKey": "syntheticFixtureFile", + "version": "243db650", + "roots": [ + "fixture:root" + ], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "IconButton", + "childrenIds": [] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "243db650" + } +} diff --git a/fixtures/devup-figma-plugin/coverage-registry.json b/fixtures/devup-figma-plugin/coverage-registry.json new file mode 100644 index 0000000..213514a --- /dev/null +++ b/fixtures/devup-figma-plugin/coverage-registry.json @@ -0,0 +1,145 @@ +{ + "schemaVersion": 1, + "evidence": [ + { + "rustTest": "compat_fixtures::upstream_json_goldens", + "sourcePath": "crates/devup-mcp-devup-ui/tests/compat_fixtures.rs", + "function": "upstream_json_goldens", + "coverage": "snapshot_parity", + "description": "268개의 JSON 입력을 원본 golden output과 byte 단위로 대조하는 실행 테스트" + }, + { + "rustTest": "codegen::generates_deterministic_devup_ui_tsx", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "generates_deterministic_devup_ui_tsx", + "coverage": "representative_assertion", + "description": "layout, paint, prop 문자열화 및 기본 TSX 생성 규칙의 대표 Rust assertion" + }, + { + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "embedded_root_omits_only_selected_frame_geometry_and_position", + "coverage": "representative_assertion", + "description": "position과 root layout 처리의 대표 Rust assertion" + }, + { + "rustTest": "codegen::mixed_individual_stroke_emits_only_nonzero_sides", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "mixed_individual_stroke_emits_only_nonzero_sides", + "coverage": "representative_assertion", + "description": "stroke, paint 및 개별 border 변환의 대표 Rust assertion" + }, + { + "rustTest": "codegen::nested_text_style_uses_typography", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "nested_text_style_uses_typography", + "coverage": "representative_assertion", + "description": "text style과 bound variable token 변환의 대표 Rust assertion" + }, + { + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "standalone_instance_inlining_uses_resolved_children_not_component_props", + "coverage": "representative_assertion", + "description": "instance, variant property 및 node tree 변환의 대표 Rust assertion" + }, + { + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "normalizes_names_to_valid_typescript_identifiers", + "coverage": "representative_assertion", + "description": "camel/pascal case와 TypeScript identifier 정규화의 대표 Rust assertion" + }, + { + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals", + "sourcePath": "crates/devup-mcp-devup-ui/tests/codegen.rs", + "function": "records_explicit_diagnostics_for_unsupported_visuals", + "coverage": "representative_assertion", + "description": "effect, reaction, selector 및 미지원 시각 속성 진단의 대표 Rust assertion" + }, + { + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "sourcePath": "crates/devup-mcp-devup-ui/tests/theme.rs", + "function": "maps_variables_modes_aliases_and_styles_to_devup_json", + "coverage": "representative_assertion", + "description": "variable alias, color collection 및 devup.json 변환의 대표 Rust assertion" + }, + { + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "sourcePath": "crates/devup-mcp-devup-ui/tests/plugin_compat.rs", + "function": "import_metadata_is_sorted_deduplicated_and_stable", + "coverage": "representative_assertion", + "description": "DevupUI/keyframes/custom component import의 추출, 정렬, 중복 제거와 반복 결정성을 검증" + }, + { + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "sourcePath": "crates/devup-mcp-devup-ui/tests/plugin_compat.rs", + "function": "component_usage_preserves_variants_boolean_and_text_properties", + "coverage": "representative_assertion", + "description": "COMPONENT, COMPONENT_SET, INSTANCE usage의 variant, boolean, text 및 reserved property 규칙을 검증" + }, + { + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "sourcePath": "crates/devup-mcp-devup-ui/tests/plugin_compat.rs", + "function": "responsive_provider_covers_sections_variants_and_pure_code_first", + "coverage": "representative_assertion", + "description": "Section Pure Code 순서, viewport component와 다중 variant tree 결합을 검증" + }, + { + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "sourcePath": "crates/devup-mcp-figma/tests/assets.rs", + "function": "manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "coverage": "representative_assertion", + "description": "image fill과 vector asset을 고유 node/field ID로 수집하고 요청 전에는 binary를 내보내지 않음을 검증" + }, + { + "rustTest": "explore::section_notes_combine_direct_text_and_descendant_annotations", + "sourcePath": "crates/devup-mcp-figma/tests/explore.rs", + "function": "section_notes_combine_direct_text_and_descendant_annotations", + "coverage": "representative_assertion", + "description": "Section 직접 TEXT와 descendant annotation label/Markdown fallback의 시각 트리 순서 결합을 검증" + }, + { + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "sourcePath": "crates/devup-mcp-devup-ui/tests/theme.rs", + "function": "node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "coverage": "representative_assertion", + "description": "treeshaking node scope가 사용 alias dependency와 style만 보존하고 미사용 resource를 제외함을 검증" + }, + { + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "sourcePath": "crates/devup-mcp-devup-ui/tests/theme.rs", + "function": "resolves_token_conflicts_deterministically_across_input_orders", + "coverage": "representative_assertion", + "description": "collection/source가 다른 동일 token 충돌을 입력 순서와 무관하게 진단하고 결정적으로 해석함을 검증" + }, + { + "rustTest": "section_export::section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact", + "sourcePath": "crates/devup-mcp/tests/section_export.rs", + "function": "section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact", + "coverage": "representative_assertion", + "description": "Section/page 후보 수집, 선택 export, 전체 export와 artifact 재사용 orchestration을 검증" + }, + { + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "sourcePath": "crates/devup-mcp/tests/stdio_tools.rs", + "function": "exposes_the_seven_read_only_devup_figma_tools", + "coverage": "representative_assertion", + "description": "plugin command dispatcher를 대체하는 일곱 MCP tool과 secret/code 비노출 schema를 검증" + }, + { + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "sourcePath": "crates/devup-mcp-figma/tests/upstream_contract.rs", + "function": "built_in_scripts_expose_only_read_operations", + "coverage": "representative_assertion", + "description": "모든 내장 Figma script가 create/remove/append/insert 같은 문서 mutation을 포함하지 않음을 검증" + }, + { + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "sourcePath": "crates/devup-mcp/tests/source_orchestration.rs", + "function": "direct_fast_call_error_restarts_the_legacy_collector", + "coverage": "representative_assertion", + "description": "선택 projection 실패가 전체 요청을 잃지 않고 안전한 legacy 수집으로 전환됨을 검증" + } + ] +} diff --git a/fixtures/devup-figma-plugin/ledger.json b/fixtures/devup-figma-plugin/ledger.json new file mode 100644 index 0000000..dd920bd --- /dev/null +++ b/fixtures/devup-figma-plugin/ledger.json @@ -0,0 +1,7548 @@ +{ + "schemaVersion": 1, + "entries": [ + { + "testId": "src/__tests__/code-responsive.test.ts > registerCodegen responsive error handling > swallows responsive errors and still returns base code", + "sourceFile": "src/__tests__/code-responsive.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code-responsive.test.ts > registerCodegen pure code error handling > swallows pure code errors and omits the Pure Code entry", + "sourceFile": "src/__tests__/code-responsive.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-without-treeshaking", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-excel", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-excel-without-treeshaking", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches import-devup", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches import-devup-excel", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-assets", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-pages-and-components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 1]", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-root-257-f23261dd4f", + "upstream-root-258-5cfe8baba5", + "upstream-root-259-0ae0aa9528" + ], + "rustTest": "compat_fixtures::upstream_json_goldens", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 2]", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 3]", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should generate responsive code when root node is SECTION", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-root-260-2dfc3ae054" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/__tests__/code.test.ts > > should not register codegen if figma is not defined", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/__tests__/code.test.ts > > should run command", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/__tests__/code.test.ts > > auto-runs on module load when figma is present", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should extract keyframes import when code contains keyframes(", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should extract keyframes import when code contains keyframes`", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should not extract keyframes when not present", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should extract custom component imports", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should not include devup-ui components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should return empty array when no custom components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should sort custom components alphabetically", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should handle multiple components with same custom component", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should handle nested custom components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate responsive component codes for COMPONENT_SET with viewport variant", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate responsive component with multiple variants (viewport + size)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate responsive component with multiple non-viewport variants (size + varient)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate responsive code for node with parent SECTION", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate CLI with custom component imports", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate componentsResponsiveCodes when FRAME contains INSTANCE of COMPONENT_SET with viewport", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::responsive_provider_covers_sections_variants_and_pure_code_first", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT without variant props", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT with variant props", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should filter reserved variant keys for COMPONENT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT in COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should include BOOLEAN and TEXT from parent COMPONENT_SET for COMPONENT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should skip BOOLEAN with false default from parent COMPONENT_SET for COMPONENT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT_SET with defaults", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should filter reserved variant keys for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should sanitize COMPONENT_SET property names with hash suffixes", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should include BOOLEAN and TEXT properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should skip BOOLEAN with false defaultValue for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should include TEXT properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should use children syntax for COMPONENT with VARIANT and single TEXT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should use children syntax for COMPONENT with single TEXT-only prop (no other props)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should use children syntax for COMPONENT_SET with BOOLEAN and single TEXT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should use children syntax for COMPONENT_SET with single TEXT-only prop (no other props)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should keep prop syntax for COMPONENT_SET with 2+ TEXT properties", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should keep prop syntax for COMPONENT with 2+ TEXT properties from parent", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should skip INSTANCE_SWAP properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT_SET without componentPropertyDefinitions", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should return null for non-component nodes", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage with no props when COMPONENT_SET has only reserved variants", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for INSTANCE node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for positioned INSTANCE node (absolute)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for COMPONENT node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should emit wrapped definition + import + CLI for standalone COMPONENT (regression)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should emit Pure Code section as first entry for every node type (regression)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should inline-expand INSTANCE in Pure Code (no component references)", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for COMPONENT_SET node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::component_usage_preserves_variants_boolean_and_text_properties", + "rationale": null + }, + { + "testId": "src/__tests__/utils.test.ts > space > should create space", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/__tests__/utils.test.ts > propsToPropsWithTypography > should apply typography from resolved cache (sync fast path)", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/__tests__/utils.test.ts > propsToPropsWithTypography > should preserve scoped (non-breakpoint) prefix in typography key", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/__tests__/utils.test.ts > propsToPropsWithTypography > should return early from sync path when textStyleId not in resolved set", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/__tests__/utils.test.ts > propsToPropsWithTypography > should return props without typography when style resolves to null", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return pascal case name for COMPONENT_SET", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return parent name for COMPONENT with COMPONENT_SET parent", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return node name for COMPONENT without COMPONENT_SET parent", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return pascal case name for FRAME", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return pascal case name for RECTANGLE", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/__tests__/utils.test.ts > getComponentName > should return pascal case name for TEXT", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > globalAssetNodes > resetGlobalAssetNodes clears and getGlobalAssetNodes returns empty map", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > globalAssetNodes > getGlobalAssetNodes returns readonly map", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > hasViewportVariant returns false for non-COMPONENT_SET", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > hasViewportVariant returns false when no viewport variant exists", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > hasViewportVariant returns true when viewport variant exists (lowercase)", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > hasViewportVariant returns true when viewport variant exists (mixed case)", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > generateViewportResponsiveComponents generates responsive code for viewport variants", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > generateViewportResponsiveComponents excludes viewport from variants interface", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > generateViewportResponsiveComponents generates responsive arrays for different props", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen viewport variant > groups components with same non-viewport variants together", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates code with pseudo-selectors for effect-only component set", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates code with viewport + effect variants", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates code with effect + size variants", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates BOOLEAN conditions on children in multi-variant ComponentSet", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates snapshot for asset-like Status ComponentSet as Image src variants", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-viewport-261-928195cb2b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates boolean prop for true/false variant component sets", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-viewport-262-0f19b3123e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates boolean prop for on/off variant component sets", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates BOOLEAN conditions on INSTANCE asset children in multi-variant ComponentSet", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > BOOLEAN conditions survive after codegen.run() populates globalBuildTreeCache", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen-viewport.test.ts > Codegen effect-only COMPONENT_SET > generates BOOLEAN conditions with effect variants (real Button scenario)", + "sourceFile": "src/codegen/__tests__/codegen-viewport.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component without variants [case 1]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-001-4410624749", + "upstream-codegen-134-f80fffb8b4", + "upstream-codegen-135-e00e826755" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders overflow hidden when clipsContent is true", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-002-c1ac954cb6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders objectFit contain for image asset", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-003-c855738695" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders objectFit cover for image asset", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-004-8ec61c5bb5" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > omits objectFit when image scale mode is FILL", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-005-bcc6ca7dbf" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with vector node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-006-86c21dc8ce" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with star node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-007-c1c1afa5d7" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with polygon node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-008-8ea06a6c88" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with ellipse inner radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-009-008aac1a2c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with non-solid fills", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-010-8454d22acd" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders asset with single child and fills", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-011-72709aab82" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders null for asset with only solid fills", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-012-92c671c0e8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with bound variable color", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-013-351e69a13b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with same color mask", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-014-828c466260" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with children same color", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-015-eaef178e47" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with different color children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-016-3f1fb1569b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with non-solid fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-017-44cff97cec" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with invisible fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-018-bc5eb21a9e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders nested svg asset with 3 solid fill boxes in frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-019-4988f86e5e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders nested svg asset with different colors as image", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-020-a9d569be7a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders layout for absolute child same size as parent", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-021-6cae93b843" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with horizontal MAX constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-022-8dce1fe15f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with horizontal CENTER constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-023-040bff1c77" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with vertical MAX constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-024-eb534f354c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with vertical CENTER constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-025-74cf3c3463" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders flex=1 when parent is horizontal auto layout", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-026-e6df42a1c0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders aspect ratio when provided", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-027-2373d0fb1b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text with width_and_height auto resize returning no size props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-028-0dcf04d5ca" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text with special characters", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-029-dd01228f04" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text with leading and trailing spaces", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-030-f4528f2a74" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders single-line max line props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-031-5d6f0a82e3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders multi-line max line props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-032-be85ad69d0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders fixed size frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-033-4f42f0cabb" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with padding", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-034-e25e34d3de" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding shorthand when all sides equal", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-035-1d66b429cf" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding with top equals bottom but left right different", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-036-6803ff59e6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding with left equals right but top bottom different", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-037-e576c2fba9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding with all sides different", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-038-280770f34d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding from inferredAutoLayout", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-039-84e4037075" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with border radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-040-e2a36763a6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders mixed border radius frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-041-7c9175487c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders ellipse with 50% border radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-042-246e72e17a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke outline CENTER alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-043-50fac72de7" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke outline OUTSIDE alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-044-a9f4c5ba13" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke border INSIDE alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-045-958507518d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders line with stroke outline", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-046-82a07e3ec3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with dashed stroke", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-047-d524fcd6c3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with page parent and width 1920", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-048-fa3442e264" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with section parent", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-049-b3bbd32960" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with vertical center align child width shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-050-fda399bfe0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with horizontal center align child height shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-051-53df7b9474" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with maxWidth child width shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-052-e6195ba5a2" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with maxHeight child height shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-053-5fbe283840" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with individual stroke weights", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-054-e536c17528" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders group as Box with full size", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-055-1539142ffd" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders boxSize when width equals height", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-056-834fa66895" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders min/max width/height with px", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-057-595a483b50" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders flex auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-058-a5bed8edb7" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders grid auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-059-0b07052901" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders grid child positioning props when out of order", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-060-b58a7535c7" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders vstack auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-061-1c44313e59" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders center auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-062-4fdcb21c9d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders drop shadow effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-063-a8231002de" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders inner shadow effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-064-764419ad9b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders layer blur effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-065-6c1be61067" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders background blur effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-066-6525a64377" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders noise effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-067-3ffe06a1a9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders texture effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-068-0d86452528" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders glass effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-069-0fa1145f4c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with content", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-070-a01830c33f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders another text node with content", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-071-3a132a6b4d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with ellipsis props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-072-df70a74728" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with single drop shadow", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-073-ef0cdd87cf" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with multiple drop shadows", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-074-57a24a2690" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with stroke", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-075-fb8db22bb9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with multiple segments", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-076-3d2d4543bb" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with unordered list", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-077-a65991a745" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with ordered list", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-078-d6b1085274" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with list and multiple lines", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-079-9e7f3ee9e4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with multiple segments without props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-080-f6233dd6a0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-081-ed3fa48802" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with negative rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-082-db0d8839e8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with decimal rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-083-1820110e8a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with opacity less than 1", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-084-3d01c94f87" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with darken blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-085-1f274ec7a6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with multiply blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-086-a44a580f30" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with screen blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-087-e95c0eccc2" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with overlay blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-088-f9ca312d49" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear burn blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-089-1d28dfdd93" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color burn blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-090-e8878c5cbf" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with lighten blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-091-dc61cb2277" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear dodge blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-092-96adc16d0c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color dodge blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-093-4573f32903" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with soft light blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-094-e0d0f3bfe1" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with hard light blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-095-af3315e549" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with difference blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-096-f8978e56ee" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with exclusion blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-097-da58ebc1a5" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with hue blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-098-7c2267436f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with saturation blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-099-a2f954e973" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-100-a546e9e784" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with luminosity blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-101-394e6d9bf6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pass through blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-102-cbff7d3da9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with opacity and blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-103-246809daea" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with solid fill and blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-104-d68998542b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-105-0137b6735e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with HEIGHT auto resize and fixed sizing", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-106-6d687083cc" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with NONE auto resize and fixed sizing", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-107-f624c65fa8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with TRUNCATE auto resize and fixed sizing", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-108-c6c4dabf49" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with textStyleId and typography", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-109-e2824ad5be" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-110-f2505cce4b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with radial gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-111-72c9d38832" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with angular gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-112-b5443c63a4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with diamond gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-113-702dadab11" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with image fill TILE scaleMode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-114-855686da78" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-115-45d3f116b5" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill START alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-116-23097e86ce" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill vertical alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-117-fb967a9342" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with multiple fills including non-last solid", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-118-b5cba733fa" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with invisible gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-119-882c2abd91" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with zero opacity gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-120-7634e1ee10" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with solid fill opacity 0", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-121-0536a2e75b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with variants", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-122-7ddad74cc1", + "upstream-codegen-123-179129a02c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with effect property", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-124-bdedf14335", + "upstream-codegen-125-4a4a93c4c9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with transition", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-126-14073e1999", + "upstream-codegen-127-1d5ead088d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with different props and transition", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-128-2222304a14", + "upstream-codegen-129-7c97156f7f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component with parent component set", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-130-bbd4e9a97a", + "upstream-codegen-131-c6ef80ad0c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with press trigger", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-132-9a7b0243b6", + "upstream-codegen-133-f425fa006c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component without variants [case 2]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component with parent component set name", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-136-b68bd43ea7", + "upstream-codegen-137-83b2706e92" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders instance with page root width and sets width to 100%", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders instance without page root width match and does not set width to 100%", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for simple frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for asset node (image)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for SVG asset with mask color", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for SVG asset without same color (returns Image)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for frame with children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for TEXT node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for INSTANCE node without position wrapper", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > inlines asset-only INSTANCE when inline mode is enabled", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > keeps component reference for asset-only INSTANCE when reference mode is selected", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > does not inline multi-node asset-like component instances", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > preserves extracted component declaration while inlining commented asset instance usage", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-255-d01d8c7de6", + "upstream-codegen-256-baf32cc08e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > infers boolean props for extracted component declarations from tree conditions", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for INSTANCE node with position wrapper (absolute)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for INSTANCE with position and 100% width", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for COMPONENT_SET node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for COMPONENT node directly", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree with nested INSTANCE children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds tree for native SLOT node with sanitized name", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds INSTANCE tree with native SLOT children content", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds INSTANCE tree with multiple native SLOTs as named JSX props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > buildTree > Codegen Tree Methods > builds INSTANCE tree with multi-child SLOT wrapped in fragment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > getTree > Codegen Tree Methods > builds and caches tree on first call", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > getComponentTrees > Codegen Tree Methods > returns empty map when no components", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > getComponentTrees > Codegen Tree Methods > returns component trees after building", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > adds component with selector props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > does not duplicate component trees", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > handles component with INSTANCE children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects INSTANCE_SWAP slots via componentPropertyReferences", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects BOOLEAN conditions via componentPropertyReferences", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects BOOLEAN conditions on nested grandchildren (not just direct children)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects combined INSTANCE_SWAP + BOOLEAN slot with condition", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects TEXT property binding via componentPropertyReferences", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects native SLOT children and adds children: React.ReactNode to variants", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > addComponentTree (via buildTree) > Codegen Tree Methods > detects multiple native SLOTs and adds each as React.ReactNode variant", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders simple tree to JSX", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders tree with children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders tree with textChildren", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders nested tree with depth", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders component reference (isComponent)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders multi-line conditional with extra indent", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders single-line conditional without extra indent", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders native SLOT as {children}", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > renderTree (static) > Codegen Tree Methods > renders multiple named SLOTs as {slotName}", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > INSTANCE_SWAP / BOOLEAN snapshot > Codegen Tree Methods > renders component with INSTANCE_SWAP slot", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-138-9cccfcb552", + "upstream-codegen-139-63f7b1f175" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > INSTANCE_SWAP / BOOLEAN snapshot > Codegen Tree Methods > renders component with BOOLEAN conditional", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-140-e577df9ad5" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > INSTANCE_SWAP / BOOLEAN snapshot > Codegen Tree Methods > renders component with nested BOOLEAN conditionals (grandchildren)", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-141-48307df49b", + "upstream-codegen-142-ac82229282" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > INSTANCE_SWAP / BOOLEAN snapshot > Codegen Tree Methods > renders component with INSTANCE_SWAP + BOOLEAN combined", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-143-52b441f9f4", + "upstream-codegen-144-042a6de403", + "upstream-codegen-145-f7001b5648" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > collectComponentProps > Codegen Tree Methods > collects boolean, text, and slot props from structured tree metadata", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > getSelectorProps with numeric property names > Codegen Tree Methods > sanitizes property name that is only digits", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 1]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-146-56be99e864" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 2]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-147-bb7df0f2f1" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 3]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-148-62e9137131" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 4]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-149-2491f4c5a5" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 5]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-150-ecb5bb4337" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 6]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-151-7993d252dc" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 7]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-152-a05026a9db" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 8]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-153-fb5205fc52" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 9]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-154-1409376769" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 10]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-155-557eb84a98" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 11]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-156-bec8be9b99" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 12]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-157-4cb71f2863" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 13]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-158-8e4821dcbc" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 14]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-159-30962241b1" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 15]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-160-db5d3ac9d8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 16]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-161-5b230821f2" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 17]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-162-51e1254b4c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 18]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-163-2a9f9a056a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 19]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-164-33e4c6591c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 20]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-165-501ee1df12" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 21]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-166-cda14f0b08" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 22]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-167-114a88771f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 23]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-168-4211bd8279" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 24]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-169-796132e0cf" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 25]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-170-eab2ed7d4c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 26]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-171-7e33e2b6a9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 27]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-172-99028c85ce" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 28]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-173-64dbd7a102" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 29]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-174-68dd47d3f8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 30]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-175-ec3fd45731" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 31]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-176-653a030fdc" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 32]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-177-c147e7dd39" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 33]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-178-d69d60d688" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 34]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-179-80620f6587" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 35]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-180-ad1a31fd03" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 36]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-181-5afa626d49" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 37]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-182-c45d19171b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 38]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-183-7ede517e99" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 39]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-184-0c09788bb7" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 40]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-185-e79c2ae189" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 41]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-186-0988e78887" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 42]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-187-8b30b935a4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 43]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-188-ea2a1af6a1" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 44]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-189-75736e48e0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 45]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-190-d5a9045231" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 46]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-191-2021d398f8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 47]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-192-dd2c3f0c1c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 48]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-193-bd488a5710" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 49]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-194-17922977f6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 50]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-195-1a6efe22a8" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 51]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-196-d14f03afcd" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 52]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-197-026402bf2e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 53]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-198-a9ea7ba9c3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 54]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-199-829a5c949d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 55]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-200-3313d92719" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 56]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-201-8207a4008e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 57]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-202-2786eda075" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 58]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-203-8af03217a3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 59]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-204-2b2967c8c4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 60]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-205-cc3ea5202a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 61]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-206-b5c5dc97eb" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 62]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-207-b0e134acf4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 63]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-208-1a343e45db" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 64]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-209-0514b0990f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 65]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-210-1b24060767" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 66]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-211-2e15c55701" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 67]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-212-2a8f7b4a99" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 68]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-213-aa53408d2f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 69]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-214-6dc49544c0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 70]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-215-39e86f8f53" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 71]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-216-465422d47b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 72]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-217-2d887b2a8b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 73]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-218-587666c709" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 74]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-219-c6446b7b2e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 75]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-220-5980153f26" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 76]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-221-d003bdb336" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 77]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-222-f2d780c847" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 78]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-223-4dc8092992" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 79]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-224-075a41e65c" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 80]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-225-00fb8a129e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 81]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-226-b2c28bcc8f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 82]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-227-bebc4e7262" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 83]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-228-221bd0c553" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 84]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-229-9f57002cd6" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 85]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-230-2af59fd9fa" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 86]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-231-117d816fb9" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 87]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-232-8e875ce9e3" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 88]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-233-0a60be5fbc" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 89]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-234-01ad9a0db0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 90]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-235-8a3992468b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 91]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-236-621c6d6a9e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 92]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-237-01ee478666" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 93]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-238-1a8cf8c870" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 94]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-239-a6dada3682" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 95]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-240-77d56a1585" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 96]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-241-e171ef72ce" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 97]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-242-5c198a8490" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 98]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-243-14366a47ff" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 99]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-244-4ccea91f13" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 100]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-245-537356bcf4" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 101]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-246-295f39e09b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 102]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-247-39d6959685" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 103]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-248-d1bc18e068" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 104]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-249-6b8a42981d" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 105]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-250-935ccdb80f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 106]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-251-50acddfb96" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 107]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-252-49e979239e" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 108]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-253-347a2e5fb2" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 109]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-codegen-254-9f340b6a10" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > removes component specific defaults for Flex", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > drops default props and component filtered props", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > indents nested children", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > replaces boxShadow with __boxShadowToken when boxShadow is string", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > does not replace boxShadow with __boxShadowToken when boxShadow is array", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > replaces textShadow with __textShadowToken when textShadow is string", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > does not replace textShadow with __textShadowToken when textShadow is array", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent indentation > single line JSX stays on same line as return", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent indentation > multiline JSX has 4 spaces inside return ()", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent indentation > deeply nested children increment by 2 spaces each level", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent indentation > multiline props are indented correctly", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent indentation > component with variants maintains correct indentation", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent > renders simple component without variants", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent > renders component with variants and multiline code", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent > renders boolean variants as optional in interface", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent > does not infer boolean props from JSX strings when variants are empty", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent with comments > prepends JSDoc comment for variant with comment", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent with comments > does not add comment when comments map is empty", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent with comments > does not add comment when comments is undefined", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent interface snapshot > VARIANT + BOOLEAN + INSTANCE_SWAP mixed interface", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-render-263-d2763f9b9f" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent interface snapshot > BOOLEAN-only interface (all optional)", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-render-264-51e29ada52" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent interface snapshot > INSTANCE_SWAP-only interface (all required)", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-render-265-94e906e79b" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/commands/__tests__/exportAssets.test.ts > exportAssets > runs Codegen for each selected node", + "sourceFile": "src/commands/__tests__/exportAssets.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportAssets.test.ts > exportAssets > handles empty selection", + "sourceFile": "src/commands/__tests__/exportAssets.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should notify and return if no components found", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "section_export::section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should not export components if all children are invisible", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "section_export::section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should export components and call downloadFile", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should raise error", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > DEVUP_COMPONENTS > should contain expected devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract Box import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract multiple devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract keyframes import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should not extract keyframes when not present", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should return sorted imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should not include duplicates", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should extract custom component", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should extract multiple custom components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should not include devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should return sorted imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should not include duplicates", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should return empty array when no custom components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect SVG asset node", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect PNG asset node", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should skip invisible nodes", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should recursively collect from children", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should not descend into asset node children", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should deduplicate by type and name", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect from nested frames", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect both SVG and PNG assets", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should return empty map for non-asset leaf node", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should skip already-visited nodes when visited set is provided", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should skip visited parent node entirely", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should work without visited set (backward compatible)", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "assets::manifest_preserves_image_and_vector_source_details_without_exporting_bytes", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should generate devup-ui import statement", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should generate custom component import statements", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should generate multiple custom component imports on separate lines", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should return empty string when no imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should include keyframes in devup-ui import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should end with double newline when has imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should return the same imports across repeated calls", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "plugin_compat::import_metadata_is_sorted_deduplicated_and_stable", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectSectionNotes > combines non-empty direct text and descendant annotations", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "explore::section_notes_combine_direct_text_and_descendant_annotations", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectSectionNotes > returns an empty string when the section has no notes", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "explore::section_notes_combine_direct_text_and_descendant_annotations", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > exportPagesAndComponents > exports components, pages, notes, screenshots, and assets into a real zip", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > exportPagesAndComponents > uses page children and returns when no components or pages are found", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "section_export::section_requires_selection_then_exports_requested_or_all_screens_from_one_artifact", + "rationale": null + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > exportPagesAndComponents > exports successfully without adding an asset count to the notification", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > exportPagesAndComponents > notifies an error when orchestration throws", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "source_orchestration::direct_fast_call_error_restarts_the_legacy_collector", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/utils/__tests__/download-file.test.ts > downloadFile > should download file", + "sourceFile": "src/utils/__tests__/download-file.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/extract-key-value-from-css-var.test.ts > extractKeyValueFromCssVar > should extract value from css var", + "sourceFile": "src/utils/__tests__/extract-key-value-from-css-var.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/is-variable-alias.test.ts > isVariableAlias > should check variableAlias", + "sourceFile": "src/utils/__tests__/is-variable-alias.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/optimize-rgba-func.test.ts > optimizeRgbaFunc > converts rgba() to hex", + "sourceFile": "src/utils/__tests__/optimize-rgba-func.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/optimize-rgba-func.test.ts > optimizeRgbaFunc > rgb to hex", + "sourceFile": "src/utils/__tests__/optimize-rgba-func.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/optimize-rgba-func.test.ts > optimizeRgbaFunc > converts multiple rgba/rgb in string", + "sourceFile": "src/utils/__tests__/optimize-rgba-func.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/optimize-rgba-func.test.ts > optimizeRgbaFunc > returns original when rgba/rgb not present", + "sourceFile": "src/utils/__tests__/optimize-rgba-func.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts > resolveTextStyleBoundVariable > returns null when boundVariables is undefined", + "sourceFile": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts > resolveTextStyleBoundVariable > returns null when field is not bound", + "sourceFile": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts > resolveTextStyleBoundVariable > returns null when variable is not found", + "sourceFile": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts > resolveTextStyleBoundVariable > returns $camelName when variable is found", + "sourceFile": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts > resolveTextStyleBoundVariable > returns null when variable has no name", + "sourceFile": "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/rgba-to-hex.test.ts > rgbaToHex > should convert rgba to hex", + "sourceFile": "src/utils/__tests__/rgba-to-hex.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/utils/__tests__/style-name-to-typography.test.ts > styleNameToTypography > should convert styleName to Typography", + "sourceFile": "src/utils/__tests__/style-name-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-segment-to-typography.test.ts > textSegmentToTypography > should convert variableAlias to value", + "sourceFile": "src/utils/__tests__/text-segment-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Thin to fontWeight 100", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Extra Light to fontWeight 200", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Light to fontWeight 300", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps 4 to fontWeight 400", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps 4 Normal to fontWeight 400", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Regular to fontWeight 400", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps normal to fontWeight 400", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Medium to fontWeight 500", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Semibold to fontWeight 600 [case 1]", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps SemiBold to fontWeight 600 [case 2]", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Bold to fontWeight 700", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Extra Bold to fontWeight 800", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Black to fontWeight 900", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps Heavy to fontWeight 900", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps 750 to fontWeight 750", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > maps UnknownWeight to fontWeight 400", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > returns base typography when no boundVariables", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > overrides fields with bound variable references", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/text-style-to-typography.test.ts > textStyleToTypography > keeps base value when variable not found", + "sourceFile": "src/utils/__tests__/text-style-to-typography.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/utils/__tests__/to-camel.test.ts > toCamel > should convert camel", + "sourceFile": "src/utils/__tests__/to-camel.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/utils/__tests__/to-pascal.test.ts > toPascal > should convert to pascal case", + "sourceFile": "src/utils/__tests__/to-pascal.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::normalizes_names_to_valid_typescript_identifiers" + }, + { + "testId": "src/utils/__tests__/upload-file.test.ts > uploadFile > should upload file", + "sourceFile": "src/utils/__tests__/upload-file.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/utils/__tests__/upload-file.test.ts > uploadFile > should resolve with decoded value and close UI on message", + "sourceFile": "src/utils/__tests__/upload-file.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/utils/__tests__/variable-alias-to-value.test.ts > variableAliasToValue > should convert variableAlias to value", + "sourceFile": "src/utils/__tests__/variable-alias-to-value.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getPaddingProps resolves node.boundVariables padding variables", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getAutoLayoutProps resolves itemSpacing variable as gap", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps resolves width/height variables on absolute nodes", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps uses sync absolute sizing path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps uses sync fixed sizing path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps uses sync text width path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps resolves text width variable when textAutoResize is HEIGHT", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps returns empty object for variable-backed WIDTH_AND_HEIGHT text", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps falls through NONE text auto resize to fixed variable sizing", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps handles variable-backed fixed sizing in normal flow", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps absolute variable path can leave width undefined for non-asset containers with children", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps variable-backed fill sizing resolves to 100% when max constraints exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getLayoutProps returns fill sizing when parent shrinks width and height", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getMinMaxProps resolves min/max variables with fallback to px", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getMinMaxProps uses sync path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps resolves corner radius variables with shorthand optimization", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps uses sync shorthand path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps uses sync ellipse path when no bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps resolves single cornerRadius variable without corner fields", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps falls back to raw corner shorthand when corner variables are unresolved", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps returns ellipse radius even when unrelated bound variables exist", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps falls back to raw cornerRadius when variable is unresolved", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderProps uses simple stroke fast path for border", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderProps uses simple stroke fast path for outline line", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderProps handles multi-stroke mixed weights path", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps collapses to single value when all corners resolve equal", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps uses three-value shorthand when top-right equals bottom-left only", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps uses two-value shorthand when tl===br and tr===bl", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps uses four-value when all corners differ", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > length bound variables (padding / gap / size / radius) > getBorderRadiusProps falls back to cornerRadius when corner fields are unavailable", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps resolves effectStyleId token and boundVariables in shadow string", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps does not set __boxShadowToken when style has no name", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps does not set __boxShadowToken when effectStyleId is empty", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps falls back to raw values when bound variable ids are unresolved", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps uses fast path for simple inner shadow without variables", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps resolves bound variables for inner shadow", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps handles blur and texture filters", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getEffectProps handles noise and glass effects", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getTextShadowProps resolves effect style token and bound variables", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getTextShadowProps does not set __textShadowToken when style has no name", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getTextShadowProps does not set __textShadowToken when effectStyleId is empty", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/bound-variables.test.ts > effect/text-shadow bound variables and style tokens > getTextShadowProps falls back to raw values when bound variable ids are unresolved", + "sourceFile": "src/codegen/props/__tests__/bound-variables.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::nested_text_style_uses_typography" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns empty object when node has no reactions property", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns empty object when node.reactions is null", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns empty object when node.reactions is empty array", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns cursor: pointer when reaction has ON_CLICK trigger", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns empty object when reaction has non-click trigger", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns cursor: pointer when any reaction has ON_CLICK trigger among multiple", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/cursor.test.ts > getCursorProps > returns empty object when reaction trigger is undefined", + "sourceFile": "src/codegen/props/__tests__/cursor.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/effect.test.ts > getEffectProps > contributes no CSS for an unknown/unsupported effect type", + "sourceFile": "src/codegen/props/__tests__/effect.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > canBeAbsolute > position > should return true for ABSOLUTE positioned node", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > canBeAbsolute > position > should return true for AUTO positioned node in freelayout parent with constraints", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > canBeAbsolute > position > should return false for AUTO positioned node in freelayout parent without constraints", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > canBeAbsolute > position > should return false for node without parent", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return absolute position props with constraints", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return absolute position props in freelayout using fallback x/y", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return undefined when no constraints in freelayout and canBeAbsolute is false", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return absolute position with x/y when ABSOLUTE node has no constraints in freelayout parent", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return undefined when no constraints and parent is not freelayout (line 43)", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return relative position for parent with absolute children", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return relative position for freelayout parent with AUTO children", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should handle MAX constraints", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should handle CENTER constraints (default case)", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should get constraints from children[0] when node has no constraints", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should return undefined when children[0] exists but has no constraints and parent is not freelayout", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should handle SCALE horizontal constraint (default case)", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should handle STRETCH vertical constraint (default case)", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/position.test.ts > getPositionProps > position > should handle both SCALE constraints (default case for both)", + "sourceFile": "src/codegen/props/__tests__/position.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::embedded_root_omits_only_selected_frame_geometry_and_position" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return empty object when node has no reactions", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return empty object when reactions array is empty", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should generate animation props for SMART_ANIMATE transition", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle opacity change", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle position change", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle background color change", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return empty object when no changes detected", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle different easing functions", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle animation chains with multiple nodes", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should prevent circular references", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should prevent infinite loops with self-referencing nodes", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should match children by name and generate individual child animations", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should detect loop animations and add infinite iteration count with 100% returning to initial", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return cached child animation from parent cache", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle failed node lookup gracefully", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle DOCUMENT or PAGE node types", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle animation chain error gracefully", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should match children by name with loop and delay", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle children with no matching nodes in some steps", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle parent and child nodes without children prop", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return empty when child not found in cache", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle node with direct self-loop (currentNodeId === startNode.id)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle chain with nested loop detection (isLoop propagation)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle visited node in recursive chain (line 284)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle children without matching in prev/current nodes (line 413)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle firstChild missing in animation (line 465-466)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should return cached child animation when cache exists for child name (line 41-43)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle when parent cache exists but child name not in cache (line 43)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle rotation animation with cumulative rotation in loop (lines 188-193, 201, 290-295)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle child rotation animation (lines 484, 505-506, 540-542, 553, 565-566, 607-612, 641-646)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle rotation delta greater than 180 degrees (line 758)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle rotation with multi-step chain (covers cumulative rotation)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should set rotate(0deg) when hasRotationAnimation but no initialValues.transform (line 201)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/reaction.test.ts > getReactionProps > should handle child rotation with starting values from startChild (lines 538-542)", + "sourceFile": "src/codegen/props/__tests__/reaction.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > returns undefined for non-COMPONENT_SET node", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > handles componentPropertyDefinitions with effect property", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > handles COMPONENT node with COMPONENT_SET parent", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > includes BOOLEAN properties as boolean in variants", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > includes single TEXT property as children: React.ReactNode in variants", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > getSelectorProps > includes INSTANCE_SWAP properties as React.ReactNode in variants", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > returns variant for numeric-only property name", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > returns variant for empty property name after cleaning", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > converts Korean 속성 to property in property names", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > converts 속성1 variant name to property1", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > converts property name with spaces and special chars to camelCase", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > sanitizePropertyName > getSelectorProps > sanitizes property name that starts with digit", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > applyTextChildrenTransform > getSelectorProps > returns unchanged variants when no TEXT props", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > applyTextChildrenTransform > getSelectorProps > transforms single TEXT prop to children", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > applyTextChildrenTransform > getSelectorProps > returns unchanged variants when 2+ TEXT props", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > triggerTypeToEffect > getSelectorProps > handles ON_HOVER trigger type", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > triggerTypeToEffect > getSelectorProps > handles ON_PRESS trigger type", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > triggerTypeToEffect > getSelectorProps > handles effect-only COMPONENT_SET with solid button", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/props/__tests__/selector.test.ts > triggerTypeToEffect > getSelectorProps > handles SMART_ANIMATE transition with reactions", + "sourceFile": "src/codegen/props/__tests__/selector.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::records_explicit_diagnostics_for_unsupported_visuals" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > maps width to breakpoint boundaries", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > groups children by breakpoint", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > optimizes responsive values by collapsing duplicates and trimming", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > groups nodes by name for responsive matching", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > handles object equality and empty optimized array", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > collapses equal array values in responsive optimization", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > converts viewport variant values to breakpoints (case-insensitive)", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/index.test.ts > responsive index helpers > replaces a collapsed string shadow with its effectStyle token", + "sourceFile": "src/codegen/responsive/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > returns props as-is for single breakpoint", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > keeps responsive array when values differ", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > single pc breakpoint keeps value", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > multiple breakpoints with different values", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > multiple breakpoints with same values", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > all breakpoints undefined values are omitted", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > all breakpoints null values are omitted", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > mix of null and undefined still omitted when no value", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > later breakpoint provides value after null/undefined", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > repeat value collapses to single when identical [case 1]", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > display value collapses to single when identical [case 1]", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > display value collapses to single when identical [case 2]", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > repeat value collapses to single when identical [case 2]", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > mobile only value with tablet and pc breakpoints needs initial at tablet position", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > display none at mobile, flex at tablet and pc should produce responsive array", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > flexDir column at mobile, row at tablet and pc should produce responsive array", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > alignItems with default value at first should become null", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > justifyContent with default value at first should become null", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > flexDir with default value (row) at first should become null", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > mergePropsToResponsive > all default values should be omitted (empty result)", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > groups children by breakpoint without reallocating existing buckets", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces boxShadow with __boxShadowToken when single breakpoint", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces boxShadow with __boxShadowToken when all breakpoints collapse", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces per-element token in responsive array", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces textShadow with __textShadowToken when single breakpoint", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces per-element textShadow token in responsive array", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > replaces collapsed textShadow string with token after multi-breakpoint merge", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts > responsive grouping helpers > groups nodes by name across breakpoints", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > returns props as-is for single variant", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > returns single value when all variants have same value", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > creates VariantPropValue when variants have different values", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > handles responsive arrays within variants", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > filters out null values from variant object", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > omits props when all values are null", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > handles mixed props - some same, some different", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > handles props that exist only in some variants", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > handles three or more variants", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > mergePropsToVariant > handles pseudo-selector present in only some variants", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > isVariantPropValue > returns true for VariantPropValue", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > isVariantPropValue > returns false for plain object", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > isVariantPropValue > returns false for array", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > isVariantPropValue > returns false for primitives", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts > createVariantPropValue > creates correct structure", + "sourceFile": "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > returns message when no responsive variants exist", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > falls back to single breakpoint generation using Codegen", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > returns import metadata from generateResponsiveResult", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > merges import metadata across multiple breakpoints in generateResponsiveResult", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > exposes stable structural child keys for unique leaf children", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > computes structural signatures for non-leaf children recursively", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > merges breakpoints and adds display for missing child variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > uses Codegen.renderTree for single breakpoint", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > static helpers detect section and parent section", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > generateViewportResponsiveComponents returns empty when no viewport variant", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > generateViewportResponsiveComponents processes non-viewport variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > handles component without viewport in variantProperties", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > handles null sectionNode in constructor", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > ResponsiveCodegen > sorts multiple non-viewport variants alphabetically", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > merges props across variants with conditional syntax", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > renders conditional nodes for variant-only children", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > merges children that exist in all variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > renders OR conditional for child existing in multiple but not all variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-responsive-266-4cd888ffd0" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > prepends BOOLEAN condition on partial children (single variant, single value)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > prepends BOOLEAN condition on partial children (single variant, multiple values)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > prepends BOOLEAN condition on partial children (multi-variant, single controlling key)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > does not prepend condition when partial children have different conditions", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > does not prepend condition when partial children have no condition", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode > ResponsiveCodegen > falls back to conditional full trees when root components differ across variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > createNestedVariantProp optimization > ResponsiveCodegen > minimizes nesting by choosing the best outer variant key", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > createNestedVariantProp optimization > ResponsiveCodegen > uses any key when all have equal nesting cost", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantMergedCode > ResponsiveCodegen > merges trees across both viewport and variant dimensions", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantMergedCode > ResponsiveCodegen > merges children across viewport and variant dimensions", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles component set with only non-viewport variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles component set with multiple non-viewport variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles component set with multiple non-viewport variants and effect", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > delegates to generateViewportResponsiveComponents when only viewport exists", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles both viewport and other variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > covers viewport-only import metadata aggregation callbacks", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > covers viewport+variant import metadata aggregation callbacks", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > prefers collapsed asset trees for non-viewport variants when the built tree is already an asset leaf", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles effect + viewport + size + variant (4 dimensions)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-responsive-267-88b21cad2a" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles responsive pseudo-selector props (different hover colors per viewport)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles hover only on desktop (no hover on mobile)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles hover prop existing only in some variants (outline only in white)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles effect-only component set (no viewport, no other variants)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > handles effect-only component set returning empty when no defaultVariant", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantResponsiveComponents > ResponsiveCodegen > prefers variant key with fewer entries via createNestedVariantProp", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > mergeTextChildrenAcrossBreakpoints > ResponsiveCodegen > merges text with \\n differences using responsive br display", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > mergeTextChildrenAcrossBreakpoints > ResponsiveCodegen > keeps simple br when all breakpoints have the same line breaks", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > mergeTextChildrenAcrossBreakpoints > ResponsiveCodegen > returns first text when only one breakpoint has text", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > mergeTextChildrenAcrossBreakpoints > ResponsiveCodegen > generates responsive br display when only some breakpoints have line breaks", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > mergeTextChildrenAcrossBreakpoints > ResponsiveCodegen > returns empty array when no breakpoints have text", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > calculateNestingCost > ResponsiveCodegen > returns 0 for scalar values", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > calculateNestingCost > ResponsiveCodegen > returns 0 for null values", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > calculateNestingCost > ResponsiveCodegen > returns 1 for simple variant prop", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > calculateNestingCost > ResponsiveCodegen > returns 2 for nested variant prop", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode with textChildren > ResponsiveCodegen > handles TEXT nodes with textChildren", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateNestedVariantMergedCode with textChildren > ResponsiveCodegen > handles TEXT nodes with textChildren in nested variant", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateMergedCode with isComponent > ResponsiveCodegen > handles component nodes without position props", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateMergedCode with isComponent > ResponsiveCodegen > handles component nodes with position props", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateMergedCode with isComponent > ResponsiveCodegen > handles component nodes with reserved variant keys (effect, viewport)", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateMergedCode with WRAPPER nodeType > ResponsiveCodegen > handles WRAPPER nodes with inner component", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateMergedCode with WRAPPER nodeType > ResponsiveCodegen > handles WRAPPER nodes without children", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateNestedVariantMergedCode partial children with multiple presentValues > ResponsiveCodegen > generates OR condition when child exists in multiple values of controlling key", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateNestedVariantMergedCode with no single controlling key > ResponsiveCodegen > generates combined AND/OR condition when multiple keys control presence", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode with differing textChildren > ResponsiveCodegen > creates variant-mapped text when texts differ across variants", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateVariantOnlyMergedCode with structurally equivalent asset children > ResponsiveCodegen > merges asset-like children even when node names differ", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_snapshot", + "fixtureIds": [ + "upstream-responsive-268-7dd1d5c323" + ], + "rustTest": "compat_fixtures::upstream_json_goldens" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > private helper coverage > ResponsiveCodegen > covers parseCompositeKey, getSharedCondition, mergeChildrenAcrossBreakpoints, and mergePropsAcrossComposites", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateNestedVariantMergedCode with differing textChildren controlled by one key > ResponsiveCodegen > creates variant-mapped text when texts differ and one key controls the text", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > generateNestedVariantMergedCode with mixed root components > ResponsiveCodegen > falls back to composite-conditional full trees when root components differ", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > child ordering across variants > ResponsiveCodegen > preserves relative child order when merging variants with different children", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts > child ordering across variants > ResponsiveCodegen > preserves order in nested variant merge with multiple child types", + "sourceFile": "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should add getMainComponentAsync mock to INSTANCE node", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should setup variable mocks when variables provided", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should add getMainComponentAsync to non-INSTANCE nodes", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should link children by id references", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should filter out undefined children", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > TEXT node getStyledTextSegments should return stored segments", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > TEXT node getStyledTextSegments should generate default segment when no styledTextSegments", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should handle children that are already NodeData objects", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should fallback to first node when all nodes have parent set", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should convert node-level boundVariables arrays from string ids", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should convert node-level boundVariables scalar string ids", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > assembleNodeTree > should convert effect-level boundVariables from string ids", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > setupVariableMocks > should setup figma.variables.getVariableByIdAsync mock", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/assemble-node-tree.test.ts > setupVariableMocks > should fallback to original mock when variable not found", + "sourceFile": "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns svg + sameColor for a component with one solid vector child", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for excluded root types", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for animation targets", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns svg for ellipse with inner radius", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns svg for star nodes", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > keeps sameColor null when wrapper has non-solid own fill", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns svg for nested asset leaf with all solid fills", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for asset leaf with no fills metadata", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for non-nested asset leaf with only solid fills", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for tile/pattern asset leaf", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for asset leaf with multiple image fills", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns png for asset leaf with a single image fill", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns svg for nested non-asset leaf with solid fills only", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null for non-nested non-asset leaf", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns false sameColor for multi-child svg asset with conflicting own solid colors", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null when single-child wrapper has padding", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null when a multi-child wrapper has a non-svg child", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null when non-solid own color wrapper also has a non-svg child", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > returns null when conflicting own solid colors wrapper also has a non-svg child", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-asset-node.test.ts > analyzeAssetNode > single-child wrapper delegates to child analysis when clean", + "sourceFile": "src/codegen/utils/__tests__/check-asset-node.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-same-color.test.ts > checkSameColor cache > returns cached null when called again with a target color", + "sourceFile": "src/codegen/utils/__tests__/check-same-color.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-same-color.test.ts > checkSameColor cache > returns cached false when called again with a target color", + "sourceFile": "src/codegen/utils/__tests__/check-same-color.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-same-color.test.ts > checkSameColor cache > compares target color against cached uniform color", + "sourceFile": "src/codegen/utils/__tests__/check-same-color.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/check-same-color.test.ts > checkSameColor cache > resolves variable-bound solid colors through async path", + "sourceFile": "src/codegen/utils/__tests__/check-same-color.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/collect-import-metadata.test.ts > collectImportMetadataFromTree > collects devup imports, custom imports, keyframes, arrays, and slot metadata", + "sourceFile": "src/codegen/utils/__tests__/collect-import-metadata.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/collect-import-metadata.test.ts > collectImportMetadataFromTree > skips current component name from custom imports", + "sourceFile": "src/codegen/utils/__tests__/collect-import-metadata.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/collect-import-metadata.test.ts > mergeImportMetadata > merges and deduplicates import metadata", + "sourceFile": "src/codegen/utils/__tests__/collect-import-metadata.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > extracts VARIANT type props with sanitized keys", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > extracts BOOLEAN type props when value is true", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > ignores BOOLEAN type props when value is false", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > returns empty object when componentProperties is undefined", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > returns empty object when componentProperties is null", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > handles Korean property names (속성 -> property)", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > converts values to string", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > handles simple property names without node IDs", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > filters out reserved \"effect\" variant key", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > filters out reserved \"viewport\" variant key", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > returns empty object when componentProperties getter throws", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts > extractInstanceVariantProps > filters out both effect and viewport but keeps other variants", + "sourceFile": "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts > getComponentPropertyDefinitions > returns definitions from a valid node", + "sourceFile": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts > getComponentPropertyDefinitions > returns empty object when node is null", + "sourceFile": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts > getComponentPropertyDefinitions > returns empty object when node is undefined", + "sourceFile": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts > getComponentPropertyDefinitions > returns empty object when getter throws", + "sourceFile": "src/codegen/utils/__tests__/get-component-property-definitions.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should track property access", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should serialize complex values", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should deduplicate repeated access", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should output JSON format", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should output test case format", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should clear logs", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should exclude functions from tracking", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should track multiple nodes separately", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should track TEXT node with styledTextSegments when accessed as child", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should track children nodes recursively", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should return flat node list with toNodeList", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should resolve node references in toNodeList", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should handle filterByRoot with nested children", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should serialize array-like objects correctly", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should track deeply nested children recursively", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormat should filter nodes by rootId", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormat should return all nodes when rootId not found", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormat should include SECTION parent", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormat handles deeply nested children filtering", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > should handle array-like objects in serializeArray", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormatWithVariables should collect variable info from fills", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormatWithVariables should collect variables from nested objects", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormatWithVariables should collect variables from arrays", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > toTestCaseFormatWithVariables should collect variables from direct array of variable refs", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > trackTree should track all nodes without Proxy overhead", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > trackTree should track TEXT nodes with styledTextSegments", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > trackTree should skip already-tracked nodes", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > re-exported assembleNodeTree works from node-proxy", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/node-proxy.test.ts > nodeProxyTracker > re-exported setupVariableMocks works from node-proxy", + "sourceFile": "src/codegen/utils/__tests__/node-proxy.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::standalone_instance_inlining_uses_resolved_children_not_component_props" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > falls back to sync optimizeSpace when no boundVariables", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > falls back to sync optimizeSpace when bindings exist but variables do not resolve", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > returns shorthand p when all sides resolve to same token", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > supports margin field mapping with variable + raw mix", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > returns all individual sides when shorthand conditions do not match", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > returns py/px shorthand when vertical and horizontal sides match", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/optimize-space.test.ts > optimizeSpaceAsync > returns py + side props when only top and bottom match", + "sourceFile": "src/codegen/utils/__tests__/optimize-space.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts image paint with TILE scaleMode to repeat url", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts pattern paint with alignments and spacing", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > returns null for unsupported paint type", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts linear gradient with color token", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts linear gradient with color token and opacity < 1", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts radial gradient with color token and opacity", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts angular gradient with color token", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts diamond gradient with color token and partial opacity", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts gradient with boundVariable but no variable name (fallback)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts radial gradient with boundVariable but no variable found", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts angular gradient with boundVariable but no variable found", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts diamond gradient with boundVariable but no variable found", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts diamond gradient with color token and full opacity (no color-mix)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts angular gradient with color token and full opacity (no color-mix)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts angular gradient with color token and partial opacity (with color-mix)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts diamond gradient without color token (regular color)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts angular gradient without color token (regular color)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts radial gradient without color token (regular color)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts radial gradient with color token and full opacity (line 223)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > returns null when linear gradient is not visible", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts image paint with FILL scaleMode", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts image paint with FIT scaleMode", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts image paint with CROP scaleMode", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts solid paint when last is false (transparent)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts pattern with CENTER alignment", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts gradient with token and finalAlpha = 1 (line 222)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts pattern with START alignment and zero spacing (line 288)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > converts solid to linear gradient when not last and opacity > 0 (line 295-296)", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > returns transparent when image is not visible", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/paint-to-css.test.ts > paintToCSS > returns transparent when image opacity is 0", + "sourceFile": "src/codegen/utils/__tests__/paint-to-css.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > sorts uppercase keys first and formats booleans/strings", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > omits assignment for boolean true", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > sort comparator handles lower then upper keys", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > formats objects with newlines when many props", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles empty props", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles animationName with keyframes function", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles animationName with invalid keyframes JSON", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles animationName starting with keyframes but no parentheses match", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles animationName without keyframes prefix", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles object values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with simple values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with array values (responsive)", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with numeric values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > VariantPropValue triggers newline separator between props", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with object values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with boolean values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with undefined values in array", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with symbol values (fallback case)", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles pseudo-selector prop with nested VariantPropValue", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles pseudo-selector prop with nested object containing VariantPropValue", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with single entry (conditional format)", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with single entry containing spaces in key", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with null values", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles pseudo-selector prop with deeply nested objects", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles pseudo-selector prop with array value inside object", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with nested VariantPropValue in multiline format", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles number and boolean in conditional format", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles array in inline format", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles nested VariantPropValue in conditional format", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles plain object in inline format", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles nested arrays with complex items", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles array with VariantPropValue items", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > valueToJsxString handles fallback to String() for unknown types", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > formatObjectValue handles function value in pseudo-selector", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with keys containing spaces", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with keys containing special characters", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > handles VariantPropValue with valid identifier keys (no quotes)", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > typography prop uses as const for literal type inference", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > typography prop with single entry uses as const (not conditional)", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > non-typography prop does not use as const", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > renders __jsxSlot values as unquoted JSX expressions", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > renders __jsxSlot values with multiline JSX", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/props-to-str.test.ts > propsToString > renders mixed __jsxSlot and regular props", + "sourceFile": "src/codegen/utils/__tests__/props-to-str.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts > resolveBoundVariable > returns variable token when bound variable exists", + "sourceFile": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts > resolveBoundVariable > returns null when field has no bound variable", + "sourceFile": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts > resolveBoundVariable > returns null when variable lookup has no name", + "sourceFile": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts > hasBoundVariable > returns true when field has a variable binding", + "sourceFile": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts > hasBoundVariable > returns false when field does not have a variable binding", + "sourceFile": "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/solid-to-string.test.ts > solidToString caching > reuses cached sync solid color result", + "sourceFile": "src/codegen/utils/__tests__/solid-to-string.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/solid-to-string.test.ts > solidToString caching > reuses cached async variable-bound solid color result", + "sourceFile": "src/codegen/utils/__tests__/solid-to-string.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/solid-to-string.test.ts > solidToString caching > async path reuses color cached by sync path", + "sourceFile": "src/codegen/utils/__tests__/solid-to-string.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/solid-to-string.test.ts > solidToString caching > returns transparent for zero-opacity solid paint", + "sourceFile": "src/codegen/utils/__tests__/solid-to-string.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/solid-to-string.test.ts > solidToString caching > falls back to raw color when bound variable lookup misses", + "sourceFile": "src/codegen/utils/__tests__/solid-to-string.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/wrap-url.test.ts > buildCssUrl > keeps simple paths unquoted", + "sourceFile": "src/codegen/utils/__tests__/wrap-url.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/wrap-url.test.ts > buildCssUrl > wraps paths with spaces", + "sourceFile": "src/codegen/utils/__tests__/wrap-url.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/codegen/utils/__tests__/wrap-url.test.ts > buildCssUrl > escapes single quotes inside path", + "sourceFile": "src/codegen/utils/__tests__/wrap-url.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "codegen::generates_deterministic_devup_ui_tsx" + }, + { + "testId": "src/commands/devup/__tests__/apply-typography.test.ts > applyTypography > applies typography to a newly created style", + "sourceFile": "src/commands/devup/__tests__/apply-typography.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma text style 또는 문서 대상을 생성·수정한다. devup-mcp는 read-only이므로 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/apply-typography.test.ts > applyTypography > notifies on font load failure and leaves style untouched", + "sourceFile": "src/commands/devup/__tests__/apply-typography.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma text style 또는 문서 대상을 생성·수정한다. devup-mcp는 read-only이므로 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/apply-typography.test.ts > applyTypography > applies px letterSpacing and percent lineHeight on existing style", + "sourceFile": "src/commands/devup/__tests__/apply-typography.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma text style 또는 문서 대상을 생성·수정한다. devup-mcp는 read-only이므로 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/apply-typography.test.ts > applyTypography > applies string lineHeight as pixels", + "sourceFile": "src/commands/devup/__tests__/apply-typography.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma text style 또는 문서 대상을 생성·수정한다. devup-mcp는 read-only이므로 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/export-devup.coverage.test.ts > export-devup branch coverage > non-treeshaking loads other pages, recurses children, and drops an empty length map", + "sourceFile": "src/commands/devup/__tests__/export-devup.coverage.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.coverage.test.ts > export-devup branch coverage > treeshaking walks children of text-search nodes for bound vars", + "sourceFile": "src/commands/devup/__tests__/export-devup.coverage.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.coverage.test.ts > export-devup branch coverage > resolves FLOAT length values that are variable aliases", + "sourceFile": "src/commands/devup/__tests__/export-devup.coverage.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.coverage.test.ts > export-devup branch coverage > collectVariableSources loads non-current pages, walks nested children, and annotates a bound local var", + "sourceFile": "src/commands/devup/__tests__/export-devup.coverage.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > exports FLOAT variables with full breakpoint mapping and color theme resolution", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > treeshaking scans bound variables and includes library FLOAT vars", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > exports FLOAT variables to default theme when colors are missing", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > exports effect styles as shadow with level prefixes and theme wrapper", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > exports color aliases and removes empty length theme buckets", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > replicates length and shadow values for all color themes", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts > export-devup length and shadow coverage > exportDevup sends excel output to xlsx downloader", + "sourceFile": "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts > import-devup length and shadow coverage > imports length as FLOAT variables for single and responsive values", + "sourceFile": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts > import-devup length and shadow coverage > imports shadow styles and parses hex, rgba, inset and multiple shadows", + "sourceFile": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts > import-devup length and shadow coverage > loads excel payload path and exits safely for empty theme", + "sourceFile": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts > import-devup length and shadow coverage > imports length reusing an existing collection mode", + "sourceFile": "src/commands/devup/__tests__/import-devup.length-shadow.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.test.ts > import-devup (standalone file) > returns early when theme is missing", + "sourceFile": "src/commands/devup/__tests__/import-devup.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.test.ts > import-devup (standalone file) > imports colors and typography from excel payload", + "sourceFile": "src/commands/devup/__tests__/import-devup.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.test.ts > import-devup (standalone file) > removes only variables from the Devup color collection", + "sourceFile": "src/commands/devup/__tests__/import-devup.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/import-devup.test.ts > import-devup (standalone file) > imports array typography and skips nulls", + "sourceFile": "src/commands/devup/__tests__/import-devup.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup exports colors and downloads json", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake false exports typography and downloads excel", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake true handles variable aliases and segments", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake true handles mixed-style text nodes", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake true stops typography within current page subtree but loads all pages for bound vars", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake true lazily loads later pages when needed", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup treeshake true handles direct text children and recursive fallback nodes", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup fills missing typography levels from styles map", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup builds typography array when first level missing", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup keeps full array when first level exists", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup filters out empty typography entries", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup notifies and skips json download when variable names collide across collections", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > exportDevup exports excel when a text style shares a name with a color variable", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module/handler, command, notify 또는 browser download 수명주기에 의존한다. 대응 Rust MCP boundary와 오류 fallback contract를 실행한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > importDevup creates colors and typography from json", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > importDevup handles excel input with modes and removal", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > importDevup notifies when font load fails and covers letterSpacing/lineHeight", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > devup commands > importDevup sets typography spacing values", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > returns empty map when no theme is defined", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > returns empty map when each name lives in a single category", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > reports a name shared between colors and length", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > ignores typography names shared with every other category", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > reports a name occurring in three categories", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > deduplicates a name appearing in multiple themes of the same category", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > findDuplicateVariableNames > annotates duplicates with variable sources when provided", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > collectVariableSources > indexes COLOR and FLOAT variables by camelCased name with collection + origin", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > collectVariableSources > locates library/bound variables that are absent from local collections", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > formatDuplicateReport > shows collection + origin for variable-backed categories and a hint otherwise", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::resolves_token_conflicts_deterministically_across_input_orders", + "rationale": null + }, + { + "testId": "src/commands/devup/__tests__/index.test.ts > buildDevupConfig > excludes remote/library bound variables from length (only current-file collections)", + "sourceFile": "src/commands/devup/__tests__/index.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::node_scope_keeps_used_alias_dependencies_and_excludes_unused_resources", + "rationale": null + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx > should call showUI with correct HTML string and visible false", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx > should set onmessage handler and post message", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx > should return a promise that resolves when onmessage is called", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx > should handle different file names and data", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx > notifies when the iframe reports a failure instead of closing silently", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx iframe script > writes both sheets and answers without an error", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx iframe script > exports a file that has no color variables", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx iframe script > exports a file that has no text styles", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx iframe script > exports an empty config", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts > downloadDevupXlsx iframe script > answers with the error instead of leaving the plugin pending", + "sourceFile": "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/get-devup-color-collection.test.ts > getDevupColorCollection > should get Devup Color Collection", + "sourceFile": "src/commands/devup/utils/__tests__/get-devup-color-collection.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json" + }, + { + "testId": "src/commands/devup/utils/__tests__/get-devup-color-collection.test.ts > getDevupColorCollection > should return null if Devup Color Collection not found", + "sourceFile": "src/commands/devup/utils/__tests__/get-devup-color-collection.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "theme::maps_variables_modes_aliases_and_styles_to_devup_json" + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx > should call showUI with correct HTML string", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx > should resolve with parsed JSON when message is received", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx > should handle message with colors and typography", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx > notifies and still resolves when the iframe reports a failure", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx iframe script > parses both sheets into a devup config", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx iframe script > imports a workbook without a Colors sheet", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx iframe script > imports a workbook without a Typography sheet", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "out_of_scope_write", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_expose_only_read_operations", + "rationale": "원본 동작은 Figma 문서, style 또는 import 대상을 생성·수정한다. devup-mcp의 read-only 경계와 내장 script mutation 비포함 contract로 실행 금지를 검증한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx iframe script > answers with the error instead of leaving the plugin pending", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + }, + { + "testId": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts > uploadDevupXlsx iframe script > answers when the file itself cannot be read", + "sourceFile": "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "stdio_tools::exposes_the_seven_read_only_devup_figma_tools", + "rationale": "원본 동작은 Figma plugin module 등록, iframe, command, notify 또는 browser download 수명주기에 의존한다. devup-mcp에서는 명시적인 read-only MCP tool surface contract가 이 경계를 대체한다." + } + ] +} diff --git a/fixtures/devup-figma-plugin/manifest.json b/fixtures/devup-figma-plugin/manifest.json new file mode 100644 index 0000000..803eec7 --- /dev/null +++ b/fixtures/devup-figma-plugin/manifest.json @@ -0,0 +1,2221 @@ +{ + "schemaVersion": 1, + "source": { + "repository": "https://github.com/dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515" + }, + "baseline": { + "testFiles": 54, + "passed": 978, + "failed": 0, + "snapshots": 268, + "assertions": 1974 + }, + "counts": { + "cases": 268, + "snapshots": 268, + "ledgerEntries": 978 + }, + "sourceTestFiles": [ + "src/__tests__/code-responsive.test.ts", + "src/__tests__/code.test.ts", + "src/__tests__/utils.test.ts", + "src/codegen/__tests__/codegen-viewport.test.ts", + "src/codegen/__tests__/codegen.test.ts", + "src/codegen/__tests__/render.test.ts", + "src/codegen/props/__tests__/bound-variables.test.ts", + "src/codegen/props/__tests__/cursor.test.ts", + "src/codegen/props/__tests__/effect.test.ts", + "src/codegen/props/__tests__/position.test.ts", + "src/codegen/props/__tests__/reaction.test.ts", + "src/codegen/props/__tests__/selector.test.ts", + "src/codegen/responsive/__tests__/index.test.ts", + "src/codegen/responsive/__tests__/mergePropsToResponsive.test.ts", + "src/codegen/responsive/__tests__/mergePropsToVariant.test.ts", + "src/codegen/responsive/__tests__/ResponsiveCodegen.test.ts", + "src/codegen/utils/__tests__/assemble-node-tree.test.ts", + "src/codegen/utils/__tests__/check-asset-node.test.ts", + "src/codegen/utils/__tests__/check-same-color.test.ts", + "src/codegen/utils/__tests__/collect-import-metadata.test.ts", + "src/codegen/utils/__tests__/extract-instance-variant-props.test.ts", + "src/codegen/utils/__tests__/get-component-property-definitions.test.ts", + "src/codegen/utils/__tests__/node-proxy.test.ts", + "src/codegen/utils/__tests__/optimize-space.test.ts", + "src/codegen/utils/__tests__/paint-to-css.test.ts", + "src/codegen/utils/__tests__/props-to-str.test.ts", + "src/codegen/utils/__tests__/resolve-bound-variable.test.ts", + "src/codegen/utils/__tests__/solid-to-string.test.ts", + "src/codegen/utils/__tests__/wrap-url.test.ts", + "src/commands/__tests__/exportAssets.test.ts", + "src/commands/__tests__/exportComponents.test.ts", + "src/commands/__tests__/exportPagesAndComponents.test.ts", + "src/commands/devup/__tests__/apply-typography.test.ts", + "src/commands/devup/__tests__/export-devup.coverage.test.ts", + "src/commands/devup/__tests__/export-devup.length-shadow.test.ts", + "src/commands/devup/__tests__/import-devup.length-shadow.test.ts", + "src/commands/devup/__tests__/import-devup.test.ts", + "src/commands/devup/__tests__/index.test.ts", + "src/commands/devup/utils/__tests__/download-devup-xlsx.test.ts", + "src/commands/devup/utils/__tests__/get-devup-color-collection.test.ts", + "src/commands/devup/utils/__tests__/upload-devup-xlsx.test.ts", + "src/utils/__tests__/download-file.test.ts", + "src/utils/__tests__/extract-key-value-from-css-var.test.ts", + "src/utils/__tests__/is-variable-alias.test.ts", + "src/utils/__tests__/optimize-rgba-func.test.ts", + "src/utils/__tests__/resolve-text-style-bound-variable.test.ts", + "src/utils/__tests__/rgba-to-hex.test.ts", + "src/utils/__tests__/style-name-to-typography.test.ts", + "src/utils/__tests__/text-segment-to-typography.test.ts", + "src/utils/__tests__/text-style-to-typography.test.ts", + "src/utils/__tests__/to-camel.test.ts", + "src/utils/__tests__/to-pascal.test.ts", + "src/utils/__tests__/upload-file.test.ts", + "src/utils/__tests__/variable-alias-to-value.test.ts" + ], + "files": [ + { + "path": "cases/codegen/upstream-codegen-001-4410624749.json", + "sha256": "4b05d62b77c23c5077d3f17764756ae2eaa38b96ba70d83a66748885064a5f02" + }, + { + "path": "cases/codegen/upstream-codegen-002-c1ac954cb6.json", + "sha256": "aa1138927680622776518ef791152f729ad7353453f4ae4a178b9126b41337b0" + }, + { + "path": "cases/codegen/upstream-codegen-003-c855738695.json", + "sha256": "d231e658695c5f133abc8185b2c5d3eae0381b049b4b5f9947a4fc9635ee1867" + }, + { + "path": "cases/codegen/upstream-codegen-004-8ec61c5bb5.json", + "sha256": "99f7d7b71588ccea9e3f2ee62e483c90a66a474c61ef93907551b77ec5bfcb63" + }, + { + "path": "cases/codegen/upstream-codegen-005-bcc6ca7dbf.json", + "sha256": "94cab0f16ddfa3a497ee286a54bd6a345411fb0caa711b04b2f4dcb52b3c6154" + }, + { + "path": "cases/codegen/upstream-codegen-006-86c21dc8ce.json", + "sha256": "d001f83741348826429357939c95780bae330b907b88ec934aa959f0b0e8a61a" + }, + { + "path": "cases/codegen/upstream-codegen-007-c1c1afa5d7.json", + "sha256": "4ea0815ae07079548e054cf30ead05bf47b2d1de5a4ac612d75a2210adb4956c" + }, + { + "path": "cases/codegen/upstream-codegen-008-8ea06a6c88.json", + "sha256": "69a49ed464a955bfa49223655b45e1e8e4c398d760148844e500e0e9574de609" + }, + { + "path": "cases/codegen/upstream-codegen-009-008aac1a2c.json", + "sha256": "dcadc55dcd61320c346213b75565c9db6e67497eff4e8dd4912a84f5cd0c5e72" + }, + { + "path": "cases/codegen/upstream-codegen-010-8454d22acd.json", + "sha256": "5dfbd86a40e8ddd99c39d9e4d175b59f48e6cbcf8e087540095ab4f7935700bc" + }, + { + "path": "cases/codegen/upstream-codegen-011-72709aab82.json", + "sha256": "1a0f34f27f16fb4858d9e66a1a03aed1874cd70cdddb7214d1f75f9ea1d281a5" + }, + { + "path": "cases/codegen/upstream-codegen-012-92c671c0e8.json", + "sha256": "08e2514af8dfa8a0579ee34b8bd083d024374f38d8d1f2fc83c1811bb4890984" + }, + { + "path": "cases/codegen/upstream-codegen-013-351e69a13b.json", + "sha256": "0f70718bd31ad406de3297e649400eab997324608e3802d5b51e34a486f6d51b" + }, + { + "path": "cases/codegen/upstream-codegen-014-828c466260.json", + "sha256": "a0bb8fb8c89fb0056c3a33ea682bcfcdb5a58147c5a434974f287707a32464e1" + }, + { + "path": "cases/codegen/upstream-codegen-015-eaef178e47.json", + "sha256": "2618706e0cad62cd11e69eb9ea7dacd71ee4d738ad44285b9dd5afa615c6fe14" + }, + { + "path": "cases/codegen/upstream-codegen-016-3f1fb1569b.json", + "sha256": "2b267c30d38d3e763ea74ee6e866e92b7b6465dc0fea6c65698bc122d711fbc8" + }, + { + "path": "cases/codegen/upstream-codegen-017-44cff97cec.json", + "sha256": "2276772868ed1d3e42cdad6daed949141d18debcd98019982dd89e7c5c6e4ba0" + }, + { + "path": "cases/codegen/upstream-codegen-018-bc5eb21a9e.json", + "sha256": "6db5a5991d031af3749ffd255f56547c5f8728aeb5d3ab48f05a6ed0692c72d3" + }, + { + "path": "cases/codegen/upstream-codegen-019-4988f86e5e.json", + "sha256": "3a9e36f4c62c0ce61bb075c0c55c1a6d4466ae268a0d9f39f058c365c64e7d48" + }, + { + "path": "cases/codegen/upstream-codegen-020-a9d569be7a.json", + "sha256": "a3f311bd01b426d48acc1f91c7878edbb8e2ead3241cc6a942f6ab9a9884ab93" + }, + { + "path": "cases/codegen/upstream-codegen-021-6cae93b843.json", + "sha256": "ee51b8fa93e13067b8ac5c83a1fb4f4daefdf65db9aeb8239356e9b948d95ec6" + }, + { + "path": "cases/codegen/upstream-codegen-022-8dce1fe15f.json", + "sha256": "4e6b15218605a03102a34de3d42f3327d142c396afb1c3c93b5450ed52be2774" + }, + { + "path": "cases/codegen/upstream-codegen-023-040bff1c77.json", + "sha256": "0d3da3e34d2bceb7b741e5063272fae42dec0a1b0dea1dd9c37a3ab770ea8623" + }, + { + "path": "cases/codegen/upstream-codegen-024-eb534f354c.json", + "sha256": "82cf962d6f8e8a1122fd1abfff8c93da16223fb15b18882cb55e7ba237daf27b" + }, + { + "path": "cases/codegen/upstream-codegen-025-74cf3c3463.json", + "sha256": "db35e4c82d47fac1f658ab78b270fbf2301b826448b687f4d7372e66032150f4" + }, + { + "path": "cases/codegen/upstream-codegen-026-e6df42a1c0.json", + "sha256": "b14ce6cbcad2badca3ad27aeb25a82327fdbd2d9a40fdf218f91ea2f7cd33bb6" + }, + { + "path": "cases/codegen/upstream-codegen-027-2373d0fb1b.json", + "sha256": "080789e716b9f0deb8b9bb4652cbb35ed68b223d70e98e715da9ddbfa49c5537" + }, + { + "path": "cases/codegen/upstream-codegen-028-0dcf04d5ca.json", + "sha256": "a3a4c051b6fc8f5be7bb29e464bc269702f4072202dc46cf1eceae2ebc208fd4" + }, + { + "path": "cases/codegen/upstream-codegen-029-dd01228f04.json", + "sha256": "06451fd99d581754e8cd20888c3754172d48db098c90747eed53fc1245298f95" + }, + { + "path": "cases/codegen/upstream-codegen-030-f4528f2a74.json", + "sha256": "cc488a7306d8869c1a7b3daedc06a9ec3e604442d664405a06b0819aeefd4107" + }, + { + "path": "cases/codegen/upstream-codegen-031-5d6f0a82e3.json", + "sha256": "1ec0f7f086dd78ab5427b66eda37c07f2e124231eceff7a02a76f22943e81c1a" + }, + { + "path": "cases/codegen/upstream-codegen-032-be85ad69d0.json", + "sha256": "4e3f64cb4cb9c2a423deb71c2d93714b725c388e05b7f1711763933d29d78d4e" + }, + { + "path": "cases/codegen/upstream-codegen-033-4f42f0cabb.json", + "sha256": "6f5050f0dae7dc8fe03ee075f82eea0286250d2a3121e68dfd08307a58b7d4f8" + }, + { + "path": "cases/codegen/upstream-codegen-034-e25e34d3de.json", + "sha256": "278676e1f94bda2094c3d37b7fae499ca098b80b4a48c906927f260d908caa2d" + }, + { + "path": "cases/codegen/upstream-codegen-035-1d66b429cf.json", + "sha256": "f1e991f0569fabc3e81b717be0eb18c7679b7f4618f27c72536da5ab6bc7b957" + }, + { + "path": "cases/codegen/upstream-codegen-036-6803ff59e6.json", + "sha256": "a840703f271d0086088c3f72d412eabe20ddd1bdc7b45e8457a39704798bb967" + }, + { + "path": "cases/codegen/upstream-codegen-037-e576c2fba9.json", + "sha256": "40e050fd2055be224be84de38f82cac868f34a1ed018fc62340033935cc7e689" + }, + { + "path": "cases/codegen/upstream-codegen-038-280770f34d.json", + "sha256": "7df2355d88cd6ada435a387502084676054ae4e031b26b2165f7cf5ef01d7624" + }, + { + "path": "cases/codegen/upstream-codegen-039-84e4037075.json", + "sha256": "76dd29a673233ca67aa5550bd86551cec4b579699508fa096765ce5c030f72eb" + }, + { + "path": "cases/codegen/upstream-codegen-040-e2a36763a6.json", + "sha256": "3a2e9d3226f8b8136b0c4003c2789d9fd15cb03909677df5f1e5a832a75b8b40" + }, + { + "path": "cases/codegen/upstream-codegen-041-7c9175487c.json", + "sha256": "4413e477015e9017d018b198faf52f8974cc07c9c2fb91ed0c8d829c0efccf92" + }, + { + "path": "cases/codegen/upstream-codegen-042-246e72e17a.json", + "sha256": "981c2e5fabda6a7a1d8f2eb576933c9e87e5df5f255eecbf394bf00f2b6b8783" + }, + { + "path": "cases/codegen/upstream-codegen-043-50fac72de7.json", + "sha256": "0e47f3aea4569088746cb44f7189e1576a1b29e6f2346d2cc80e5121f851cfea" + }, + { + "path": "cases/codegen/upstream-codegen-044-a9f4c5ba13.json", + "sha256": "0e0bdf7864052897eb5177662bbd10c99dba3ca5771827357b2df89a9dd9f21a" + }, + { + "path": "cases/codegen/upstream-codegen-045-958507518d.json", + "sha256": "8b8b21c4ddb94d5d566c7539b4505eb2666fbf33067764b6defd573772a3fcc8" + }, + { + "path": "cases/codegen/upstream-codegen-046-82a07e3ec3.json", + "sha256": "d6b1ca7530d788a21757d5615c202ea87d1a05eace48ece48703ecf5ddc5a4ea" + }, + { + "path": "cases/codegen/upstream-codegen-047-d524fcd6c3.json", + "sha256": "9a9e806a703b597037ab90b924d5c7c08d98a14f0e9a2c9b8cd143ca870fbe71" + }, + { + "path": "cases/codegen/upstream-codegen-048-fa3442e264.json", + "sha256": "01c3d3f47ebfb9604f33baa1d0df318e4ca9df5f039062e90e36d443c5f35231" + }, + { + "path": "cases/codegen/upstream-codegen-049-b3bbd32960.json", + "sha256": "f0d7d3049066b4c1f370f3c4c5ce1ee45c723be596273118366afc4555483ac9" + }, + { + "path": "cases/codegen/upstream-codegen-050-fda399bfe0.json", + "sha256": "bd06f5bf1c863745c1da75b304abe7b9496fe60cd9c362696a671d85402b1ee8" + }, + { + "path": "cases/codegen/upstream-codegen-051-53df7b9474.json", + "sha256": "989d8095d8aa2f73160649f2b7e0812233634ccbbdc295aca8525ad222b52068" + }, + { + "path": "cases/codegen/upstream-codegen-052-e6195ba5a2.json", + "sha256": "8235a841c784b5836563d9795348bec65d5805bc5bf9368dc66305c45ff84b2a" + }, + { + "path": "cases/codegen/upstream-codegen-053-5fbe283840.json", + "sha256": "652924a7b9f8e1ab844c39755dbd13e572cedc0b1d737cdf7619bf48cdfb7d8b" + }, + { + "path": "cases/codegen/upstream-codegen-054-e536c17528.json", + "sha256": "5427b95f168b2fcf6c9477928afb628f77e4c54d919c57705f1e4bea6ae7c999" + }, + { + "path": "cases/codegen/upstream-codegen-055-1539142ffd.json", + "sha256": "cfe2b6beccb8d1aee89d0909d57a1422645bae778428559f8128723bbac2505b" + }, + { + "path": "cases/codegen/upstream-codegen-056-834fa66895.json", + "sha256": "c30dfd9e9a66212f005da8574d6b549128ccb127086a0e8959e9f47fbc8f496d" + }, + { + "path": "cases/codegen/upstream-codegen-057-595a483b50.json", + "sha256": "cd64ca14fc32da111390952f00901d3e19f2a1da8028a38051276772d031cfd5" + }, + { + "path": "cases/codegen/upstream-codegen-058-a5bed8edb7.json", + "sha256": "66bc6d27955bfe2850c15420a440a26e2b6fe4de09840f615cf3de8c8b98524f" + }, + { + "path": "cases/codegen/upstream-codegen-059-0b07052901.json", + "sha256": "9e911607f36633d766ea6ad6e161b766e19f56afe0dc18c9796177321ed600de" + }, + { + "path": "cases/codegen/upstream-codegen-060-b58a7535c7.json", + "sha256": "6d311ce5ab3a74727c837a5a0a1cdff4a988a3b1ebb80811a68f0991c017b205" + }, + { + "path": "cases/codegen/upstream-codegen-061-1c44313e59.json", + "sha256": "b66e1d9fe68267882499cef1181914237ffa987ba5fb86f99c62b4836de0646b" + }, + { + "path": "cases/codegen/upstream-codegen-062-4fdcb21c9d.json", + "sha256": "2f9ba340ceb4fde70425a463ca21fb0614d4cee6370976f78e9c9ea60384c0da" + }, + { + "path": "cases/codegen/upstream-codegen-063-a8231002de.json", + "sha256": "908860b40a586b83a987f686893f776335c3dd98b8234701e102bae383c18dde" + }, + { + "path": "cases/codegen/upstream-codegen-064-764419ad9b.json", + "sha256": "f7ef7dcd6916d52298e5bc3a2460bade7ce3ab9a043a6a8fd83d81e4a595ff6f" + }, + { + "path": "cases/codegen/upstream-codegen-065-6c1be61067.json", + "sha256": "e3c9f415aaf11d6b9ff214c18b8d480ff3de7aba4b51a60f23d6732c62967ed8" + }, + { + "path": "cases/codegen/upstream-codegen-066-6525a64377.json", + "sha256": "afbeefef30c6255763e3bcb8fed9febbdcc9d4882d32eafe6417bd3bd1db4411" + }, + { + "path": "cases/codegen/upstream-codegen-067-3ffe06a1a9.json", + "sha256": "81f4c469882cecd28b4ad3b8b38f01e225575edb8089e3c291d4e5d3924e5db9" + }, + { + "path": "cases/codegen/upstream-codegen-068-0d86452528.json", + "sha256": "d673791f0e16840e18dd414893de13ab34ec4acd53bd8957319fea95edbcb8f0" + }, + { + "path": "cases/codegen/upstream-codegen-069-0fa1145f4c.json", + "sha256": "abb6136d5e2403f0c27e9bdb8b9a94f96dc1b3afdbeadd1edd84267014a756b6" + }, + { + "path": "cases/codegen/upstream-codegen-070-a01830c33f.json", + "sha256": "6182e41d6cdcfd3dc9847364214862840c9a3c0680394806f5a0f95e11fdc2b0" + }, + { + "path": "cases/codegen/upstream-codegen-071-3a132a6b4d.json", + "sha256": "3b0171935a569e0e424cae7e5c42e8d0c5cb01e8d373174783789e2db8b21ed7" + }, + { + "path": "cases/codegen/upstream-codegen-072-df70a74728.json", + "sha256": "a8786466098bcac11b750951344f4d70180b95bd1a01e9881b953cfe3110f708" + }, + { + "path": "cases/codegen/upstream-codegen-073-ef0cdd87cf.json", + "sha256": "b380a48733bdc4f7605ad239ffa1974028ee2d45509dc4af26b67c2b42deba35" + }, + { + "path": "cases/codegen/upstream-codegen-074-57a24a2690.json", + "sha256": "26ebe4f20ff4085b79d112dd27e41546e1b888f85a1387a35e2596b57e18b993" + }, + { + "path": "cases/codegen/upstream-codegen-075-fb8db22bb9.json", + "sha256": "f0a598d55d70f2543c98cc765b136e9767eeb1bf95d5ef73eaabe31bf69aff21" + }, + { + "path": "cases/codegen/upstream-codegen-076-3d2d4543bb.json", + "sha256": "14f0336b52c48acc074542cb06e9329f3238106258edd8284e47661c3616d68b" + }, + { + "path": "cases/codegen/upstream-codegen-077-a65991a745.json", + "sha256": "e8aa13a12f79cb80eedc3e0093bfe2898ee06996291ec067964ab74c606063d8" + }, + { + "path": "cases/codegen/upstream-codegen-078-d6b1085274.json", + "sha256": "e75b0c874ca696215a37a00cd1bef528d4be03060d0602accd7f17bc2d3e8b73" + }, + { + "path": "cases/codegen/upstream-codegen-079-9e7f3ee9e4.json", + "sha256": "2546a9575e89473af0aad21587750a56b4ce802570a4ab333f8178cd184e660b" + }, + { + "path": "cases/codegen/upstream-codegen-080-f6233dd6a0.json", + "sha256": "5c275db307933691602c23a53656ef85e3a1730bcff0e42c140f4db69c2a1c06" + }, + { + "path": "cases/codegen/upstream-codegen-081-ed3fa48802.json", + "sha256": "c81a96f85dfa784dbdcbf90beb1b4257158285956370d0a50791e353c04096dc" + }, + { + "path": "cases/codegen/upstream-codegen-082-db0d8839e8.json", + "sha256": "24cf86c7ee34c14541d0634e6f45c9696e52aa4eaa321bde902e46821f219965" + }, + { + "path": "cases/codegen/upstream-codegen-083-1820110e8a.json", + "sha256": "766486ef63e6eacf3d9e583e8a577ae71af9ed8400db560f92dfd2f134002be1" + }, + { + "path": "cases/codegen/upstream-codegen-084-3d01c94f87.json", + "sha256": "d6e74499d7682f8ce62a78d2ad55b715abfcc9d43572226cb3ca8509472717ff" + }, + { + "path": "cases/codegen/upstream-codegen-085-1f274ec7a6.json", + "sha256": "cb1244dfa6a5294a8623db8b847221b4cdea45c8c26f314aba9b79896058b1e5" + }, + { + "path": "cases/codegen/upstream-codegen-086-a44a580f30.json", + "sha256": "6e51af0ac082c35261c16b4a236ef1e1d74187df96a9945bdcea1b6d0ebdf5d7" + }, + { + "path": "cases/codegen/upstream-codegen-087-e95c0eccc2.json", + "sha256": "d293f8d3874ed56dea0a68d597b1e707072a61554095d0d2b063c0460f6967fb" + }, + { + "path": "cases/codegen/upstream-codegen-088-f9ca312d49.json", + "sha256": "82948517529fa5256b1870e3227d343683404ef7a9edc715ebea9572b2701c4a" + }, + { + "path": "cases/codegen/upstream-codegen-089-1d28dfdd93.json", + "sha256": "ad3b31605bcff92398582753e3cc81b6f507f3440c281f3e08cd5e76d1f6c658" + }, + { + "path": "cases/codegen/upstream-codegen-090-e8878c5cbf.json", + "sha256": "17b3d1af4cb768633bf315b7cdab16cbc42cdfa22d9645d94e826c1f14b5d050" + }, + { + "path": "cases/codegen/upstream-codegen-091-dc61cb2277.json", + "sha256": "d417cc4aec3e1bf16768abc87c6979ace8937bec817aca198d067329d6bcdf23" + }, + { + "path": "cases/codegen/upstream-codegen-092-96adc16d0c.json", + "sha256": "5bb64d23cc91eca25674be7c7d772fccf3ab5618795debf2702b8188f93b217b" + }, + { + "path": "cases/codegen/upstream-codegen-093-4573f32903.json", + "sha256": "a08ca117a4f0c842d7bdb64d009bdb5040f21c08b2ae8bc501b03720d181f857" + }, + { + "path": "cases/codegen/upstream-codegen-094-e0d0f3bfe1.json", + "sha256": "180037c7daa90572a63afca1be7e4de7ce16f327d46536230a64eda5897aba8c" + }, + { + "path": "cases/codegen/upstream-codegen-095-af3315e549.json", + "sha256": "5af426302d565c3bc2298764992890f128a6f8d270a865a94b68d45dda79db13" + }, + { + "path": "cases/codegen/upstream-codegen-096-f8978e56ee.json", + "sha256": "3508ce94538e6a7655e5888c41c67643f6a6e269bb72b0eb9fb510d523cd1a86" + }, + { + "path": "cases/codegen/upstream-codegen-097-da58ebc1a5.json", + "sha256": "02a707153c124d5919b0562efd57fe72d463217ae9bd6c67a4a37e8376d762a1" + }, + { + "path": "cases/codegen/upstream-codegen-098-7c2267436f.json", + "sha256": "c2b3e09cf6d7e14af0bf89596f66a16caea5fba0870c035732e30da898a0ce12" + }, + { + "path": "cases/codegen/upstream-codegen-099-a2f954e973.json", + "sha256": "6dab3305f288a8a15c2ab4f1c26c2b842a378550afc8b9824d3d7a5c17055ddf" + }, + { + "path": "cases/codegen/upstream-codegen-100-a546e9e784.json", + "sha256": "7c026b9362749baa0cbf864f14685990a2b93908d05d4d4646e7a275e326b46b" + }, + { + "path": "cases/codegen/upstream-codegen-101-394e6d9bf6.json", + "sha256": "0137b7683ad565327861a7cf2874b03d5193c6e2dd1b98dd56d00d68e8843f34" + }, + { + "path": "cases/codegen/upstream-codegen-102-cbff7d3da9.json", + "sha256": "6ccd15513898343b13b796fb57782d63de0e3a309500dc6406fa22a27fa796c4" + }, + { + "path": "cases/codegen/upstream-codegen-103-246809daea.json", + "sha256": "83609a6dc8b147bcdb7760339667646582585006a8d84dcfaf01691874872fcf" + }, + { + "path": "cases/codegen/upstream-codegen-104-d68998542b.json", + "sha256": "7672c9535482eda42292eba2ef3da4bf64e54ee9a579495d9bff2e3ff3f2dae5" + }, + { + "path": "cases/codegen/upstream-codegen-105-0137b6735e.json", + "sha256": "eb606200ea3133d9eb716b3c204c82e15693e72a6fbf96f2ff5fb76fa76db072" + }, + { + "path": "cases/codegen/upstream-codegen-106-6d687083cc.json", + "sha256": "74be6e03c3551e55894afab883adb0c30e6d60271d54c69b1db326fc46669561" + }, + { + "path": "cases/codegen/upstream-codegen-107-f624c65fa8.json", + "sha256": "1d11d76d6ca044511ebe03c1f1bba5704b306f41979463b51746a1eea50a28a9" + }, + { + "path": "cases/codegen/upstream-codegen-108-c6c4dabf49.json", + "sha256": "36a8bc97916ed89921a3ec0f5be6f7592d2c631469c7ef55a594b1709d786ca7" + }, + { + "path": "cases/codegen/upstream-codegen-109-e2824ad5be.json", + "sha256": "115801883daf25caf01783c2737b701ae923924a35bc085e9da815e230418e24" + }, + { + "path": "cases/codegen/upstream-codegen-110-f2505cce4b.json", + "sha256": "e2e07da74dac5c70b638dba8a19272131e1594d22d1439acda1b6805ce8317ba" + }, + { + "path": "cases/codegen/upstream-codegen-111-72c9d38832.json", + "sha256": "f8e0c3d6fe072cc795bb15c57c1b047c8748b4200e8717a9feef32a597ef2ceb" + }, + { + "path": "cases/codegen/upstream-codegen-112-b5443c63a4.json", + "sha256": "e3ea02a9482688e3d44d1a9186bd1ffaa3a3452d025cddb262e24e22f1fd0e89" + }, + { + "path": "cases/codegen/upstream-codegen-113-702dadab11.json", + "sha256": "20260813ea2afc8ccad3fdc879a6b2be1d1cb6e3fa146fa314e3bced1a4da7c1" + }, + { + "path": "cases/codegen/upstream-codegen-114-855686da78.json", + "sha256": "08c2c1facda20a595e36f667ccdebf77080c2cc9f994fccb0af7c17a434a8c4f" + }, + { + "path": "cases/codegen/upstream-codegen-115-45d3f116b5.json", + "sha256": "f74f9258b3ad958460b7fa8f9c1bc269da1c85138350e4f588971836dd54fb2e" + }, + { + "path": "cases/codegen/upstream-codegen-116-23097e86ce.json", + "sha256": "5cc88ec159abced46a7a4a006ec3f4fc15f54d40a002a65ab8905aca5d44021c" + }, + { + "path": "cases/codegen/upstream-codegen-117-fb967a9342.json", + "sha256": "fdb28bc5db74cae5523f6e3bf605cbd94d133847401d90ce6ad98590c62c0291" + }, + { + "path": "cases/codegen/upstream-codegen-118-b5cba733fa.json", + "sha256": "806719798642c73b161c0621b3f9f42324f6254cd11de8730076aec2f8fb6983" + }, + { + "path": "cases/codegen/upstream-codegen-119-882c2abd91.json", + "sha256": "d6b7a9d49e26899e306a8601a47c45df4b4676542930bc2b1abf86d5f7b305fc" + }, + { + "path": "cases/codegen/upstream-codegen-120-7634e1ee10.json", + "sha256": "9536e1af2e0c647171981a0b69c7d342d7bbad761b8d85d5125be54a018e9d6f" + }, + { + "path": "cases/codegen/upstream-codegen-121-0536a2e75b.json", + "sha256": "7124fbd0298acebb68a9fe7443ca2cf389117621e43237d73bd96fd353075556" + }, + { + "path": "cases/codegen/upstream-codegen-122-7ddad74cc1.json", + "sha256": "7d80ba738002b458f92c646174ead6903a9c38a4f65f10a144abd9d7f22dd52c" + }, + { + "path": "cases/codegen/upstream-codegen-123-179129a02c.json", + "sha256": "628995cfa2f6e631b5611f5605224fd40ad01409c8f591e0980a92f05b43ed27" + }, + { + "path": "cases/codegen/upstream-codegen-124-bdedf14335.json", + "sha256": "d5af04dd280bfb090de69157091a05037555d473117a99cac546fa06dcc09be0" + }, + { + "path": "cases/codegen/upstream-codegen-125-4a4a93c4c9.json", + "sha256": "87a6109457e564b1b6b9bc0c8808a032f32b9cf9e46cffccdbaa3b23ce90e781" + }, + { + "path": "cases/codegen/upstream-codegen-126-14073e1999.json", + "sha256": "f35c039a7fe18b25a5cada87b6af78ec229df56d5faa71b6ba12f15ed03e6087" + }, + { + "path": "cases/codegen/upstream-codegen-127-1d5ead088d.json", + "sha256": "768eb1aaadbc53342cbc86c80553087421b73e2bc6d5b5f6280369f4113fcf01" + }, + { + "path": "cases/codegen/upstream-codegen-128-2222304a14.json", + "sha256": "7d2aaa66274b6f99754a64fc0fa4002606b23e22ce5f74f183bb2bb786daf8f5" + }, + { + "path": "cases/codegen/upstream-codegen-129-7c97156f7f.json", + "sha256": "0bc5031963826c844807ec5a639e2dbdde5dc108f3e2cb675ccffb9bde7e89be" + }, + { + "path": "cases/codegen/upstream-codegen-130-bbd4e9a97a.json", + "sha256": "8311301f1047f75c6e303f707308810f834fceea062fa8db6956b8b0d3f8a564" + }, + { + "path": "cases/codegen/upstream-codegen-131-c6ef80ad0c.json", + "sha256": "1e26d14a0af671ee7b260804cf00ca4cd8c0853fc103ddb265fc722bd40bf6fd" + }, + { + "path": "cases/codegen/upstream-codegen-132-9a7b0243b6.json", + "sha256": "03f89a71e2df95f339b304976095459917a720313532ce7eca38e3ad4125340a" + }, + { + "path": "cases/codegen/upstream-codegen-133-f425fa006c.json", + "sha256": "5ddb07c24231f0d83542f61f46df77d1e11b3cae014997df90855ede73a4c7a0" + }, + { + "path": "cases/codegen/upstream-codegen-134-f80fffb8b4.json", + "sha256": "5ae4becf4b0e16ad60b8ef948957a48b767a945ce7711ddbcda1c981a9fb26e2" + }, + { + "path": "cases/codegen/upstream-codegen-135-e00e826755.json", + "sha256": "407b14b5e794b4a60b7a6f90c9e99674e61fd7d82ed6ee80971109f10be8cbe1" + }, + { + "path": "cases/codegen/upstream-codegen-136-b68bd43ea7.json", + "sha256": "295342cf51063f552ef55df9fc7386aa2568369c11f0520d3fcf35a184f29685" + }, + { + "path": "cases/codegen/upstream-codegen-137-83b2706e92.json", + "sha256": "f3cd44d5fa3d3d98109ebbab71a4229ffa389f663af17a279388867d95170b88" + }, + { + "path": "cases/codegen/upstream-codegen-138-9cccfcb552.json", + "sha256": "ad6428b71b6adb32c432bb6a35144f9705a6391bdc5a58f118fad80ef7184eab" + }, + { + "path": "cases/codegen/upstream-codegen-139-63f7b1f175.json", + "sha256": "73dff6f4c3bdf8b7c1ceb205c37d4d1d21040a01218b77372df2bfc9a4159f40" + }, + { + "path": "cases/codegen/upstream-codegen-140-e577df9ad5.json", + "sha256": "9585ae484bd86791e484e9639575c5f95ddecf992f2feb40b951852c8ff24b33" + }, + { + "path": "cases/codegen/upstream-codegen-141-48307df49b.json", + "sha256": "87a3fecc6e604d79d8599bf1b57d5a7f231ec2c8fc4ca9deaa1841bdea641dca" + }, + { + "path": "cases/codegen/upstream-codegen-142-ac82229282.json", + "sha256": "635992297ac64d91bde735afe1d94938c1887a3ed54355ae536a185f8ed0f5dc" + }, + { + "path": "cases/codegen/upstream-codegen-143-52b441f9f4.json", + "sha256": "b11f8f7efbc5b2d44991573cb2f69e153e420fe6cf9e1d0b7d77e1f3e1a67643" + }, + { + "path": "cases/codegen/upstream-codegen-144-042a6de403.json", + "sha256": "4b9c9cd349fab0feae2a5e3cc4ef2a14ad97aefe069ffc95312c4c274a3aa5c0" + }, + { + "path": "cases/codegen/upstream-codegen-145-f7001b5648.json", + "sha256": "525dcd4c6b13f176b8f7caf7c6043b626bb5187b470e230a277a60207717c110" + }, + { + "path": "cases/codegen/upstream-codegen-146-56be99e864.json", + "sha256": "ba5e19a96a1a9525f39780447b96cc096962e0723838d925804d6de733ba02ff" + }, + { + "path": "cases/codegen/upstream-codegen-147-bb7df0f2f1.json", + "sha256": "b0d4943f043f561e035dd24bfd8d672c56d553b12c253a9f3c298025e6e94f1b" + }, + { + "path": "cases/codegen/upstream-codegen-148-62e9137131.json", + "sha256": "2d919bf537935a4b20ce88d102a29bb7ee26a262b050dfa6b3b1c974a7098afa" + }, + { + "path": "cases/codegen/upstream-codegen-149-2491f4c5a5.json", + "sha256": "2e7e54104ec25cea9f87907024e2045615ced632dabbb7eea6664350da3fbd68" + }, + { + "path": "cases/codegen/upstream-codegen-150-ecb5bb4337.json", + "sha256": "09c5c6c7e76bfd5ae7f17c5c5b32cc22d87b33291844230c219a9052cad5490f" + }, + { + "path": "cases/codegen/upstream-codegen-151-7993d252dc.json", + "sha256": "b2007d85559a16447612364ea53d00cefd420b97c2bb72e5463be09f75ed2314" + }, + { + "path": "cases/codegen/upstream-codegen-152-a05026a9db.json", + "sha256": "fab22bc1f07138aacb7ef9f12232937e18f439d397993a9944964a07748c7a81" + }, + { + "path": "cases/codegen/upstream-codegen-153-fb5205fc52.json", + "sha256": "efeaf27efccf1802222a977fba834cf83656a8ffd099635fd42d8507135e02d7" + }, + { + "path": "cases/codegen/upstream-codegen-154-1409376769.json", + "sha256": "5747bd8fef91c7ed1ce7eafdeed4d41be135aca35e8f58bca95eed801980557f" + }, + { + "path": "cases/codegen/upstream-codegen-155-557eb84a98.json", + "sha256": "b655e9c4439fae3e9efbf609884a2023188f817e042d61ed0144ac3382439e31" + }, + { + "path": "cases/codegen/upstream-codegen-156-bec8be9b99.json", + "sha256": "ab6d20c0613ce8f54654f13a31ec469c896c782c269d3323835968229c64cd31" + }, + { + "path": "cases/codegen/upstream-codegen-157-4cb71f2863.json", + "sha256": "5d08f33cc8307a652f542c4496185ac61b8eaf7c18922f3b8229d291debfe647" + }, + { + "path": "cases/codegen/upstream-codegen-158-8e4821dcbc.json", + "sha256": "6074ac94862e3727ddd2ad3ad858c3c57d9030c05bcd755c4056fb999785609e" + }, + { + "path": "cases/codegen/upstream-codegen-159-30962241b1.json", + "sha256": "b89ff98e7ef497ac20fb3614226254e68c3f3a214c9f82b952306a156105e309" + }, + { + "path": "cases/codegen/upstream-codegen-160-db5d3ac9d8.json", + "sha256": "7cc80a0adc1389ab9557da5a3d6e861109886604993390524c573d0b97f4b8ef" + }, + { + "path": "cases/codegen/upstream-codegen-161-5b230821f2.json", + "sha256": "654a890eee099706ae5bda595105bc4b04c2cf6a9b46d8791beddad5a011780c" + }, + { + "path": "cases/codegen/upstream-codegen-162-51e1254b4c.json", + "sha256": "d3bcc4c1335c53fc29337432839c8742dc36e29699a07820060a119d9502d749" + }, + { + "path": "cases/codegen/upstream-codegen-163-2a9f9a056a.json", + "sha256": "b1b9fa0f90223196cf214bdf2c7a91ba41e0a4e15aa4afab168c6978bd3c82ff" + }, + { + "path": "cases/codegen/upstream-codegen-164-33e4c6591c.json", + "sha256": "6962b5f83194dde1d8a113fee4aafa1317397025f60cd6b718eff9d8a9c766e2" + }, + { + "path": "cases/codegen/upstream-codegen-165-501ee1df12.json", + "sha256": "e6a1a8cc7c7fe26b32e31db8a87cc913f5f9538345245e675bdc31d912223bec" + }, + { + "path": "cases/codegen/upstream-codegen-166-cda14f0b08.json", + "sha256": "d0be0e1ed24104b673fb0518712866d75f9354ad73315f45d6a81c47efb65842" + }, + { + "path": "cases/codegen/upstream-codegen-167-114a88771f.json", + "sha256": "4176cd98a07572c5c7ef94d859482a7200f695bcc58f14f529d902218fcd7a84" + }, + { + "path": "cases/codegen/upstream-codegen-168-4211bd8279.json", + "sha256": "d08928bc893b2f8a06b4decbb7ebd5770671da6e68332cde65f720d7f7736896" + }, + { + "path": "cases/codegen/upstream-codegen-169-796132e0cf.json", + "sha256": "3255bd9e7708ec95ed23b27858a376f857555471caa858664ab2323d363c9c61" + }, + { + "path": "cases/codegen/upstream-codegen-170-eab2ed7d4c.json", + "sha256": "db1b013eb6105db5d6e790376f645f2aa8eb4a51c3fde4dd22ea47f11533b823" + }, + { + "path": "cases/codegen/upstream-codegen-171-7e33e2b6a9.json", + "sha256": "92317722c6282698bb726d8b957f00dcd2c824f637b1c21abd874685931b5525" + }, + { + "path": "cases/codegen/upstream-codegen-172-99028c85ce.json", + "sha256": "246b8a5a3c17195a9466a5e4776bcfd262ab0833746a92120e27c598ffa70444" + }, + { + "path": "cases/codegen/upstream-codegen-173-64dbd7a102.json", + "sha256": "75d3cf03e585bbcbb00e5c86943a6891424d978a1250b885938f93806d012e0c" + }, + { + "path": "cases/codegen/upstream-codegen-174-68dd47d3f8.json", + "sha256": "ea1eb49af4cfc6d051cb82d3c367c333f7c3e735bd4e536da9593198bd48c6e8" + }, + { + "path": "cases/codegen/upstream-codegen-175-ec3fd45731.json", + "sha256": "c98eb737e8c1a5bcc381c0e2eb3c3ffd1d3cab0e0bcea6d470fcc100f862f174" + }, + { + "path": "cases/codegen/upstream-codegen-176-653a030fdc.json", + "sha256": "69b3142d3bbd2c12d9b67fd03f75c392611bc05ec7ea3b5cf831a554823cd520" + }, + { + "path": "cases/codegen/upstream-codegen-177-c147e7dd39.json", + "sha256": "c177a964575b168884fe5011e165ca65ef41f18af0ba6d565b12c06c849b4a35" + }, + { + "path": "cases/codegen/upstream-codegen-178-d69d60d688.json", + "sha256": "339bf0442f4d825c5efa9cb620b52891073c9085ea82505408f15de30db179fc" + }, + { + "path": "cases/codegen/upstream-codegen-179-80620f6587.json", + "sha256": "ade11f7ccc09ad5c8dcc622d1b13d03a6d4129d0366c361c8017e1f44428bfb9" + }, + { + "path": "cases/codegen/upstream-codegen-180-ad1a31fd03.json", + "sha256": "1fa6752f05e9f46d29d9aa0ec6610dbb5a21ef2ef1448aa201730986548f2f39" + }, + { + "path": "cases/codegen/upstream-codegen-181-5afa626d49.json", + "sha256": "ccb824e374168d30c250fe39fa062ebcaa72f1266900aebcc21ef20f89cd3d44" + }, + { + "path": "cases/codegen/upstream-codegen-182-c45d19171b.json", + "sha256": "33db2379df12b181cc8ad22914895eea3bbc40e67cb96eb53903c5b8a8344a7b" + }, + { + "path": "cases/codegen/upstream-codegen-183-7ede517e99.json", + "sha256": "295f71c7a06fb63fdfb5a8b393007d6aafcd41742b43d7d3cb7c03c03ac56686" + }, + { + "path": "cases/codegen/upstream-codegen-184-0c09788bb7.json", + "sha256": "1dc38915b2332abd7cec35ed5a3f58794cf3c83f877574326308d8df9588b313" + }, + { + "path": "cases/codegen/upstream-codegen-185-e79c2ae189.json", + "sha256": "138b6a4d3db015cfd16e89fd63da24f855ed2458b822f000eba379a73c86d5ee" + }, + { + "path": "cases/codegen/upstream-codegen-186-0988e78887.json", + "sha256": "937d38281e539e3890bd325715fc64ff55d0c669719673ca8a511d90e1bbee2e" + }, + { + "path": "cases/codegen/upstream-codegen-187-8b30b935a4.json", + "sha256": "253fb409b9c57edc9f7702371aee1c49b3aefc032fd993856c437fc278b7f98b" + }, + { + "path": "cases/codegen/upstream-codegen-188-ea2a1af6a1.json", + "sha256": "94b427f8f2b2117ccaafee3f94bb9c6cfedd7cf5a6526020344dc2fb37e764bc" + }, + { + "path": "cases/codegen/upstream-codegen-189-75736e48e0.json", + "sha256": "63b09b0c637e1d4a612c4762ab2bd2f582336377dd857348837a07296c24e826" + }, + { + "path": "cases/codegen/upstream-codegen-190-d5a9045231.json", + "sha256": "4408dbe89a34fc792cd948e83147bd4e71a7765192f0c6941ae1403f3bf94b3d" + }, + { + "path": "cases/codegen/upstream-codegen-191-2021d398f8.json", + "sha256": "4571bc67eb46ff53a561f9d2cedf1be2596b1d931d5732e2c39a125c2b568bcf" + }, + { + "path": "cases/codegen/upstream-codegen-192-dd2c3f0c1c.json", + "sha256": "ed1d478b41cc6fce07eb8c9d7f8dd148ccc40067dad418055cf8b5b2022c8a32" + }, + { + "path": "cases/codegen/upstream-codegen-193-bd488a5710.json", + "sha256": "f6c4947e9b76dc2d939f7d944a8684e78bcebac7de77b3d6fc4dbc40c726e32c" + }, + { + "path": "cases/codegen/upstream-codegen-194-17922977f6.json", + "sha256": "fe78976846408c3145f7ee1b6cfc03ebf87248eca0ffa6795553abb9c8419e58" + }, + { + "path": "cases/codegen/upstream-codegen-195-1a6efe22a8.json", + "sha256": "74513f02d6c57ad9c838094502437f5e0a0014637b0bf6596d5d10dde4a5f884" + }, + { + "path": "cases/codegen/upstream-codegen-196-d14f03afcd.json", + "sha256": "9a4cf08a933682e56aaf39003f270830b96576a8257731c394a07295639b45c1" + }, + { + "path": "cases/codegen/upstream-codegen-197-026402bf2e.json", + "sha256": "96714e651d75246612c3069734e78890dcc3284f51f2d8faea23a7a595c99420" + }, + { + "path": "cases/codegen/upstream-codegen-198-a9ea7ba9c3.json", + "sha256": "1e6aad8d1af996d4c5e0106140136c06ab2e7857398312df97fb255877482273" + }, + { + "path": "cases/codegen/upstream-codegen-199-829a5c949d.json", + "sha256": "31d7eba29b9997d39e8745df8706e66acda1bd1e8a14b4143f76644f831541b0" + }, + { + "path": "cases/codegen/upstream-codegen-200-3313d92719.json", + "sha256": "a79c6d89f90fa677a5f82744a3b0c181233560c26480eab90ac382ca6e7bf46d" + }, + { + "path": "cases/codegen/upstream-codegen-201-8207a4008e.json", + "sha256": "740f539de4523b8d1ed78f86f918d18cc3af04d0449fb5c16085f6dbdc225016" + }, + { + "path": "cases/codegen/upstream-codegen-202-2786eda075.json", + "sha256": "26649b41351922eb0fa019f86e7a8e2ea3a7ef6de1d67a2d63f52638a1ef0a75" + }, + { + "path": "cases/codegen/upstream-codegen-203-8af03217a3.json", + "sha256": "93a942d0b715cf666c23087f912cca155a657f350166f074c751d3564e832eca" + }, + { + "path": "cases/codegen/upstream-codegen-204-2b2967c8c4.json", + "sha256": "9651e4e5ccdf9a9cedd6c04df6c3e8165540c2d09804aaa3f9b88ad7b02448a1" + }, + { + "path": "cases/codegen/upstream-codegen-205-cc3ea5202a.json", + "sha256": "3dd8f2f2a178354eaf753c7e17a52a15b66c5dfcba2daf10ee28845f2448bd80" + }, + { + "path": "cases/codegen/upstream-codegen-206-b5c5dc97eb.json", + "sha256": "263b724d5a79de41e3a97535ce146a8f7e9df9b1b2bd5eac7db080104c804f4c" + }, + { + "path": "cases/codegen/upstream-codegen-207-b0e134acf4.json", + "sha256": "75686a189160ecd738bfaaf0bb56ce8859f6be5d177f58eb37b8f81eaedc4201" + }, + { + "path": "cases/codegen/upstream-codegen-208-1a343e45db.json", + "sha256": "7556ca9996f0bf9ffc3cebdb72b0d7f81a60f4aa06b0db3ff06de631869e77d7" + }, + { + "path": "cases/codegen/upstream-codegen-209-0514b0990f.json", + "sha256": "08f47b90d2f937bae393a10fedd01c300eec6eaaaa515636df5cc3995f7633bb" + }, + { + "path": "cases/codegen/upstream-codegen-210-1b24060767.json", + "sha256": "47fd1186cea2972b9222701fa1c18af2953f3d1a31ffea8208877a8693872f1e" + }, + { + "path": "cases/codegen/upstream-codegen-211-2e15c55701.json", + "sha256": "826ee62b81a711c01610aa02403de029ef57682ccecf3349c68d23b52431f6c4" + }, + { + "path": "cases/codegen/upstream-codegen-212-2a8f7b4a99.json", + "sha256": "19fd8ac30be853a23dd3801d5875ee51749805bf744801d927befd1deffc0bbd" + }, + { + "path": "cases/codegen/upstream-codegen-213-aa53408d2f.json", + "sha256": "b78c44ed32ec3244c13987fab12d90eb5adede84adf07c9b0219e6c17b6e9f2e" + }, + { + "path": "cases/codegen/upstream-codegen-214-6dc49544c0.json", + "sha256": "f11f30fa5e717889ccae7c9cfcd24e1c5041414cc4a64c63e3f3f7bfb4b14d63" + }, + { + "path": "cases/codegen/upstream-codegen-215-39e86f8f53.json", + "sha256": "9554a18eaa2f41e9ff8943a0c6aeb912366476557da3a53748b638cae230c60e" + }, + { + "path": "cases/codegen/upstream-codegen-216-465422d47b.json", + "sha256": "fb6c8cddd8cb9f26a51c6a5e7f77f95d3d395d72787df7867ac50169cb789a53" + }, + { + "path": "cases/codegen/upstream-codegen-217-2d887b2a8b.json", + "sha256": "48df153631e7bdccc6b642de46f6a28d258840da519adcf436991df1ade70332" + }, + { + "path": "cases/codegen/upstream-codegen-218-587666c709.json", + "sha256": "d872ee5099c36bf54f687ebec19817b7fb97985ec5662fa0c7e421e46615afb1" + }, + { + "path": "cases/codegen/upstream-codegen-219-c6446b7b2e.json", + "sha256": "389a40d3939c288409a5e831aaa201d9ae6f1023a27a218a0bd214528acbbf7f" + }, + { + "path": "cases/codegen/upstream-codegen-220-5980153f26.json", + "sha256": "2e3fb694e882c316fa894762376da87234e0c3a367cc26a04d65305301d50b3c" + }, + { + "path": "cases/codegen/upstream-codegen-221-d003bdb336.json", + "sha256": "c0de73600f16554ba61cd572e3f0abd201f212b306bdc92e7e533847b2b0f02d" + }, + { + "path": "cases/codegen/upstream-codegen-222-f2d780c847.json", + "sha256": "fddf696a5318b6d08e4b1dce0ce61aa8cbabf2cce18fb0e1de8b7cb587ec2c49" + }, + { + "path": "cases/codegen/upstream-codegen-223-4dc8092992.json", + "sha256": "9a6c771b02a35f2ec903ff4dff9f439cb85377700ce5fb7c493da791c5dcac59" + }, + { + "path": "cases/codegen/upstream-codegen-224-075a41e65c.json", + "sha256": "dc644cbc77bfd7535185739057ccb249f3ad9009d931b47577e01a85c3667dfc" + }, + { + "path": "cases/codegen/upstream-codegen-225-00fb8a129e.json", + "sha256": "0ca4c9c07460ffd0623d4c4b18bf10833ea7e3d038c5c452613ffad352187572" + }, + { + "path": "cases/codegen/upstream-codegen-226-b2c28bcc8f.json", + "sha256": "c8e7d5eefa75a187b7e80adab24eb6066d005b9e8da7ce9b3e094f364460fa3c" + }, + { + "path": "cases/codegen/upstream-codegen-227-bebc4e7262.json", + "sha256": "19368e2dda36a0ee49efa1a206664eb9765ddcd0f8aa7724b7d40dd7af17a91f" + }, + { + "path": "cases/codegen/upstream-codegen-228-221bd0c553.json", + "sha256": "d890733f4c906d09a0439569994d75e32fe5ef31403f8fe82c2ead3e0d1bfe27" + }, + { + "path": "cases/codegen/upstream-codegen-229-9f57002cd6.json", + "sha256": "0edb9a243e5ee50b20f8bc9379b87393ca1f55642f3e5d035ba49d276ecf0292" + }, + { + "path": "cases/codegen/upstream-codegen-230-2af59fd9fa.json", + "sha256": "393e503f590b8b02e507055470474874706256739fd2b054ee3d6148c8a87ec0" + }, + { + "path": "cases/codegen/upstream-codegen-231-117d816fb9.json", + "sha256": "7a2d95a1c47702fe6c133dd36503deb7cd9bbffe0f419e9dc4e43aa8446e46d8" + }, + { + "path": "cases/codegen/upstream-codegen-232-8e875ce9e3.json", + "sha256": "0a2023d974d3f24d1088d65bdbae834381a9c975f9da727e2b611b8c40ea9cbb" + }, + { + "path": "cases/codegen/upstream-codegen-233-0a60be5fbc.json", + "sha256": "e12f9ccdcc78d5fcb22ea4515c81c2f548341a25f43ebf517c8633111851f3e1" + }, + { + "path": "cases/codegen/upstream-codegen-234-01ad9a0db0.json", + "sha256": "079a5842e9d283f811ba5b829dbe5d0bbfa5bd3b91160d4840277960f9a804ba" + }, + { + "path": "cases/codegen/upstream-codegen-235-8a3992468b.json", + "sha256": "8f6568f9435dbec4a91ddeb250422cb1b0cf672ae3905015ffa7be17bc7ea5bb" + }, + { + "path": "cases/codegen/upstream-codegen-236-621c6d6a9e.json", + "sha256": "39e1b8aba0be37885812c19f51b514c083b91103b82ba63fdf1d717b6333a521" + }, + { + "path": "cases/codegen/upstream-codegen-237-01ee478666.json", + "sha256": "ab5be0e8a96fc0961a040a4e593b19f7b206fc721b9cc24944c0fe19d341ed6c" + }, + { + "path": "cases/codegen/upstream-codegen-238-1a8cf8c870.json", + "sha256": "1f66602cfc0d859a451098e39aadd5147babd9c410dcb4e5b5c060d10daa8d7b" + }, + { + "path": "cases/codegen/upstream-codegen-239-a6dada3682.json", + "sha256": "addb5b264260b03dbe0778ff65c5e9031cc4d431a9f1eed6bbb0439876132a30" + }, + { + "path": "cases/codegen/upstream-codegen-240-77d56a1585.json", + "sha256": "f797c9d41f0108602b866a746121137e8fe1e3d916797051c436c0bc68d781b9" + }, + { + "path": "cases/codegen/upstream-codegen-241-e171ef72ce.json", + "sha256": "909af7fa12b5cbc8d0e6da7696aeb9d228e9190e04acea52ba3e8f48382cf38d" + }, + { + "path": "cases/codegen/upstream-codegen-242-5c198a8490.json", + "sha256": "f27b34c0078347f919360860dce276b8a11251850c31373dfde631c386cc0620" + }, + { + "path": "cases/codegen/upstream-codegen-243-14366a47ff.json", + "sha256": "a48637b4411a5e5d2eaa431f3b5928249098d26aa5d8e3028dee32bd98c1ef60" + }, + { + "path": "cases/codegen/upstream-codegen-244-4ccea91f13.json", + "sha256": "588fd9e929b81e119f9c274e5d70af5a6abdb51b06930a0062829de6608a022e" + }, + { + "path": "cases/codegen/upstream-codegen-245-537356bcf4.json", + "sha256": "58e4d428d6666af270383a75a53f286a263f6e43cdaad9566c0ea5619b6be50a" + }, + { + "path": "cases/codegen/upstream-codegen-246-295f39e09b.json", + "sha256": "1eec1db5ba2a71df39ac71ad8e6f142ce99c5182facd2c3d8ae509c2649d93eb" + }, + { + "path": "cases/codegen/upstream-codegen-247-39d6959685.json", + "sha256": "8da2af554c16ce238763d6cadc5a3d08e2db32c2caa5030b21a55fb8344b4702" + }, + { + "path": "cases/codegen/upstream-codegen-248-d1bc18e068.json", + "sha256": "af0e80dd4d075ccf5b822cf3d52dfa5bdb325e062932e230a2b8020ddbc9d290" + }, + { + "path": "cases/codegen/upstream-codegen-249-6b8a42981d.json", + "sha256": "711f6fff92e7f572d37cae6fdf506f4d9acaf470e7aba22aa89ad7e7f8a6c9eb" + }, + { + "path": "cases/codegen/upstream-codegen-250-935ccdb80f.json", + "sha256": "9bff4e7f11ebc0cc49562191218eb7daefb24f2bfed09ab5f6afd35278035c79" + }, + { + "path": "cases/codegen/upstream-codegen-251-50acddfb96.json", + "sha256": "9d09308c880c97b28dd6cb41ceae51653bc9047430fd4dfedc651b1f9242641d" + }, + { + "path": "cases/codegen/upstream-codegen-252-49e979239e.json", + "sha256": "4097844c71e840d30ecf39c20dd00cd25c3e44ab795a66f067c8ef83c84372d3" + }, + { + "path": "cases/codegen/upstream-codegen-253-347a2e5fb2.json", + "sha256": "0bdbdd6efa0e2a3f92875d43e266f814dd1ba80cce4fe1109a3d068853267467" + }, + { + "path": "cases/codegen/upstream-codegen-254-9f340b6a10.json", + "sha256": "8d7aef2919c1e3f51d49ea0452ba750641a56c0e4b92ba5fc27b5daac18add39" + }, + { + "path": "cases/codegen/upstream-codegen-255-d01d8c7de6.json", + "sha256": "7f706b0a3c03e7aed43f4e2913837fed56bc7d138b2a21e8368f6f3bc2631d06" + }, + { + "path": "cases/codegen/upstream-codegen-256-baf32cc08e.json", + "sha256": "378c8724e179aed1bdef3b113d0ca7e36619bd000e67eac86e61d9a8dd7e270d" + }, + { + "path": "cases/codegen/upstream-root-257-f23261dd4f.json", + "sha256": "bba06116efac8a33c3025d58213c346373841a10695feb4fafef9f22180bdc84" + }, + { + "path": "cases/codegen/upstream-root-258-5cfe8baba5.json", + "sha256": "c8b28ed848b3c417cddd051b54566b33aba1c838548798c6c865e6a8888cca37" + }, + { + "path": "cases/codegen/upstream-root-259-0ae0aa9528.json", + "sha256": "504537790c35eda31028d00e0a09c2783fc6cd0057d1b259f7aa645b41aea78c" + }, + { + "path": "cases/codegen/upstream-root-260-2dfc3ae054.json", + "sha256": "592c95db04b8d1f002508c7bf9879a6bd04f7364ded2371c0340142f4206e102" + }, + { + "path": "cases/responsive/upstream-responsive-266-4cd888ffd0.json", + "sha256": "3e48828d6217a5d96e95654590bd56a97014f6751c9c2011da027f41f03c30a1" + }, + { + "path": "cases/responsive/upstream-responsive-267-88b21cad2a.json", + "sha256": "4044a3b974716212f537c309d78b51d005991891dc5f067ba160ee6e46430cf3" + }, + { + "path": "cases/responsive/upstream-responsive-268-7dd1d5c323.json", + "sha256": "97b187b3354884d47d37b8b0a4c4c82901881d7259edf6fa3ea71e7933a233bc" + }, + { + "path": "cases/responsive/upstream-viewport-261-928195cb2b.json", + "sha256": "618cbd5b3ce5a073b5d6e1d5cd27d44fd5a04f22680b184d2e813a460b50464b" + }, + { + "path": "cases/responsive/upstream-viewport-262-0f19b3123e.json", + "sha256": "43145d8d6d33db83f045e8ad5464eae954b1bd624a6d1807614bcafe6dc4c913" + }, + { + "path": "cases/snapshot/upstream-render-263-d2763f9b9f.json", + "sha256": "555461a8452e7ea78e2350266b20f5efdbdbe436783670b1dfda6bb2a2c0f257" + }, + { + "path": "cases/snapshot/upstream-render-264-51e29ada52.json", + "sha256": "f50fdbef8fb22b3391eb168ee33c8c9c79f8380d3b21386ce4b9aac4b9a5e92a" + }, + { + "path": "cases/snapshot/upstream-render-265-94e906e79b.json", + "sha256": "c4458d2316de32e1f1f1942a2331b4b4eabc94a94c3af03bdba88d186555c3aa" + }, + { + "path": "snapshots/codegen/upstream-codegen-001-4410624749.snap", + "sha256": "3c6ca1e1b36a6081845a40c97744b6a6261367a0c23f1c98f8ef81c08a1121bf" + }, + { + "path": "snapshots/codegen/upstream-codegen-002-c1ac954cb6.snap", + "sha256": "1035f2a6b9c728ccfaa56a4a799eceed7376a3eac9a091cd2f3db38a10a6476a" + }, + { + "path": "snapshots/codegen/upstream-codegen-003-c855738695.snap", + "sha256": "f32a030fffc111f3065dfddc05af00136b9b2d5cab9790ae2aa5bf59f17fc733" + }, + { + "path": "snapshots/codegen/upstream-codegen-004-8ec61c5bb5.snap", + "sha256": "fd7d70787c565e9f5691a9c0efa34f14f701bf4fe350ee0ff55f044a26286d2c" + }, + { + "path": "snapshots/codegen/upstream-codegen-005-bcc6ca7dbf.snap", + "sha256": "fc6c9c0daa90d21596dc897ed2031992eb04f0e31c19b5981c3bbc8df372cf22" + }, + { + "path": "snapshots/codegen/upstream-codegen-006-86c21dc8ce.snap", + "sha256": "0384a80958bc15f7989187079140b6e588e15b1d4ae2978a4e803b35ff0d361b" + }, + { + "path": "snapshots/codegen/upstream-codegen-007-c1c1afa5d7.snap", + "sha256": "a5d038bd436c2cb1b57565a33f28eead49b74d652247635cba10b7a48b47c1e3" + }, + { + "path": "snapshots/codegen/upstream-codegen-008-8ea06a6c88.snap", + "sha256": "e13ad11d4552822b9d3ed37f1e0f7e161cb8e9185b9538accc7449aa420fc0a1" + }, + { + "path": "snapshots/codegen/upstream-codegen-009-008aac1a2c.snap", + "sha256": "94ad56cf6834d126be439d85ccc36f1fc0a5ef27e8d6279f08e956df90757209" + }, + { + "path": "snapshots/codegen/upstream-codegen-010-8454d22acd.snap", + "sha256": "ed28107d0395a3b56a7f3736881ef59adf3e1a8003c9edeec6e269b620a0c76a" + }, + { + "path": "snapshots/codegen/upstream-codegen-011-72709aab82.snap", + "sha256": "6eff4a88db6b8b3a9c42081f73f6ae27676e9d43af62b0c82b5f6b068cedce06" + }, + { + "path": "snapshots/codegen/upstream-codegen-012-92c671c0e8.snap", + "sha256": "a4b80defd03597253625e9c6145e58a8f93b125e43cfe3f1321b37ba3844abd8" + }, + { + "path": "snapshots/codegen/upstream-codegen-013-351e69a13b.snap", + "sha256": "e1017791fdb2f4884b7a443030d6477f991f4aee19bccce85386363dc9957109" + }, + { + "path": "snapshots/codegen/upstream-codegen-014-828c466260.snap", + "sha256": "c3bcaf8c96412e8567c3980993f92c2ea3c14a5ab035bac3beb9f6f669ac4087" + }, + { + "path": "snapshots/codegen/upstream-codegen-015-eaef178e47.snap", + "sha256": "9ebf331a7e8200c7b9a1814f1ae8b1122eb4551e8d4e6deb9dd8c7277bdb46c7" + }, + { + "path": "snapshots/codegen/upstream-codegen-016-3f1fb1569b.snap", + "sha256": "a8892d1b1fdb9f1d994753cbc61409be52a15c100d8c1cc5c5801c3c9bdcf55e" + }, + { + "path": "snapshots/codegen/upstream-codegen-017-44cff97cec.snap", + "sha256": "0272e228a33d3fac1d2f0461a9e1c3527ae325617c8ed6cddeb34cb75e39a4b3" + }, + { + "path": "snapshots/codegen/upstream-codegen-018-bc5eb21a9e.snap", + "sha256": "d08676bdbc1f3db4cb146bebced45ffa57a91e2ff90cb139fa623d9c76a54687" + }, + { + "path": "snapshots/codegen/upstream-codegen-019-4988f86e5e.snap", + "sha256": "87341ff18e5f3bf32f73e19f018b07eeb38251b5842afe3e295896ba6de3c3cc" + }, + { + "path": "snapshots/codegen/upstream-codegen-020-a9d569be7a.snap", + "sha256": "b2780095f9c3e2a3f48d281777525db85345bad9db4a09e906efc0c6773beaec" + }, + { + "path": "snapshots/codegen/upstream-codegen-021-6cae93b843.snap", + "sha256": "04fd0a4b60c0c45c384d291ad44f99134104065435ed6d03977ccf473bbbdf91" + }, + { + "path": "snapshots/codegen/upstream-codegen-022-8dce1fe15f.snap", + "sha256": "fd1c9794cf78d13aa5107ad8ba4400f1b6b7343de669db3760f251fbcfda8b44" + }, + { + "path": "snapshots/codegen/upstream-codegen-023-040bff1c77.snap", + "sha256": "ffc152d7496bb46549d990d470de30c3594a8ba2f63fa03053a83e8d038b05be" + }, + { + "path": "snapshots/codegen/upstream-codegen-024-eb534f354c.snap", + "sha256": "6c9dd6391356eee543b278d9d3cd220cf9ab3142c3bdf7cdedb016abe6cb315b" + }, + { + "path": "snapshots/codegen/upstream-codegen-025-74cf3c3463.snap", + "sha256": "622fc07d794e81404cd6671b6fe99fbb0d7911192494e4caa0b755cd947e4c00" + }, + { + "path": "snapshots/codegen/upstream-codegen-026-e6df42a1c0.snap", + "sha256": "60d3855fb7a3470bcb1347731c0a926294f659765e2df8f4c4fa39f562552175" + }, + { + "path": "snapshots/codegen/upstream-codegen-027-2373d0fb1b.snap", + "sha256": "4f2ccf3c8baa06ea10d8806b5e2550f4cd76755ffd4b1fdeb6fb505db68f295e" + }, + { + "path": "snapshots/codegen/upstream-codegen-028-0dcf04d5ca.snap", + "sha256": "a87a5659c53749e73f245853f672b6d15a3a67f12798fa8a2dbd4a0aca07d6d9" + }, + { + "path": "snapshots/codegen/upstream-codegen-029-dd01228f04.snap", + "sha256": "e31066da4a653a4ce08e690aefae317903d99a46bcb9ee19dece4f299d41d68e" + }, + { + "path": "snapshots/codegen/upstream-codegen-030-f4528f2a74.snap", + "sha256": "c903e400c6862bd8f760ce177c4342e60febb2f7246b2270910fd1b4891368d9" + }, + { + "path": "snapshots/codegen/upstream-codegen-031-5d6f0a82e3.snap", + "sha256": "89940a0a9afb628cb80a48355e5e8bad1b579d58246ee6d09ece3ac190e21f42" + }, + { + "path": "snapshots/codegen/upstream-codegen-032-be85ad69d0.snap", + "sha256": "14d64e376c583934f528603427c9cde9669e55a3834c3c99deda335f066cc03a" + }, + { + "path": "snapshots/codegen/upstream-codegen-033-4f42f0cabb.snap", + "sha256": "821ee127f3545106182a5f0c41489cd96619be50be3834289980d1bc2b86934e" + }, + { + "path": "snapshots/codegen/upstream-codegen-034-e25e34d3de.snap", + "sha256": "3b0a9a9558014cfedb9889ae49c2c339477d144faec9e612a42bd813f9b9333a" + }, + { + "path": "snapshots/codegen/upstream-codegen-035-1d66b429cf.snap", + "sha256": "48a45b702a8d4edd4495d21b4cd38d5654e3bf0845ed7801dfcaed1b578b56c5" + }, + { + "path": "snapshots/codegen/upstream-codegen-036-6803ff59e6.snap", + "sha256": "13779a4060bed061348e9d5ee9c175f45dc2d75262bc3d0fbb9bd0bf5af9b6ef" + }, + { + "path": "snapshots/codegen/upstream-codegen-037-e576c2fba9.snap", + "sha256": "700e7d2affcfc4cbbfee7d0ee654921501dbd060edf1432831327b0bb29afff8" + }, + { + "path": "snapshots/codegen/upstream-codegen-038-280770f34d.snap", + "sha256": "f80edefc534126577cb84c1f59e45492a574469a0841d63cef100fea4b004985" + }, + { + "path": "snapshots/codegen/upstream-codegen-039-84e4037075.snap", + "sha256": "45efc0723b46d4b0d89132ec0907e9ca75a9155d8eef33f06ab45a9fb762c8c2" + }, + { + "path": "snapshots/codegen/upstream-codegen-040-e2a36763a6.snap", + "sha256": "3a6aff65a9c7b1541f0e9c92b3e3d7943b84b8077e8fcfa7a6312b4e834a9363" + }, + { + "path": "snapshots/codegen/upstream-codegen-041-7c9175487c.snap", + "sha256": "27131ed7ed4c084e0c0b8a38a4966c517f0beb967a5ceda54829c553d1769405" + }, + { + "path": "snapshots/codegen/upstream-codegen-042-246e72e17a.snap", + "sha256": "4ad98a1b62dec3fce6b8ece632d550a980bf40cbba34bf5f6196b22f7479d8a2" + }, + { + "path": "snapshots/codegen/upstream-codegen-043-50fac72de7.snap", + "sha256": "873b1095a8e35591c13ea7a6a9fb351fe9b0005a293a5e6fc8802d707b2d833e" + }, + { + "path": "snapshots/codegen/upstream-codegen-044-a9f4c5ba13.snap", + "sha256": "5145c960aab82b894b48f9608541979a944966eba6fcf22d60bb0be53e401cad" + }, + { + "path": "snapshots/codegen/upstream-codegen-045-958507518d.snap", + "sha256": "255bdcfb736c045c53acefcb9dd1b8c3add437afc273cdc6ff5e52f70d2ed92a" + }, + { + "path": "snapshots/codegen/upstream-codegen-046-82a07e3ec3.snap", + "sha256": "c79565fb53c8c0602beba8c588c7c05e0b2a0b715dbd2ff7218c1a72314f54b5" + }, + { + "path": "snapshots/codegen/upstream-codegen-047-d524fcd6c3.snap", + "sha256": "c8e7bdc68b4f1c4f63ad4ec5f83b9dbe078321d1bf4a1f8765210659f7e28651" + }, + { + "path": "snapshots/codegen/upstream-codegen-048-fa3442e264.snap", + "sha256": "4adaf9c592ba13a84b2a164fd03c0a680b03335b9f0301f54156925313e91f8b" + }, + { + "path": "snapshots/codegen/upstream-codegen-049-b3bbd32960.snap", + "sha256": "4adaf9c592ba13a84b2a164fd03c0a680b03335b9f0301f54156925313e91f8b" + }, + { + "path": "snapshots/codegen/upstream-codegen-050-fda399bfe0.snap", + "sha256": "d9593d89e3dcde0e16d8bd81e07fe5c66d7f32b4e748aec8281beef6342afe12" + }, + { + "path": "snapshots/codegen/upstream-codegen-051-53df7b9474.snap", + "sha256": "04eefa2a7f108074e9390806bd32dc85668b4c554c9d410fa04640ae8627cc61" + }, + { + "path": "snapshots/codegen/upstream-codegen-052-e6195ba5a2.snap", + "sha256": "e3981c71e1f20c9c2fb2e526cc5701d1e2d4f63dc30797dd242f5d83c33047fa" + }, + { + "path": "snapshots/codegen/upstream-codegen-053-5fbe283840.snap", + "sha256": "cd12ccced864665cdcdb9f82d5de44171c058d1bb2984a337ef537a4a4d4d6f5" + }, + { + "path": "snapshots/codegen/upstream-codegen-054-e536c17528.snap", + "sha256": "56f775e87971a9e44bcd022d9ada95a03f217d0c6ab75eb861295997acb2300e" + }, + { + "path": "snapshots/codegen/upstream-codegen-055-1539142ffd.snap", + "sha256": "3c6ca1e1b36a6081845a40c97744b6a6261367a0c23f1c98f8ef81c08a1121bf" + }, + { + "path": "snapshots/codegen/upstream-codegen-056-834fa66895.snap", + "sha256": "73c4896ae004337fb623bd4134bdc7b3bf30a14e859f14194f5e9e31e90e41fc" + }, + { + "path": "snapshots/codegen/upstream-codegen-057-595a483b50.snap", + "sha256": "4ae22ff6956925528f9e5f513d14ae7e150454fc539016846ab40c19452d9203" + }, + { + "path": "snapshots/codegen/upstream-codegen-058-a5bed8edb7.snap", + "sha256": "15a1afe6ead2abf21b119f60d50aa2845815315b9b16568733d98826a5ac0368" + }, + { + "path": "snapshots/codegen/upstream-codegen-059-0b07052901.snap", + "sha256": "51138cde1d2bf455ef1dd32b7570f50b3bb13a86f1549e8d1ba6aa9724df4161" + }, + { + "path": "snapshots/codegen/upstream-codegen-060-b58a7535c7.snap", + "sha256": "80f7558ce65aca4d7c12e917da0aa87ae52c8d6e3cb6121fbe2be49b9f71994d" + }, + { + "path": "snapshots/codegen/upstream-codegen-061-1c44313e59.snap", + "sha256": "cc6dd809fdcd5f06a1c9c7e77c5ae779aa617d98ebe851f005e64a1e6f1a9c48" + }, + { + "path": "snapshots/codegen/upstream-codegen-062-4fdcb21c9d.snap", + "sha256": "985b795e87371897f6ba26ecae1256aa98a410010e2e7d45e228a28320c4adab" + }, + { + "path": "snapshots/codegen/upstream-codegen-063-a8231002de.snap", + "sha256": "a52d0e4e337948038043319f91bbb05d1034a76d5f66675e290cfd0cf0947620" + }, + { + "path": "snapshots/codegen/upstream-codegen-064-764419ad9b.snap", + "sha256": "73e17faf77e58bb352b8527d6653ffee219f2193f11954fea01ce88955c5e361" + }, + { + "path": "snapshots/codegen/upstream-codegen-065-6c1be61067.snap", + "sha256": "07a84105cf1e19f33d1651ca1f1bda5df936f53c22ff05b7e1332a24c661abd3" + }, + { + "path": "snapshots/codegen/upstream-codegen-066-6525a64377.snap", + "sha256": "db961fccae38a0401dac45547276078511ce949a3652d525dbd8c6109e964ecf" + }, + { + "path": "snapshots/codegen/upstream-codegen-067-3ffe06a1a9.snap", + "sha256": "c26b7e2344d01adcfe3ad5b739ad694fd8e04fecfe3ff99dafcb38adb8c494b8" + }, + { + "path": "snapshots/codegen/upstream-codegen-068-0d86452528.snap", + "sha256": "17ae17e84e0b5e630168a22b7de233f6d50efc19179e926a1462e3846186837d" + }, + { + "path": "snapshots/codegen/upstream-codegen-069-0fa1145f4c.snap", + "sha256": "794838b3ef3398a0196a42e3b55c0f3e0126227e0c470a2785850618f57ab4a6" + }, + { + "path": "snapshots/codegen/upstream-codegen-070-a01830c33f.snap", + "sha256": "c89b9d7d44226f484516611697a623144d6dcb607aac57aa1db1731e4a2d5c97" + }, + { + "path": "snapshots/codegen/upstream-codegen-071-3a132a6b4d.snap", + "sha256": "2c42f25dd2cd3c2c510066356a64048bb29e9bdc1b4f0b2906361b6d3d48ed35" + }, + { + "path": "snapshots/codegen/upstream-codegen-072-df70a74728.snap", + "sha256": "80e2781f988d17d41112f820022ffef354a43e30118ed13238d71612f9ca8de6" + }, + { + "path": "snapshots/codegen/upstream-codegen-073-ef0cdd87cf.snap", + "sha256": "5dbc6f46638b981fde91bdec886d786858d0e53e61712d48e2b103b5a4c250d2" + }, + { + "path": "snapshots/codegen/upstream-codegen-074-57a24a2690.snap", + "sha256": "a365f4630d7a0c57b3d5d5a86f7353970e866b388e8d079586d092a2ee5cf224" + }, + { + "path": "snapshots/codegen/upstream-codegen-075-fb8db22bb9.snap", + "sha256": "541e97ba17117d34792af36989cce3c5e9a27d33b7cbaa870722bf41d7382f87" + }, + { + "path": "snapshots/codegen/upstream-codegen-076-3d2d4543bb.snap", + "sha256": "e99419787f9f80359815bbd4656379e568a2162338bc7c74bceca2c79fb68333" + }, + { + "path": "snapshots/codegen/upstream-codegen-077-a65991a745.snap", + "sha256": "958dde8497a4dc970a6177bbadcdc4c1e1dc85ff6774eb1a7d273991b5083342" + }, + { + "path": "snapshots/codegen/upstream-codegen-078-d6b1085274.snap", + "sha256": "a873dd75640d408551a78c0cbee5bc3fecce586d96d96d2f2a91879fd9e9cd99" + }, + { + "path": "snapshots/codegen/upstream-codegen-079-9e7f3ee9e4.snap", + "sha256": "36104a68a8fadb2f293f3174fa75ab4259329c11defac8b64d58f29fdd70d5c9" + }, + { + "path": "snapshots/codegen/upstream-codegen-080-f6233dd6a0.snap", + "sha256": "8e6072bef47346b75c343914a6259780879b21d38292ede697d6c9c354a518be" + }, + { + "path": "snapshots/codegen/upstream-codegen-081-ed3fa48802.snap", + "sha256": "4c1806576e10b1da8499802ae121c360868c48c7e29d447485157cec6fc71259" + }, + { + "path": "snapshots/codegen/upstream-codegen-082-db0d8839e8.snap", + "sha256": "c58d9f0a2da935126e727ae9916595649c5f7bc6791d34a36b7834137eea523e" + }, + { + "path": "snapshots/codegen/upstream-codegen-083-1820110e8a.snap", + "sha256": "1825a0af76dc0d996189e74a37f4d8463e255d69c4f2d6fef1610604eb15ec36" + }, + { + "path": "snapshots/codegen/upstream-codegen-084-3d01c94f87.snap", + "sha256": "a9b05945ceeedc839d9922a7360e3ef1af5f0625d273f3927775730b88dfd113" + }, + { + "path": "snapshots/codegen/upstream-codegen-085-1f274ec7a6.snap", + "sha256": "06ab06429097c704621e1137040f99ea0dcb28257a6c8b4ab761aa61bc5dc5f9" + }, + { + "path": "snapshots/codegen/upstream-codegen-086-a44a580f30.snap", + "sha256": "e16e8224267c283b8ec88c0120fb05a8878ef1227bc7ecc167b873f2586601da" + }, + { + "path": "snapshots/codegen/upstream-codegen-087-e95c0eccc2.snap", + "sha256": "6073d872034caa4fcefb0e4ea9d7b1957b80e7ace1ab88419a665952c667a566" + }, + { + "path": "snapshots/codegen/upstream-codegen-088-f9ca312d49.snap", + "sha256": "5e561398a19fafa61c6ff61f1a9bcaf6ff13cdbc0d8ea61cba4b81c7d57eb7c3" + }, + { + "path": "snapshots/codegen/upstream-codegen-089-1d28dfdd93.snap", + "sha256": "0231cee889b05388c2d0ad372dbebdc3def7dbd22c95fb28c6bc10d6154b96a4" + }, + { + "path": "snapshots/codegen/upstream-codegen-090-e8878c5cbf.snap", + "sha256": "67345ecb6490aab268b9f0df7282e393b430af81dadf58b8bc93277c50ca8cf7" + }, + { + "path": "snapshots/codegen/upstream-codegen-091-dc61cb2277.snap", + "sha256": "a7b6d6847c5f8c5dd82f9b24fa30a02e8622aaeeedf2861db8ccd54f03b66ea0" + }, + { + "path": "snapshots/codegen/upstream-codegen-092-96adc16d0c.snap", + "sha256": "3ecabf566ecdb93bae9c5a69468d65a4ea6442b2c2afe30e90b1d1b994a5e837" + }, + { + "path": "snapshots/codegen/upstream-codegen-093-4573f32903.snap", + "sha256": "d41852e0beb036a55abdfdbed1a45fccf97e577e7de4fc6849c85e02c1f7e310" + }, + { + "path": "snapshots/codegen/upstream-codegen-094-e0d0f3bfe1.snap", + "sha256": "eb18e6ed6a7f6a46d104c51c55661f1fbb6d350713e595efee9aa07694b44000" + }, + { + "path": "snapshots/codegen/upstream-codegen-095-af3315e549.snap", + "sha256": "35fe4113006f110c456f86abe8cc9dabcadb0e690977548de274d8a277b0d6d9" + }, + { + "path": "snapshots/codegen/upstream-codegen-096-f8978e56ee.snap", + "sha256": "fdcb9cd3c4abea787262f769084c43501987c31d90843386e08e16912b71c380" + }, + { + "path": "snapshots/codegen/upstream-codegen-097-da58ebc1a5.snap", + "sha256": "2c1e7866b8a186664f6e6df5c03cb186bf5a52e0b578ef88ca59425bf01bf519" + }, + { + "path": "snapshots/codegen/upstream-codegen-098-7c2267436f.snap", + "sha256": "98d491ecb23a1b401b644a414b1a52753f9af48258f54d67aae772c82f8e40cf" + }, + { + "path": "snapshots/codegen/upstream-codegen-099-a2f954e973.snap", + "sha256": "3ac6d853b18d3e8ea3f32647ccd538dc167e4038d10d96a511648c1014eaf21a" + }, + { + "path": "snapshots/codegen/upstream-codegen-100-a546e9e784.snap", + "sha256": "70d678c5b672e40a2d9a305ad5f2148f2f282b6c73b6d97d5881f2a93e8e8f59" + }, + { + "path": "snapshots/codegen/upstream-codegen-101-394e6d9bf6.snap", + "sha256": "29cb754076ffcd1d8aaa86c8974e925e75b9abbe067e41603effe5e6e08790dc" + }, + { + "path": "snapshots/codegen/upstream-codegen-102-cbff7d3da9.snap", + "sha256": "4619b1a8c64e78df83ba895902124d6490aedda2e026a37ae5a8aebc754c959c" + }, + { + "path": "snapshots/codegen/upstream-codegen-103-246809daea.snap", + "sha256": "ce685f50c149eae395dfb53c24a37706e0ce784cfb7ef3a456a2df053fbaea87" + }, + { + "path": "snapshots/codegen/upstream-codegen-104-d68998542b.snap", + "sha256": "e79f457d001f3a00a57e55d51f76f280abc50c38b319352579954b3efbbb88da" + }, + { + "path": "snapshots/codegen/upstream-codegen-105-0137b6735e.snap", + "sha256": "4d6d8590b353e565bf88c67e4eb0df8035b9b7f03016cb68386466797e0bcf40" + }, + { + "path": "snapshots/codegen/upstream-codegen-106-6d687083cc.snap", + "sha256": "f62b1f2ad6c23fca03614674cf6b1b506440c1c71c8591575e334fdd6f919ab8" + }, + { + "path": "snapshots/codegen/upstream-codegen-107-f624c65fa8.snap", + "sha256": "ca3169796a72d0e8b68c8879f0f614370a463dc0d550bedd4eda6877186d8e5a" + }, + { + "path": "snapshots/codegen/upstream-codegen-108-c6c4dabf49.snap", + "sha256": "16c3b22b27845f27a4f31946637fa0cf4cc6fb5c0e115581dd04931cb0504ce3" + }, + { + "path": "snapshots/codegen/upstream-codegen-109-e2824ad5be.snap", + "sha256": "f3df1e13ac6361639dc9538a210f16f81ccafbcd3ab45199c7700b4892d0174f" + }, + { + "path": "snapshots/codegen/upstream-codegen-110-f2505cce4b.snap", + "sha256": "97ed3444d32a0bd96972b135f6fdfc174cdb2780828f0131425f75a6040928b7" + }, + { + "path": "snapshots/codegen/upstream-codegen-111-72c9d38832.snap", + "sha256": "b58b5cbacf2d2c2caf1840c94c883e54451ec918daf62100635f999868568468" + }, + { + "path": "snapshots/codegen/upstream-codegen-112-b5443c63a4.snap", + "sha256": "d77f06c90342a3dd5ba36674c661df69507f3a67553b9b82200dc429d7781a63" + }, + { + "path": "snapshots/codegen/upstream-codegen-113-702dadab11.snap", + "sha256": "96d1dc4ff32c7e7c711fbe147d89cabfe133f867e5532c9fdd28b9cf954ae118" + }, + { + "path": "snapshots/codegen/upstream-codegen-114-855686da78.snap", + "sha256": "20b665387217396219fb63be572b7c2780a4f160978d06977bbefbd82dfaaab0" + }, + { + "path": "snapshots/codegen/upstream-codegen-115-45d3f116b5.snap", + "sha256": "f6c114f58604fe47fcb367de81e3671cb36786200760b982bb2cbb249b666397" + }, + { + "path": "snapshots/codegen/upstream-codegen-116-23097e86ce.snap", + "sha256": "fea411418088c9df01e9eb22781c903ea8fc19ae0945651bd54aa0f278ccb590" + }, + { + "path": "snapshots/codegen/upstream-codegen-117-fb967a9342.snap", + "sha256": "464be3eb15026d43038048a91270ca974e66f1ea74b5bf4eb04c7b1af71235d0" + }, + { + "path": "snapshots/codegen/upstream-codegen-118-b5cba733fa.snap", + "sha256": "dca7e3f282cdbd6f44d58c3410d9046ecbf084d26527610a37caf4137299851a" + }, + { + "path": "snapshots/codegen/upstream-codegen-119-882c2abd91.snap", + "sha256": "4619b1a8c64e78df83ba895902124d6490aedda2e026a37ae5a8aebc754c959c" + }, + { + "path": "snapshots/codegen/upstream-codegen-120-7634e1ee10.snap", + "sha256": "4619b1a8c64e78df83ba895902124d6490aedda2e026a37ae5a8aebc754c959c" + }, + { + "path": "snapshots/codegen/upstream-codegen-121-0536a2e75b.snap", + "sha256": "4619b1a8c64e78df83ba895902124d6490aedda2e026a37ae5a8aebc754c959c" + }, + { + "path": "snapshots/codegen/upstream-codegen-122-7ddad74cc1.snap", + "sha256": "fa160e7ac15e5b3f8f1c441ff03960bff3743a51b320441bfe90b0c8c8d01e13" + }, + { + "path": "snapshots/codegen/upstream-codegen-123-179129a02c.snap", + "sha256": "c170af0139455b4bcb3865ca33240a5abb690a595883b72121dcc2308785fa76" + }, + { + "path": "snapshots/codegen/upstream-codegen-124-bdedf14335.snap", + "sha256": "fa160e7ac15e5b3f8f1c441ff03960bff3743a51b320441bfe90b0c8c8d01e13" + }, + { + "path": "snapshots/codegen/upstream-codegen-125-4a4a93c4c9.snap", + "sha256": "b950e506554c3c322697298c818643c429c04fb2e192302eec24b02579f380d7" + }, + { + "path": "snapshots/codegen/upstream-codegen-126-14073e1999.snap", + "sha256": "fa160e7ac15e5b3f8f1c441ff03960bff3743a51b320441bfe90b0c8c8d01e13" + }, + { + "path": "snapshots/codegen/upstream-codegen-127-1d5ead088d.snap", + "sha256": "484b506d2b4369f5d1c942d100083336a8c8ed4f6953c43e0a00f86b8d768888" + }, + { + "path": "snapshots/codegen/upstream-codegen-128-2222304a14.snap", + "sha256": "1217bc3380420e81983d14fa4567cbf310563a594878f6331e4523228ba4d2cc" + }, + { + "path": "snapshots/codegen/upstream-codegen-129-7c97156f7f.snap", + "sha256": "a586363c59e60eddf089368b0c6311cc132b3bba45bed69396d2ab99d7860f55" + }, + { + "path": "snapshots/codegen/upstream-codegen-130-bbd4e9a97a.snap", + "sha256": "4adaf9c592ba13a84b2a164fd03c0a680b03335b9f0301f54156925313e91f8b" + }, + { + "path": "snapshots/codegen/upstream-codegen-131-c6ef80ad0c.snap", + "sha256": "a1e124c1ef4c10d5f8291b69575dedd29b6cd0e2d9587bb721398efe421e22fe" + }, + { + "path": "snapshots/codegen/upstream-codegen-132-9a7b0243b6.snap", + "sha256": "fa160e7ac15e5b3f8f1c441ff03960bff3743a51b320441bfe90b0c8c8d01e13" + }, + { + "path": "snapshots/codegen/upstream-codegen-133-f425fa006c.snap", + "sha256": "106b48ed7bf536c4dda9a386ddadb066a8cfb543b3931cc52e26ecc5fce60875" + }, + { + "path": "snapshots/codegen/upstream-codegen-134-f80fffb8b4.snap", + "sha256": "3c6ca1e1b36a6081845a40c97744b6a6261367a0c23f1c98f8ef81c08a1121bf" + }, + { + "path": "snapshots/codegen/upstream-codegen-135-e00e826755.snap", + "sha256": "c80d37a8469de128dcca506aba7da907ba25d71a3b9a287bfd8fb73cbc8e465b" + }, + { + "path": "snapshots/codegen/upstream-codegen-136-b68bd43ea7.snap", + "sha256": "4adaf9c592ba13a84b2a164fd03c0a680b03335b9f0301f54156925313e91f8b" + }, + { + "path": "snapshots/codegen/upstream-codegen-137-83b2706e92.snap", + "sha256": "a8c0700f1ca526a049ac3ab115e0eed986be66455e5e51b463cf3286fbdb145f" + }, + { + "path": "snapshots/codegen/upstream-codegen-138-9cccfcb552.snap", + "sha256": "06a76b64be48d981b5e25497af7526164a1cb8b5c607fc2805709ee69dc25cf0" + }, + { + "path": "snapshots/codegen/upstream-codegen-139-63f7b1f175.snap", + "sha256": "95d287efdbf6ea1df14d68a6550f845ccda8eb05957172fb4362fc18c551d5dc" + }, + { + "path": "snapshots/codegen/upstream-codegen-140-e577df9ad5.snap", + "sha256": "980e22dd4042cc685b49c690a23688c4eeffd11bbfc9f6894ac869882332df3f" + }, + { + "path": "snapshots/codegen/upstream-codegen-141-48307df49b.snap", + "sha256": "41d7366a4f6bb76a11551755f7cff016fb60b3aceb11e0395f1dec5c3d66c760" + }, + { + "path": "snapshots/codegen/upstream-codegen-142-ac82229282.snap", + "sha256": "bdfc7d7b71563b12675756e301fbfda67699f3a2ab6000ba07b945f78460036b" + }, + { + "path": "snapshots/codegen/upstream-codegen-143-52b441f9f4.snap", + "sha256": "a3a2a629306c0b50c80cd4e3db7c9bd410e5d5c97dd2d87652a998a5b108403c" + }, + { + "path": "snapshots/codegen/upstream-codegen-144-042a6de403.snap", + "sha256": "95d287efdbf6ea1df14d68a6550f845ccda8eb05957172fb4362fc18c551d5dc" + }, + { + "path": "snapshots/codegen/upstream-codegen-145-f7001b5648.snap", + "sha256": "c72e7fa29de3f8a34afb2317af0578dbfa61f5bca610af8d3ec75587936695b6" + }, + { + "path": "snapshots/codegen/upstream-codegen-146-56be99e864.snap", + "sha256": "f0e89b4cdab6ae89c982a2536581dc1dad2981d5e091e2b0c654e1d11336b28e" + }, + { + "path": "snapshots/codegen/upstream-codegen-147-bb7df0f2f1.snap", + "sha256": "5e9cbcdcf299a32bbefd73b2e34d053d9f29adf422a3189885cbc89ec83d4e17" + }, + { + "path": "snapshots/codegen/upstream-codegen-148-62e9137131.snap", + "sha256": "1be5fc64000226fe400eec3a31388cb93769de481460c22dbc4d372c9838ae06" + }, + { + "path": "snapshots/codegen/upstream-codegen-149-2491f4c5a5.snap", + "sha256": "14602bf64956c41b6c2b8dcdb261d69fdba2874bc44957c7e419e1e553568f7c" + }, + { + "path": "snapshots/codegen/upstream-codegen-150-ecb5bb4337.snap", + "sha256": "4a999efbfac37c6723b88b06f836cbe738628b8558c4373ea423d61e146f0b04" + }, + { + "path": "snapshots/codegen/upstream-codegen-151-7993d252dc.snap", + "sha256": "9ea317a6057fae92d8db904e2d6b0fab60a36df6c21d73f01c2e2a20f130952c" + }, + { + "path": "snapshots/codegen/upstream-codegen-152-a05026a9db.snap", + "sha256": "7abbfe6de3a16164d0545d19ec16bde58f001a043563019758f9cdc591d178fd" + }, + { + "path": "snapshots/codegen/upstream-codegen-153-fb5205fc52.snap", + "sha256": "370f4addd5899988bc2f4ba99ca6fa9715aba076f0851c8b2785d4b575fe74d8" + }, + { + "path": "snapshots/codegen/upstream-codegen-154-1409376769.snap", + "sha256": "71fc71d216efc528f794c1287c88d3813d046cb519a43ff8db2e1aee3ebed1fd" + }, + { + "path": "snapshots/codegen/upstream-codegen-155-557eb84a98.snap", + "sha256": "ad5d936b88c22d0fa3e34903c59f8990ad8c956783b7ca93440c22da61b6122c" + }, + { + "path": "snapshots/codegen/upstream-codegen-156-bec8be9b99.snap", + "sha256": "7fdd5dc5696593d77e050be4e8ebfe3986ebd56c0bd7df6ce969a5ced21c9c39" + }, + { + "path": "snapshots/codegen/upstream-codegen-157-4cb71f2863.snap", + "sha256": "f5f790b50f54bfd47ccd3e774a755bf9254ef1f85c0dea6b087a137d875c1782" + }, + { + "path": "snapshots/codegen/upstream-codegen-158-8e4821dcbc.snap", + "sha256": "7fdd5dc5696593d77e050be4e8ebfe3986ebd56c0bd7df6ce969a5ced21c9c39" + }, + { + "path": "snapshots/codegen/upstream-codegen-159-30962241b1.snap", + "sha256": "46fb16c47fb5df18dc0b01ca702832189731a50e41191475f54fff2b7e220918" + }, + { + "path": "snapshots/codegen/upstream-codegen-160-db5d3ac9d8.snap", + "sha256": "67f524606ef7be90cb3267bef24807afd761e8df380875476ccc977426069f7f" + }, + { + "path": "snapshots/codegen/upstream-codegen-161-5b230821f2.snap", + "sha256": "bd8d6869ee543fe5765acb31927c5f090473003e6f0d22563951bb201180d5e8" + }, + { + "path": "snapshots/codegen/upstream-codegen-162-51e1254b4c.snap", + "sha256": "2f3ff0f4f6817e7791581b5c15ba1ff21b8dff64c1e82b657f3c9fa9997a10d1" + }, + { + "path": "snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap", + "sha256": "7e246fbf50e071ab82a7bfeb4f1f8b637088db23b81e928596bbf700115d324d" + }, + { + "path": "snapshots/codegen/upstream-codegen-164-33e4c6591c.snap", + "sha256": "4c49a83e62c25bc80c586b49b8c4ee7db5965a7e1f0507ca869b75cbee4e4db8" + }, + { + "path": "snapshots/codegen/upstream-codegen-165-501ee1df12.snap", + "sha256": "bbd514b21e0c8fd1c30baed210570aef96d21e3a1d21e4780134e653a477acf0" + }, + { + "path": "snapshots/codegen/upstream-codegen-166-cda14f0b08.snap", + "sha256": "bdc8eedbba50a15d8bb417baf0a60765de1e304e187c4c23c173b9729cdadda6" + }, + { + "path": "snapshots/codegen/upstream-codegen-167-114a88771f.snap", + "sha256": "9d164445800460cdc18a60985363fc92dff602d61380111a38d92dec99fdc910" + }, + { + "path": "snapshots/codegen/upstream-codegen-168-4211bd8279.snap", + "sha256": "694d857629a3cb5f8864e05c975be6873a757e29559adf1ad1ec722a55df80fd" + }, + { + "path": "snapshots/codegen/upstream-codegen-169-796132e0cf.snap", + "sha256": "2c07de5857257d483461ab1d6ec456b48bf52763acf6b6b4f04dd918cf5d5f35" + }, + { + "path": "snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap", + "sha256": "557af3796bc4320cbcd97e1b81a8b8ab195bf7c60ed0bd8c6783f410684b81c4" + }, + { + "path": "snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap", + "sha256": "ba76fdca837aaace943a867f477756593846785ec5e802d433ec7b276b26f8c0" + }, + { + "path": "snapshots/codegen/upstream-codegen-172-99028c85ce.snap", + "sha256": "a34c8d23af2f751e6fc91a64e6c750193a82e8ea137c15a356d1557a49f55446" + }, + { + "path": "snapshots/codegen/upstream-codegen-173-64dbd7a102.snap", + "sha256": "a1b5a5fee78efb6a8bb9d9748733478109834728e1c4061ef9d104aaffbfe14b" + }, + { + "path": "snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap", + "sha256": "a8ce5089ed0d7031a9531e611b30f64199bd0d9acbae69fabbb71a2189207a84" + }, + { + "path": "snapshots/codegen/upstream-codegen-175-ec3fd45731.snap", + "sha256": "c97b2a5c5538b91d8e3fd41192996bda22e24b3cf65833e3c02b1f0af360665f" + }, + { + "path": "snapshots/codegen/upstream-codegen-176-653a030fdc.snap", + "sha256": "d96e2f08da57a28985ea698a0639518002fbf8d7fbfd3c8edfe7ba29b2d6ed01" + }, + { + "path": "snapshots/codegen/upstream-codegen-177-c147e7dd39.snap", + "sha256": "d96e2f08da57a28985ea698a0639518002fbf8d7fbfd3c8edfe7ba29b2d6ed01" + }, + { + "path": "snapshots/codegen/upstream-codegen-178-d69d60d688.snap", + "sha256": "5a43c874067ff83a73b9c36a3340f7dfaa1157ed5dc424f9a0fb911742ee74b2" + }, + { + "path": "snapshots/codegen/upstream-codegen-179-80620f6587.snap", + "sha256": "74d20a08d2ed320f75bf76b43fc3a3c808b6805709899d0b534ce5a0dded70e8" + }, + { + "path": "snapshots/codegen/upstream-codegen-180-ad1a31fd03.snap", + "sha256": "621814f5be07790f2683103d24c885be68daadbcb7d689f1000be3b5135f6b7d" + }, + { + "path": "snapshots/codegen/upstream-codegen-181-5afa626d49.snap", + "sha256": "cdd86d5dc0becc9fce97bd9169c210c4310822bc94e59549d342d68a9bbd3d5e" + }, + { + "path": "snapshots/codegen/upstream-codegen-182-c45d19171b.snap", + "sha256": "010d4e2daa31c89e53e26f8f2a3108202892cfe70cc4ec8dbeaa121e0f446ea5" + }, + { + "path": "snapshots/codegen/upstream-codegen-183-7ede517e99.snap", + "sha256": "2d1905bbcb41e93e42884cbdf79613df390dbe8c4c3cb74718e60a6a14759224" + }, + { + "path": "snapshots/codegen/upstream-codegen-184-0c09788bb7.snap", + "sha256": "791a2ff594f70f1cfd9ccf8a3a20fb9e35f12124f29fb79f1218e74caff5e5c3" + }, + { + "path": "snapshots/codegen/upstream-codegen-185-e79c2ae189.snap", + "sha256": "955eaadf183c9a6bfe6dcd3baca9690e4a4fd551900744488cd15a456c53cc71" + }, + { + "path": "snapshots/codegen/upstream-codegen-186-0988e78887.snap", + "sha256": "b03b52f1c04b5ce92f14923ae8a5eb9ca756aafd9de7e5821d8514ee22bae358" + }, + { + "path": "snapshots/codegen/upstream-codegen-187-8b30b935a4.snap", + "sha256": "a0a7ba064a40b5dbd8bce046554424515958ee2f7f81afac6140397c33e05930" + }, + { + "path": "snapshots/codegen/upstream-codegen-188-ea2a1af6a1.snap", + "sha256": "0a3e7d87db260e0bd7ad9be8baadec96a6395746a514140b5d7a35cfd1fe7145" + }, + { + "path": "snapshots/codegen/upstream-codegen-189-75736e48e0.snap", + "sha256": "3685fd5006169f889dfb55e82ac2f018d90f8e5d90bb94bfb5b5fbb993829e98" + }, + { + "path": "snapshots/codegen/upstream-codegen-190-d5a9045231.snap", + "sha256": "936bcd7d3ac9ccf2ac9e4b006f328af6d2da819cc35ac9893e6437a7b3aaa52e" + }, + { + "path": "snapshots/codegen/upstream-codegen-191-2021d398f8.snap", + "sha256": "0aaa72bab8cd99db69a800c9ed0defcde7c214931616798c4829bf61dcae1e12" + }, + { + "path": "snapshots/codegen/upstream-codegen-192-dd2c3f0c1c.snap", + "sha256": "2d83d0e5a94d5d57f4a82627e63d25d178c14f7d48864cd55247c70ef7652832" + }, + { + "path": "snapshots/codegen/upstream-codegen-193-bd488a5710.snap", + "sha256": "c06e6c1d82b1d663ffc9b27d194bd25691c1d68b1cc13f56e2b6027eda22ed6d" + }, + { + "path": "snapshots/codegen/upstream-codegen-194-17922977f6.snap", + "sha256": "c06e6c1d82b1d663ffc9b27d194bd25691c1d68b1cc13f56e2b6027eda22ed6d" + }, + { + "path": "snapshots/codegen/upstream-codegen-195-1a6efe22a8.snap", + "sha256": "922e56218783cc63e2a7e17a7d8ea701a27d806fb4f1cc5e31ed46c317299403" + }, + { + "path": "snapshots/codegen/upstream-codegen-196-d14f03afcd.snap", + "sha256": "922e56218783cc63e2a7e17a7d8ea701a27d806fb4f1cc5e31ed46c317299403" + }, + { + "path": "snapshots/codegen/upstream-codegen-197-026402bf2e.snap", + "sha256": "3d9f49686d3e34a7127e8a4a57220bf57b085e111f7627c5ee029c70255b62c9" + }, + { + "path": "snapshots/codegen/upstream-codegen-198-a9ea7ba9c3.snap", + "sha256": "8472c86d7057c60080db9766ef2d143c8ef90efc92cb5de39cf705cd90693530" + }, + { + "path": "snapshots/codegen/upstream-codegen-199-829a5c949d.snap", + "sha256": "69ca4c115a4912b14e8a34a144e38d5e9a0ddf2ea0096bcd6a055be19fb64d7f" + }, + { + "path": "snapshots/codegen/upstream-codegen-200-3313d92719.snap", + "sha256": "d7df32fa7619ccf95bc462f9f5537ce81622eba36de2cda50185782136a116c0" + }, + { + "path": "snapshots/codegen/upstream-codegen-201-8207a4008e.snap", + "sha256": "6898445628e3ae3ede1675a24c9515caf083369670d3598beb4abf5058106416" + }, + { + "path": "snapshots/codegen/upstream-codegen-202-2786eda075.snap", + "sha256": "98d09516cc7a9fc48369cf17a24f64a88c4153c3c0d5e1055ec8a20475a29702" + }, + { + "path": "snapshots/codegen/upstream-codegen-203-8af03217a3.snap", + "sha256": "bbb4efc27b6547cbfed03a96a878c489e8a0611dcd9ae9e0928faf610c82d6ec" + }, + { + "path": "snapshots/codegen/upstream-codegen-204-2b2967c8c4.snap", + "sha256": "98d09516cc7a9fc48369cf17a24f64a88c4153c3c0d5e1055ec8a20475a29702" + }, + { + "path": "snapshots/codegen/upstream-codegen-205-cc3ea5202a.snap", + "sha256": "9b380696023db9a84b7063c9ca82d81bdda607bd9e4853770a519b9fc8bee055" + }, + { + "path": "snapshots/codegen/upstream-codegen-206-b5c5dc97eb.snap", + "sha256": "f12fb5cc1d5b43b74433ea9447fda3a8e4744a57f71aa7ea1a970a73e0ff8613" + }, + { + "path": "snapshots/codegen/upstream-codegen-207-b0e134acf4.snap", + "sha256": "fc7939b4c9603211a68ee0c0beb0ca67b5d9105c1e4c5c8139b5bf227f46c1a5" + }, + { + "path": "snapshots/codegen/upstream-codegen-208-1a343e45db.snap", + "sha256": "c17078c4f8bede878eb251de6756a9ec8ad5f5c9e3860974ebad089f5d23cf04" + }, + { + "path": "snapshots/codegen/upstream-codegen-209-0514b0990f.snap", + "sha256": "b117ee109393f355b2170a643289875aae10ede094bd17590e5d48f7cd146969" + }, + { + "path": "snapshots/codegen/upstream-codegen-210-1b24060767.snap", + "sha256": "e6f7cdbd19b4fcb1af2b089339b1348a82bc992a919f44c75951d2d9305cf62c" + }, + { + "path": "snapshots/codegen/upstream-codegen-211-2e15c55701.snap", + "sha256": "067be6facd0104e5070e09f18c83b7409ef2ca7bc92a08bc0b76cb6677cb255e" + }, + { + "path": "snapshots/codegen/upstream-codegen-212-2a8f7b4a99.snap", + "sha256": "a239b4ee445d5353c8de741cd372f4b6cd6cf6d7266ae651735a7f585db409c1" + }, + { + "path": "snapshots/codegen/upstream-codegen-213-aa53408d2f.snap", + "sha256": "65b933ca7a214ff585857195d4885a6b0632849e7c6227045a0a4949add4e9eb" + }, + { + "path": "snapshots/codegen/upstream-codegen-214-6dc49544c0.snap", + "sha256": "ab0f07f43341837a6ef51b6954d40a48793ae169cc4f8824401c57cc153aa93e" + }, + { + "path": "snapshots/codegen/upstream-codegen-215-39e86f8f53.snap", + "sha256": "7fe1ae657e3dfd6b00305960cd00a7518f8f2e86b99ec5e8267af8d3607f3967" + }, + { + "path": "snapshots/codegen/upstream-codegen-216-465422d47b.snap", + "sha256": "760b1a82f501c7753ac24a95236af3d894911527a2c4a02095b0b718e222574c" + }, + { + "path": "snapshots/codegen/upstream-codegen-217-2d887b2a8b.snap", + "sha256": "7481bbd74a0188d92ec1a6ce6d5e8e0f5692d47d01bef602594196215a0feec4" + }, + { + "path": "snapshots/codegen/upstream-codegen-218-587666c709.snap", + "sha256": "3b343c4988076d2b1674db437e9579bf8ee6b1047b7527cef635660943708381" + }, + { + "path": "snapshots/codegen/upstream-codegen-219-c6446b7b2e.snap", + "sha256": "60818cde4db27ad1878e23a0d236bff7be8b2175cd5bf9b36fe3f0c8bc1de56b" + }, + { + "path": "snapshots/codegen/upstream-codegen-220-5980153f26.snap", + "sha256": "a147eecd443176ecd68bbfa21909133f7298c0fd79b983fc86917c179d6729bb" + }, + { + "path": "snapshots/codegen/upstream-codegen-221-d003bdb336.snap", + "sha256": "0ae3faa2d63a3bffdc95e524aaefe37b9cf9d120b9b6765b78e9422ba0bfaffb" + }, + { + "path": "snapshots/codegen/upstream-codegen-222-f2d780c847.snap", + "sha256": "127e0e2def7894eb615c3d0747dc7e50d678412d821d13cec2b9283e1b04cf8b" + }, + { + "path": "snapshots/codegen/upstream-codegen-223-4dc8092992.snap", + "sha256": "d446072c4604d6298a00415a161d55b7a3d1faf77ae555ea0cdd4fee6149c36b" + }, + { + "path": "snapshots/codegen/upstream-codegen-224-075a41e65c.snap", + "sha256": "2f3182b075c68bd00f6b3b188bc6e88d24eea76b0fd60afac1025952191a951b" + }, + { + "path": "snapshots/codegen/upstream-codegen-225-00fb8a129e.snap", + "sha256": "8a4e4ad291834d0f48250da3c6893b19ba8ebd00af9e2f3a28531c03dcd7ad4a" + }, + { + "path": "snapshots/codegen/upstream-codegen-226-b2c28bcc8f.snap", + "sha256": "8a4e4ad291834d0f48250da3c6893b19ba8ebd00af9e2f3a28531c03dcd7ad4a" + }, + { + "path": "snapshots/codegen/upstream-codegen-227-bebc4e7262.snap", + "sha256": "26dc39eae348a4dbb6a3ae6189b8db544b337cf08d84356b53407b626cd1df35" + }, + { + "path": "snapshots/codegen/upstream-codegen-228-221bd0c553.snap", + "sha256": "d4f0310cb3d1b389a76fd083262dd6f0b61004ed44d05edd2d378de4adeb786b" + }, + { + "path": "snapshots/codegen/upstream-codegen-229-9f57002cd6.snap", + "sha256": "6b30824e8e73c3c73968858c32d285daa766d95951ff9f42d0961cd9b8b222b1" + }, + { + "path": "snapshots/codegen/upstream-codegen-230-2af59fd9fa.snap", + "sha256": "26dc39eae348a4dbb6a3ae6189b8db544b337cf08d84356b53407b626cd1df35" + }, + { + "path": "snapshots/codegen/upstream-codegen-231-117d816fb9.snap", + "sha256": "f1344b6c0be6f7519058fee34bb9432aa52ce80973fc3eeb47f99207cb282e9f" + }, + { + "path": "snapshots/codegen/upstream-codegen-232-8e875ce9e3.snap", + "sha256": "1a9acd9d2400fdf0bf040e63eec183a161161205fe438f76a34498c4378f450b" + }, + { + "path": "snapshots/codegen/upstream-codegen-233-0a60be5fbc.snap", + "sha256": "cd49878d5f8f07b0b7b5a39c049afdc6ac345deda3c92a0cd6bfbf5110369579" + }, + { + "path": "snapshots/codegen/upstream-codegen-234-01ad9a0db0.snap", + "sha256": "66642a3009a10922e11d93ce26e7eb2401b42e13833fa0c5be3c35adf3bd97f5" + }, + { + "path": "snapshots/codegen/upstream-codegen-235-8a3992468b.snap", + "sha256": "66642a3009a10922e11d93ce26e7eb2401b42e13833fa0c5be3c35adf3bd97f5" + }, + { + "path": "snapshots/codegen/upstream-codegen-236-621c6d6a9e.snap", + "sha256": "46b22a387cf010790c10de0a1a2f5abcadd530396aaa97084229c0764906a241" + }, + { + "path": "snapshots/codegen/upstream-codegen-237-01ee478666.snap", + "sha256": "fb11d0e3d3c5d7dc8b2c4e84f207e1284eb3902a1020bc8ba8e171954c262181" + }, + { + "path": "snapshots/codegen/upstream-codegen-238-1a8cf8c870.snap", + "sha256": "c027c04b4adc0cf327d8bdd60f0cfaf3529b60c85cd6955d07e919f1d4f8a1bb" + }, + { + "path": "snapshots/codegen/upstream-codegen-239-a6dada3682.snap", + "sha256": "9cf29f9bc192169ef5d677b3d7592a97c21d24cfc86930666286539a30025628" + }, + { + "path": "snapshots/codegen/upstream-codegen-240-77d56a1585.snap", + "sha256": "c027c04b4adc0cf327d8bdd60f0cfaf3529b60c85cd6955d07e919f1d4f8a1bb" + }, + { + "path": "snapshots/codegen/upstream-codegen-241-e171ef72ce.snap", + "sha256": "9cf29f9bc192169ef5d677b3d7592a97c21d24cfc86930666286539a30025628" + }, + { + "path": "snapshots/codegen/upstream-codegen-242-5c198a8490.snap", + "sha256": "4d523a1399ab5eb29d7d1cc1a9a398c6e96d73fd6bbf4d99b0ea07fc8a8dfca7" + }, + { + "path": "snapshots/codegen/upstream-codegen-243-14366a47ff.snap", + "sha256": "5fbba0ac55fed83c64aeeb4ee3984b06683325b8663f1ab33ed1201e2fdbc933" + }, + { + "path": "snapshots/codegen/upstream-codegen-244-4ccea91f13.snap", + "sha256": "6a5bec0dda5697c78dbf553f55cb3c8ff25c1ddbaf4981282d23353011526c8c" + }, + { + "path": "snapshots/codegen/upstream-codegen-245-537356bcf4.snap", + "sha256": "1b6c59a5f079a273885a7a5111b72d4de873f8fc09b0b0a4141ccf21f2218475" + }, + { + "path": "snapshots/codegen/upstream-codegen-246-295f39e09b.snap", + "sha256": "d7501e23e776794310b8a6ac9ebbc003214f69952ab508d2858b59a2ea3268c1" + }, + { + "path": "snapshots/codegen/upstream-codegen-247-39d6959685.snap", + "sha256": "e2a6dad76fd959a0cf0c79ba7fa4d14968bb8a134b349c039b5cb1cdfe4beb3e" + }, + { + "path": "snapshots/codegen/upstream-codegen-248-d1bc18e068.snap", + "sha256": "c6668d372d8bd8bcd23b559f1d33a426fae6f5a1e119a06f402d351d40f6b708" + }, + { + "path": "snapshots/codegen/upstream-codegen-249-6b8a42981d.snap", + "sha256": "6384095759151e9d7ade571db4134e5f0e6bcbc56fbc564fa9d87f274c0a54ef" + }, + { + "path": "snapshots/codegen/upstream-codegen-250-935ccdb80f.snap", + "sha256": "879ef30a2d4c0e4b26a56a9e4222f490b784e16ddcb35386e647069b4da3b8d1" + }, + { + "path": "snapshots/codegen/upstream-codegen-251-50acddfb96.snap", + "sha256": "c20e28e8155b33779019db48526fd5c2af2649257f7ead079974e750fdacf533" + }, + { + "path": "snapshots/codegen/upstream-codegen-252-49e979239e.snap", + "sha256": "d0bbc2da26aa80c8ee730a86f25c646e9d3d6739f5efd68c4fa4ddc66f2a306d" + }, + { + "path": "snapshots/codegen/upstream-codegen-253-347a2e5fb2.snap", + "sha256": "014c07f7150972049d130a4235abc2ad6ea39cfc381880e4408dd43ca21d2069" + }, + { + "path": "snapshots/codegen/upstream-codegen-254-9f340b6a10.snap", + "sha256": "564f64a6d54cc99fbaba3bbcc90b855efad084794c37ec69653c97290414494e" + }, + { + "path": "snapshots/codegen/upstream-codegen-255-d01d8c7de6.snap", + "sha256": "54e77dd8979feb1cec3f1636febe419c07cb40e7b0427181e81eaab0aa680557" + }, + { + "path": "snapshots/codegen/upstream-codegen-256-baf32cc08e.snap", + "sha256": "2a20b5cf22c768e86ff5f73a0aa3f522fdee78956af1dc38f90a5cba99a25255" + }, + { + "path": "snapshots/codegen/upstream-root-257-f23261dd4f.snap", + "sha256": "86b89161d10b076a122269d6e4f428b4981f2e7163e18ad45c38a153e889b530" + }, + { + "path": "snapshots/codegen/upstream-root-258-5cfe8baba5.snap", + "sha256": "c6d9f1d632bf12bde7eebd2ca331bfe39c3fcab6949c71e3a70cdcbcf07b0c33" + }, + { + "path": "snapshots/codegen/upstream-root-259-0ae0aa9528.snap", + "sha256": "402c5b46e5395c761cb3360f6604e032337620d2b59d7e65625866a36fa91168" + }, + { + "path": "snapshots/codegen/upstream-root-260-2dfc3ae054.snap", + "sha256": "7e298aca4a35aa7d51c1f6ca36801a92d97d27f4c0dbb11025ee324a7a27c11b" + }, + { + "path": "snapshots/responsive/upstream-responsive-266-4cd888ffd0.snap", + "sha256": "cfc6ab4bf4f912d04877ae60d9926d0e86cd6cb781a517202a59609acc8c8527" + }, + { + "path": "snapshots/responsive/upstream-responsive-267-88b21cad2a.snap", + "sha256": "333dc3e0205064b0060e07533e1a013e8f11b61cebc7e25b8f0023a1ae0b0f77" + }, + { + "path": "snapshots/responsive/upstream-responsive-268-7dd1d5c323.snap", + "sha256": "617b19630eea0831b1dfcbcf6c5c35078c3d337f838d52669fce883067ae7665" + }, + { + "path": "snapshots/responsive/upstream-viewport-261-928195cb2b.snap", + "sha256": "008c0180e8bbce5fcda48e5f0a49718b3b114162d75a86e390481ea3908ccd68" + }, + { + "path": "snapshots/responsive/upstream-viewport-262-0f19b3123e.snap", + "sha256": "baf09b93099788939736c23d2d93dd5d880df9ef3e8b618186a8faebd3fb74bf" + }, + { + "path": "snapshots/snapshot/upstream-render-263-d2763f9b9f.snap", + "sha256": "f1519e0ec80111f2e2d0cd9def83b6afff31aa7c1b4a3b110659b4fc08dfc4bd" + }, + { + "path": "snapshots/snapshot/upstream-render-264-51e29ada52.snap", + "sha256": "d4d4e1c9e311fcd26408331a3fd01c482a77274467e05ffa4e6564301ed8da6f" + }, + { + "path": "snapshots/snapshot/upstream-render-265-94e906e79b.snap", + "sha256": "e14e432c5c1e43a78331071a03f197a184fa2e5cdd81da3184d4578dda7c4e42" + } + ] +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-001-4410624749.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-001-4410624749.snap new file mode 100644 index 0000000..3fe43e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-001-4410624749.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-002-c1ac954cb6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-002-c1ac954cb6.snap new file mode 100644 index 0000000..f2fe1e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-002-c1ac954cb6.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-003-c855738695.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-003-c855738695.snap new file mode 100644 index 0000000..0cee4a0 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-003-c855738695.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-004-8ec61c5bb5.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-004-8ec61c5bb5.snap new file mode 100644 index 0000000..09694a8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-004-8ec61c5bb5.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-005-bcc6ca7dbf.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-005-bcc6ca7dbf.snap new file mode 100644 index 0000000..b344323 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-005-bcc6ca7dbf.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-006-86c21dc8ce.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-006-86c21dc8ce.snap new file mode 100644 index 0000000..bb27719 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-006-86c21dc8ce.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-007-c1c1afa5d7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-007-c1c1afa5d7.snap new file mode 100644 index 0000000..e7d7f94 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-007-c1c1afa5d7.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-008-8ea06a6c88.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-008-8ea06a6c88.snap new file mode 100644 index 0000000..3123fe9 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-008-8ea06a6c88.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-009-008aac1a2c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-009-008aac1a2c.snap new file mode 100644 index 0000000..028ba62 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-009-008aac1a2c.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-010-8454d22acd.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-010-8454d22acd.snap new file mode 100644 index 0000000..53a8e09 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-010-8454d22acd.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-011-72709aab82.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-011-72709aab82.snap new file mode 100644 index 0000000..7be839c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-011-72709aab82.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-012-92c671c0e8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-012-92c671c0e8.snap new file mode 100644 index 0000000..7526b53 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-012-92c671c0e8.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-013-351e69a13b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-013-351e69a13b.snap new file mode 100644 index 0000000..fe9bc2c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-013-351e69a13b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-014-828c466260.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-014-828c466260.snap new file mode 100644 index 0000000..e73f706 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-014-828c466260.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-015-eaef178e47.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-015-eaef178e47.snap new file mode 100644 index 0000000..989655a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-015-eaef178e47.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-016-3f1fb1569b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-016-3f1fb1569b.snap new file mode 100644 index 0000000..f4d9c5a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-016-3f1fb1569b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-017-44cff97cec.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-017-44cff97cec.snap new file mode 100644 index 0000000..199be56 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-017-44cff97cec.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-018-bc5eb21a9e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-018-bc5eb21a9e.snap new file mode 100644 index 0000000..c9690e0 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-018-bc5eb21a9e.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-019-4988f86e5e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-019-4988f86e5e.snap new file mode 100644 index 0000000..c6db31b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-019-4988f86e5e.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-020-a9d569be7a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-020-a9d569be7a.snap new file mode 100644 index 0000000..3ffb57c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-020-a9d569be7a.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-021-6cae93b843.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-021-6cae93b843.snap new file mode 100644 index 0000000..b384054 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-021-6cae93b843.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-022-8dce1fe15f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-022-8dce1fe15f.snap new file mode 100644 index 0000000..722b5b1 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-022-8dce1fe15f.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-023-040bff1c77.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-023-040bff1c77.snap new file mode 100644 index 0000000..e66565a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-023-040bff1c77.snap @@ -0,0 +1,14 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-024-eb534f354c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-024-eb534f354c.snap new file mode 100644 index 0000000..f244519 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-024-eb534f354c.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-025-74cf3c3463.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-025-74cf3c3463.snap new file mode 100644 index 0000000..2225651 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-025-74cf3c3463.snap @@ -0,0 +1,14 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-026-e6df42a1c0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-026-e6df42a1c0.snap new file mode 100644 index 0000000..273cca3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-026-e6df42a1c0.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-027-2373d0fb1b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-027-2373d0fb1b.snap new file mode 100644 index 0000000..0bd04c2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-027-2373d0fb1b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-028-0dcf04d5ca.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-028-0dcf04d5ca.snap new file mode 100644 index 0000000..4167f7c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-028-0dcf04d5ca.snap @@ -0,0 +1,15 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + AutoSize +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-029-dd01228f04.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-029-dd01228f04.snap new file mode 100644 index 0000000..552bca3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-029-dd01228f04.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Text with {"{"}braces{"}"} {"&"} {"<"}tags{">"} +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-030-f4528f2a74.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-030-f4528f2a74.snap new file mode 100644 index 0000000..041b651 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-030-f4528f2a74.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + {" "}spaced{" "} +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-031-5d6f0a82e3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-031-5d6f0a82e3.snap new file mode 100644 index 0000000..8423b7b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-031-5d6f0a82e3.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + OneLine +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-032-be85ad69d0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-032-be85ad69d0.snap new file mode 100644 index 0000000..94dfecb --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-032-be85ad69d0.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Three lines of text +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-033-4f42f0cabb.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-033-4f42f0cabb.snap new file mode 100644 index 0000000..e1f3228 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-033-4f42f0cabb.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-034-e25e34d3de.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-034-e25e34d3de.snap new file mode 100644 index 0000000..5d2015d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-034-e25e34d3de.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-035-1d66b429cf.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-035-1d66b429cf.snap new file mode 100644 index 0000000..27662b1 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-035-1d66b429cf.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-036-6803ff59e6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-036-6803ff59e6.snap new file mode 100644 index 0000000..1866c97 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-036-6803ff59e6.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-037-e576c2fba9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-037-e576c2fba9.snap new file mode 100644 index 0000000..a9a9c21 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-037-e576c2fba9.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-038-280770f34d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-038-280770f34d.snap new file mode 100644 index 0000000..f9260b0 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-038-280770f34d.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-039-84e4037075.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-039-84e4037075.snap new file mode 100644 index 0000000..38e5310 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-039-84e4037075.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-040-e2a36763a6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-040-e2a36763a6.snap new file mode 100644 index 0000000..a4f25ab --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-040-e2a36763a6.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-041-7c9175487c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-041-7c9175487c.snap new file mode 100644 index 0000000..eec5197 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-041-7c9175487c.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-042-246e72e17a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-042-246e72e17a.snap new file mode 100644 index 0000000..2e2bead --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-042-246e72e17a.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-043-50fac72de7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-043-50fac72de7.snap new file mode 100644 index 0000000..9540df7 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-043-50fac72de7.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-044-a9f4c5ba13.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-044-a9f4c5ba13.snap new file mode 100644 index 0000000..52fc44d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-044-a9f4c5ba13.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-045-958507518d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-045-958507518d.snap new file mode 100644 index 0000000..192e8d8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-045-958507518d.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-046-82a07e3ec3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-046-82a07e3ec3.snap new file mode 100644 index 0000000..0e50393 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-046-82a07e3ec3.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-047-d524fcd6c3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-047-d524fcd6c3.snap new file mode 100644 index 0000000..ae89e3f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-047-d524fcd6c3.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-048-fa3442e264.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-048-fa3442e264.snap new file mode 100644 index 0000000..50ec51a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-048-fa3442e264.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-049-b3bbd32960.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-049-b3bbd32960.snap new file mode 100644 index 0000000..50ec51a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-049-b3bbd32960.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-050-fda399bfe0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-050-fda399bfe0.snap new file mode 100644 index 0000000..907e7c8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-050-fda399bfe0.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-051-53df7b9474.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-051-53df7b9474.snap new file mode 100644 index 0000000..9d9c667 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-051-53df7b9474.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-052-e6195ba5a2.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-052-e6195ba5a2.snap new file mode 100644 index 0000000..1f16c34 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-052-e6195ba5a2.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-053-5fbe283840.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-053-5fbe283840.snap new file mode 100644 index 0000000..21eb3e0 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-053-5fbe283840.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-054-e536c17528.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-054-e536c17528.snap new file mode 100644 index 0000000..6697b9d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-054-e536c17528.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-055-1539142ffd.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-055-1539142ffd.snap new file mode 100644 index 0000000..3fe43e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-055-1539142ffd.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-056-834fa66895.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-056-834fa66895.snap new file mode 100644 index 0000000..8142e8f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-056-834fa66895.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-057-595a483b50.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-057-595a483b50.snap new file mode 100644 index 0000000..538626a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-057-595a483b50.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-058-a5bed8edb7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-058-a5bed8edb7.snap new file mode 100644 index 0000000..8229894 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-058-a5bed8edb7.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-059-0b07052901.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-059-0b07052901.snap new file mode 100644 index 0000000..64c6317 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-059-0b07052901.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-060-b58a7535c7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-060-b58a7535c7.snap new file mode 100644 index 0000000..aba2124 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-060-b58a7535c7.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-061-1c44313e59.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-061-1c44313e59.snap new file mode 100644 index 0000000..66828d6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-061-1c44313e59.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-062-4fdcb21c9d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-062-4fdcb21c9d.snap new file mode 100644 index 0000000..3799b37 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-062-4fdcb21c9d.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"
    " diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-063-a8231002de.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-063-a8231002de.snap new file mode 100644 index 0000000..336b0b3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-063-a8231002de.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-064-764419ad9b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-064-764419ad9b.snap new file mode 100644 index 0000000..3cddd11 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-064-764419ad9b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-065-6c1be61067.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-065-6c1be61067.snap new file mode 100644 index 0000000..4134014 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-065-6c1be61067.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-066-6525a64377.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-066-6525a64377.snap new file mode 100644 index 0000000..6d99e7f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-066-6525a64377.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-067-3ffe06a1a9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-067-3ffe06a1a9.snap new file mode 100644 index 0000000..ddaa89c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-067-3ffe06a1a9.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-068-0d86452528.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-068-0d86452528.snap new file mode 100644 index 0000000..8d9e3eb --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-068-0d86452528.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-069-0fa1145f4c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-069-0fa1145f4c.snap new file mode 100644 index 0000000..11388de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-069-0fa1145f4c.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-070-a01830c33f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-070-a01830c33f.snap new file mode 100644 index 0000000..de7d300 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-070-a01830c33f.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Hello +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-071-3a132a6b4d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-071-3a132a6b4d.snap new file mode 100644 index 0000000..272bb81 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-071-3a132a6b4d.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + World +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-072-df70a74728.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-072-df70a74728.snap new file mode 100644 index 0000000..9f3037b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-072-df70a74728.snap @@ -0,0 +1,18 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Ellipsis +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-073-ef0cdd87cf.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-073-ef0cdd87cf.snap new file mode 100644 index 0000000..84d67b5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-073-ef0cdd87cf.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Shadow +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-074-57a24a2690.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-074-57a24a2690.snap new file mode 100644 index 0000000..bac9ffa --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-074-57a24a2690.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + MultiShadow +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-075-fb8db22bb9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-075-fb8db22bb9.snap new file mode 100644 index 0000000..c728dde --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-075-fb8db22bb9.snap @@ -0,0 +1,18 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Stroke +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-076-3d2d4543bb.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-076-3d2d4543bb.snap new file mode 100644 index 0000000..ef60eb5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-076-3d2d4543bb.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + Hello + + World +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-077-a65991a745.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-077-a65991a745.snap new file mode 100644 index 0000000..57be15f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-077-a65991a745.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" +
  • + Item 1 +
  • +
    " diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-078-d6b1085274.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-078-d6b1085274.snap new file mode 100644 index 0000000..b501d5e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-078-d6b1085274.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" +
  • + Item 1 +
  • +
    " diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-079-9e7f3ee9e4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-079-9e7f3ee9e4.snap new file mode 100644 index 0000000..534a321 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-079-9e7f3ee9e4.snap @@ -0,0 +1,24 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" +
  • + Item 1 +
  • +
  • + Item 2 +
  • +
    " diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-080-f6233dd6a0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-080-f6233dd6a0.snap new file mode 100644 index 0000000..00e3308 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-080-f6233dd6a0.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Hello + World +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-081-ed3fa48802.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-081-ed3fa48802.snap new file mode 100644 index 0000000..029f2ea --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-081-ed3fa48802.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-082-db0d8839e8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-082-db0d8839e8.snap new file mode 100644 index 0000000..aea282c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-082-db0d8839e8.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-083-1820110e8a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-083-1820110e8a.snap new file mode 100644 index 0000000..618bc2f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-083-1820110e8a.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-084-3d01c94f87.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-084-3d01c94f87.snap new file mode 100644 index 0000000..0dd83b4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-084-3d01c94f87.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-085-1f274ec7a6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-085-1f274ec7a6.snap new file mode 100644 index 0000000..2680e2f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-085-1f274ec7a6.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-086-a44a580f30.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-086-a44a580f30.snap new file mode 100644 index 0000000..c5aa8c9 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-086-a44a580f30.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-087-e95c0eccc2.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-087-e95c0eccc2.snap new file mode 100644 index 0000000..f918e16 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-087-e95c0eccc2.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-088-f9ca312d49.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-088-f9ca312d49.snap new file mode 100644 index 0000000..a864c46 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-088-f9ca312d49.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-089-1d28dfdd93.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-089-1d28dfdd93.snap new file mode 100644 index 0000000..376eb46 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-089-1d28dfdd93.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-090-e8878c5cbf.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-090-e8878c5cbf.snap new file mode 100644 index 0000000..792eb79 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-090-e8878c5cbf.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-091-dc61cb2277.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-091-dc61cb2277.snap new file mode 100644 index 0000000..0ad443d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-091-dc61cb2277.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-092-96adc16d0c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-092-96adc16d0c.snap new file mode 100644 index 0000000..22f16c7 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-092-96adc16d0c.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-093-4573f32903.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-093-4573f32903.snap new file mode 100644 index 0000000..f4e9fc6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-093-4573f32903.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-094-e0d0f3bfe1.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-094-e0d0f3bfe1.snap new file mode 100644 index 0000000..4333af9 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-094-e0d0f3bfe1.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-095-af3315e549.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-095-af3315e549.snap new file mode 100644 index 0000000..a135f68 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-095-af3315e549.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-096-f8978e56ee.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-096-f8978e56ee.snap new file mode 100644 index 0000000..f0787ce --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-096-f8978e56ee.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-097-da58ebc1a5.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-097-da58ebc1a5.snap new file mode 100644 index 0000000..af96c14 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-097-da58ebc1a5.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-098-7c2267436f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-098-7c2267436f.snap new file mode 100644 index 0000000..73ce039 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-098-7c2267436f.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-099-a2f954e973.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-099-a2f954e973.snap new file mode 100644 index 0000000..2f5b109 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-099-a2f954e973.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-100-a546e9e784.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-100-a546e9e784.snap new file mode 100644 index 0000000..2c7d3eb --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-100-a546e9e784.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-101-394e6d9bf6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-101-394e6d9bf6.snap new file mode 100644 index 0000000..8657dd6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-101-394e6d9bf6.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-102-cbff7d3da9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-102-cbff7d3da9.snap new file mode 100644 index 0000000..85f46de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-102-cbff7d3da9.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-103-246809daea.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-103-246809daea.snap new file mode 100644 index 0000000..f80c06b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-103-246809daea.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-104-d68998542b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-104-d68998542b.snap new file mode 100644 index 0000000..2d4e6e5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-104-d68998542b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-105-0137b6735e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-105-0137b6735e.snap new file mode 100644 index 0000000..354bc31 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-105-0137b6735e.snap @@ -0,0 +1,18 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Gradient +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-106-6d687083cc.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-106-6d687083cc.snap new file mode 100644 index 0000000..d63cfb5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-106-6d687083cc.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Height +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-107-f624c65fa8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-107-f624c65fa8.snap new file mode 100644 index 0000000..e6a31b8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-107-f624c65fa8.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + None +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-108-c6c4dabf49.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-108-c6c4dabf49.snap new file mode 100644 index 0000000..2b6ce3c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-108-c6c4dabf49.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Truncate +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-109-e2824ad5be.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-109-e2824ad5be.snap new file mode 100644 index 0000000..9d8cc0c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-109-e2824ad5be.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + Heading +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-110-f2505cce4b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-110-f2505cce4b.snap new file mode 100644 index 0000000..49eb6b6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-110-f2505cce4b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-111-72c9d38832.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-111-72c9d38832.snap new file mode 100644 index 0000000..faa2a37 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-111-72c9d38832.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-112-b5443c63a4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-112-b5443c63a4.snap new file mode 100644 index 0000000..6db5294 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-112-b5443c63a4.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-113-702dadab11.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-113-702dadab11.snap new file mode 100644 index 0000000..cb273e3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-113-702dadab11.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-114-855686da78.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-114-855686da78.snap new file mode 100644 index 0000000..57442e3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-114-855686da78.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-115-45d3f116b5.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-115-45d3f116b5.snap new file mode 100644 index 0000000..579c6f3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-115-45d3f116b5.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-116-23097e86ce.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-116-23097e86ce.snap new file mode 100644 index 0000000..0bd949b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-116-23097e86ce.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-117-fb967a9342.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-117-fb967a9342.snap new file mode 100644 index 0000000..368d45f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-117-fb967a9342.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-118-b5cba733fa.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-118-b5cba733fa.snap new file mode 100644 index 0000000..6e42315 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-118-b5cba733fa.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-119-882c2abd91.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-119-882c2abd91.snap new file mode 100644 index 0000000..85f46de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-119-882c2abd91.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-120-7634e1ee10.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-120-7634e1ee10.snap new file mode 100644 index 0000000..85f46de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-120-7634e1ee10.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-121-0536a2e75b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-121-0536a2e75b.snap new file mode 100644 index 0000000..85f46de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-121-0536a2e75b.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-122-7ddad74cc1.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-122-7ddad74cc1.snap new file mode 100644 index 0000000..c3d7df2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-122-7ddad74cc1.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-123-179129a02c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-123-179129a02c.snap new file mode 100644 index 0000000..cb35621 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-123-179129a02c.snap @@ -0,0 +1,74 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Default", + "parent": { + "children": [ + [Circular], + { + "children": [], + "name": "Hover", + "parent": [Circular], + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": { + "state": "hover", + }, + "visible": true, + }, + ], + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover", + ], + }, + }, + "defaultVariant": [Circular], + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default", + }, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Default", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": { + "state": "'default' | 'hover'", + }, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-124-bdedf14335.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-124-bdedf14335.snap new file mode 100644 index 0000000..c3d7df2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-124-bdedf14335.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-125-4a4a93c4c9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-125-4a4a93c4c9.snap new file mode 100644 index 0000000..f6416ef --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-125-4a4a93c4c9.snap @@ -0,0 +1,65 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Default", + "parent": { + "children": [ + [Circular], + { + "children": [], + "name": "Hover", + "parent": [Circular], + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "hover", + }, + "visible": true, + }, + ], + "componentPropertyDefinitions": { + "effect": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover", + ], + }, + }, + "defaultVariant": [Circular], + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "effect": "default", + }, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Default", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-126-14073e1999.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-126-14073e1999.snap new file mode 100644 index 0000000..c3d7df2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-126-14073e1999.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-127-1d5ead088d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-127-1d5ead088d.snap new file mode 100644 index 0000000..4ac0d97 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-127-1d5ead088d.snap @@ -0,0 +1,89 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Default", + "parent": { + "children": [ + [Circular], + { + "children": [], + "name": "Hover", + "parent": [Circular], + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT", + }, + "type": "SMART_ANIMATE", + }, + "type": "NODE", + }, + ], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + ], + "componentPropertyDefinitions": {}, + "defaultVariant": [Circular], + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT", + }, + "type": "SMART_ANIMATE", + }, + "type": "NODE", + }, + ], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Default", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-128-2222304a14.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-128-2222304a14.snap new file mode 100644 index 0000000..14ec399 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-128-2222304a14.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-129-7c97156f7f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-129-7c97156f7f.snap new file mode 100644 index 0000000..f77febd --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-129-7c97156f7f.snap @@ -0,0 +1,95 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Card", + "node": { + "children": [], + "name": "Default", + "parent": { + "children": [ + [Circular], + { + "children": [], + "name": "Hover", + "opacity": 0.8, + "parent": [Circular], + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT", + }, + "type": "SMART_ANIMATE", + }, + "type": "NODE", + }, + ], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + ], + "componentPropertyDefinitions": {}, + "defaultVariant": [Circular], + "name": "Card", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [ + { + "actions": [ + { + "transition": { + "duration": 0.3, + "easing": { + "type": "EASE_IN_OUT", + }, + "type": "SMART_ANIMATE", + }, + "type": "NODE", + }, + ], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Default", + "nodeType": "COMPONENT", + "props": { + "_hover": { + "opacity": "0.8", + }, + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "transition": "0.3ms ease-in-out", + "transitionProperty": "opacity", + "w": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-130-bbd4e9a97a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-130-bbd4e9a97a.snap new file mode 100644 index 0000000..50ec51a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-130-bbd4e9a97a.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-131-c6ef80ad0c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-131-c6ef80ad0c.snap new file mode 100644 index 0000000..774b79e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-131-c6ef80ad0c.snap @@ -0,0 +1,98 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Hover", + "parent": { + "children": [ + { + "children": [], + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default", + }, + "visible": true, + }, + { + "children": [], + "name": "Hover", + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": { + "state": "hover", + }, + "visible": true, + }, + ], + "componentPropertyDefinitions": { + "state": { + "type": "VARIANT", + "variantOptions": [ + "default", + "hover", + ], + }, + }, + "defaultVariant": { + "children": [], + "name": "Default", + "reactions": [], + "type": "COMPONENT", + "variantProperties": { + "state": "default", + }, + "visible": true, + }, + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_HOVER", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": { + "state": "hover", + }, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Hover", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": { + "state": "'default' | 'hover'", + }, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-132-9a7b0243b6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-132-9a7b0243b6.snap new file mode 100644 index 0000000..c3d7df2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-132-9a7b0243b6.snap @@ -0,0 +1,9 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +" + + +" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-133-f425fa006c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-133-f425fa006c.snap new file mode 100644 index 0000000..66c18b8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-133-f425fa006c.snap @@ -0,0 +1,60 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Default", + "parent": { + "children": [ + [Circular], + { + "children": [], + "name": "Active", + "parent": [Circular], + "reactions": [ + { + "actions": [], + "trigger": { + "type": "ON_PRESS", + }, + }, + ], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + ], + "componentPropertyDefinitions": {}, + "defaultVariant": [Circular], + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "reactions": [], + "type": "COMPONENT", + "variantProperties": {}, + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Default", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-134-f80fffb8b4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-134-f80fffb8b4.snap new file mode 100644 index 0000000..3fe43e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-134-f80fffb8b4.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-135-e00e826755.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-135-e00e826755.snap new file mode 100644 index 0000000..a559c55 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-135-e00e826755.snap @@ -0,0 +1,31 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Icon", + "node": { + "children": [], + "name": "Icon", + "type": "COMPONENT", + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Icon", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "boxSize": "100%", + "flex": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-136-b68bd43ea7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-136-b68bd43ea7.snap new file mode 100644 index 0000000..50ec51a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-136-b68bd43ea7.snap @@ -0,0 +1,5 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- +"" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-137-83b2706e92.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-137-83b2706e92.snap new file mode 100644 index 0000000..c8d72c8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-137-83b2706e92.snap @@ -0,0 +1,45 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +{ + "name": "Button", + "node": { + "children": [], + "name": "Hover", + "parent": { + "children": [], + "componentPropertyDefinitions": {}, + "defaultVariant": { + "children": [], + "name": "Default", + "type": "COMPONENT", + "visible": true, + }, + "name": "Button", + "type": "COMPONENT_SET", + "visible": true, + }, + "type": "COMPONENT", + "visible": true, + }, + "tree": { + "children": [], + "component": "Box", + "nodeName": "Hover", + "nodeType": "COMPONENT", + "props": { + "aspectRatio": undefined, + "flex": undefined, + "h": undefined, + "maxH": undefined, + "maxW": undefined, + "minH": undefined, + "minW": undefined, + "w": undefined, + }, + }, + "variantComments": {}, + "variants": {}, +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-138-9cccfcb552.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-138-9cccfcb552.snap new file mode 100644 index 0000000..c3ca16a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-138-9cccfcb552.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export interface IconButtonProps { + size: 'sm' | 'md' | 'lg' + leftIcon: React.ReactNode +} + +export function IconButton({ size, leftIcon }: IconButtonProps) { + return ( + + {leftIcon} + + Click + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-139-63f7b1f175.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-139-63f7b1f175.snap new file mode 100644 index 0000000..4878b56 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-139-63f7b1f175.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Icon() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-140-e577df9ad5.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-140-e577df9ad5.snap new file mode 100644 index 0000000..d5ae84c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-140-e577df9ad5.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export interface AlertCardProps { + State: 'Default' | 'Hover' + showBadge?: boolean +} + +export function AlertCard({ State, showBadge }: AlertCardProps) { + return ( + + {showBadge && } + + Hello + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-141-48307df49b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-141-48307df49b.snap new file mode 100644 index 0000000..4d068fb --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-141-48307df49b.snap @@ -0,0 +1,20 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export interface CurriculumCardProps { + _1st?: boolean + _2nd?: boolean +} + +export function CurriculumCard({ _1st, _2nd }: CurriculumCardProps) { + return ( + + + {_1st && } + {_2nd && } + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-142-ac82229282.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-142-ac82229282.snap new file mode 100644 index 0000000..db45c77 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-142-ac82229282.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function CurriculumSubTitle() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-143-52b441f9f4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-143-52b441f9f4.snap new file mode 100644 index 0000000..fcfe3fd --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-143-52b441f9f4.snap @@ -0,0 +1,34 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export interface ButtonProps { + size: 'sm' | 'md' | 'lg' + leftIcon: React.ReactNode + showLeftIcon?: boolean + rightIcon: React.ReactNode + showRightIcon?: boolean +} + +export function Button({ size, leftIcon, showLeftIcon, rightIcon, showRightIcon }: ButtonProps) { + return ( + + {showLeftIcon && leftIcon} + + Submit + + {showRightIcon && rightIcon} + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-144-042a6de403.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-144-042a6de403.snap new file mode 100644 index 0000000..4878b56 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-144-042a6de403.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Icon() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-145-f7001b5648.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-145-f7001b5648.snap new file mode 100644 index 0000000..f3bea2a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-145-f7001b5648.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function ArrowIcon() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-146-56be99e864.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-146-56be99e864.snap new file mode 100644 index 0000000..394dfae --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-146-56be99e864.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function BorderRadius() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-147-bb7df0f2f1.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-147-bb7df0f2f1.snap new file mode 100644 index 0000000..3e8aae8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-147-bb7df0f2f1.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function BorderRadius() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-148-62e9137131.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-148-62e9137131.snap new file mode 100644 index 0000000..1068eb6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-148-62e9137131.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function BorderRadius() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-149-2491f4c5a5.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-149-2491f4c5a5.snap new file mode 100644 index 0000000..b86f584 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-149-2491f4c5a5.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-150-ecb5bb4337.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-150-ecb5bb4337.snap new file mode 100644 index 0000000..663baf7 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-150-ecb5bb4337.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-151-7993d252dc.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-151-7993d252dc.snap new file mode 100644 index 0000000..07a3677 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-151-7993d252dc.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-152-a05026a9db.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-152-a05026a9db.snap new file mode 100644 index 0000000..f231adc --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-152-a05026a9db.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-153-fb5205fc52.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-153-fb5205fc52.snap new file mode 100644 index 0000000..3f4506b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-153-fb5205fc52.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-154-1409376769.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-154-1409376769.snap new file mode 100644 index 0000000..194d392 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-154-1409376769.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-155-557eb84a98.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-155-557eb84a98.snap new file mode 100644 index 0000000..c0b4ae2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-155-557eb84a98.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Gradient() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-156-bec8be9b99.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-156-bec8be9b99.snap new file mode 100644 index 0000000..f65372e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-156-bec8be9b99.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Text() { + return ( + + Hello World + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-157-4cb71f2863.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-157-4cb71f2863.snap new file mode 100644 index 0000000..21b65cf --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-157-4cb71f2863.snap @@ -0,0 +1,20 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Text() { + return ( + + Hello World + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-158-8e4821dcbc.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-158-8e4821dcbc.snap new file mode 100644 index 0000000..f65372e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-158-8e4821dcbc.snap @@ -0,0 +1,19 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Text() { + return ( + + Hello World + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-159-30962241b1.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-159-30962241b1.snap new file mode 100644 index 0000000..b446652 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-159-30962241b1.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Text() { + return ( + + Hello World + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-160-db5d3ac9d8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-160-db5d3ac9d8.snap new file mode 100644 index 0000000..e21bb15 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-160-db5d3ac9d8.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Text() { + return ( + + Hello World + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-161-5b230821f2.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-161-5b230821f2.snap new file mode 100644 index 0000000..c1408cb --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-161-5b230821f2.snap @@ -0,0 +1,22 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function AutoLayoutBox() { + return ( + + + Hello World + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-162-51e1254b4c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-162-51e1254b4c.snap new file mode 100644 index 0000000..14b6226 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-162-51e1254b4c.snap @@ -0,0 +1,22 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function AutoLayoutBox() { + return ( + + + Hello World + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap new file mode 100644 index 0000000..4ca2335 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap @@ -0,0 +1,22 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function AutoLayoutBox() { + return ( + + + Hello World + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-164-33e4c6591c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-164-33e4c6591c.snap new file mode 100644 index 0000000..b5247b5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-164-33e4c6591c.snap @@ -0,0 +1,37 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Component1() { + return ( + + + 더 자세히 알아보기 + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-165-501ee1df12.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-165-501ee1df12.snap new file mode 100644 index 0000000..90bd3c4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-165-501ee1df12.snap @@ -0,0 +1,37 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Component1() { + return ( + + + + + 자사 솔루션과의 연계 + + 를 통해
    서비스 확장성과 성장 가능성을 높입니다. +
    + + 웹앱팩토리와 Presskit 등 자체 운영 중인
    솔루션과의 연계를 통해 프로젝트의 서비스 범위 확장,
    운영 효율화, 성장 기회까지 제안드립니다. +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-166-cda14f0b08.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-166-cda14f0b08.snap new file mode 100644 index 0000000..6604e48 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-166-cda14f0b08.snap @@ -0,0 +1,68 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Component1() { + return ( + +
    + + CARD 1 + +
    +
    + + CARD 2 + +
    +
    + + CARD 3 + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-167-114a88771f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-167-114a88771f.snap new file mode 100644 index 0000000..4e65ff1 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-167-114a88771f.snap @@ -0,0 +1,44 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Component1() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet,{" "} + + consectetur + + {" "}adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-168-4211bd8279.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-168-4211bd8279.snap new file mode 100644 index 0000000..2cf3e85 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-168-4211bd8279.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-169-796132e0cf.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-169-796132e0cf.snap new file mode 100644 index 0000000..d06523b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-169-796132e0cf.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap new file mode 100644 index 0000000..cc3dece --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap new file mode 100644 index 0000000..6267725 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-172-99028c85ce.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-172-99028c85ce.snap new file mode 100644 index 0000000..b6e78e4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-172-99028c85ce.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-173-64dbd7a102.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-173-64dbd7a102.snap new file mode 100644 index 0000000..87407f5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-173-64dbd7a102.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap new file mode 100644 index 0000000..92fd2ab --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-175-ec3fd45731.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-175-ec3fd45731.snap new file mode 100644 index 0000000..497c5f8 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-175-ec3fd45731.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function OutlineBorder() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-176-653a030fdc.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-176-653a030fdc.snap new file mode 100644 index 0000000..cbe0e27 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-176-653a030fdc.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Circle() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-177-c147e7dd39.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-177-c147e7dd39.snap new file mode 100644 index 0000000..cbe0e27 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-177-c147e7dd39.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Circle() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-178-d69d60d688.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-178-d69d60d688.snap new file mode 100644 index 0000000..acb3bb5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-178-d69d60d688.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Circle() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-179-80620f6587.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-179-80620f6587.snap new file mode 100644 index 0000000..5ee1c73 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-179-80620f6587.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Border() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-180-ad1a31fd03.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-180-ad1a31fd03.snap new file mode 100644 index 0000000..657d0c6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-180-ad1a31fd03.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Border() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-181-5afa626d49.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-181-5afa626d49.snap new file mode 100644 index 0000000..63caa52 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-181-5afa626d49.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Border() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-182-c45d19171b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-182-c45d19171b.snap new file mode 100644 index 0000000..9a5ebff --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-182-c45d19171b.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Opacity() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-183-7ede517e99.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-183-7ede517e99.snap new file mode 100644 index 0000000..1cbade3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-183-7ede517e99.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Opacity() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-184-0c09788bb7.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-184-0c09788bb7.snap new file mode 100644 index 0000000..f716c9d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-184-0c09788bb7.snap @@ -0,0 +1,25 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Clamp() { + return ( + + + Getting into life {"'"}Cause I found that it{"'"}s not so boring Not anymore. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-185-e79c2ae189.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-185-e79c2ae189.snap new file mode 100644 index 0000000..bb1b930 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-185-e79c2ae189.snap @@ -0,0 +1,22 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Clamp() { + return ( + + + Getting into life {"'"}Cause I found that it{"'"}s not so boring Not anymore. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-186-0988e78887.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-186-0988e78887.snap new file mode 100644 index 0000000..821fb04 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-186-0988e78887.snap @@ -0,0 +1,27 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Clamp() { + return ( + + + Getting into life {"'"}Cause I found that it{"'"}s not so boring Not anymore. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-187-8b30b935a4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-187-8b30b935a4.snap new file mode 100644 index 0000000..24e0bc4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-187-8b30b935a4.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Effect() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-188-ea2a1af6a1.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-188-ea2a1af6a1.snap new file mode 100644 index 0000000..bba528d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-188-ea2a1af6a1.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Effect() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-189-75736e48e0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-189-75736e48e0.snap new file mode 100644 index 0000000..be56406 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-189-75736e48e0.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Effect() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-190-d5a9045231.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-190-d5a9045231.snap new file mode 100644 index 0000000..42444de --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-190-d5a9045231.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Effect() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-191-2021d398f8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-191-2021d398f8.snap new file mode 100644 index 0000000..45c874b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-191-2021d398f8.snap @@ -0,0 +1,86 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Dimmed와Absolute() { + return ( + + + + + + 지금 시작할 수 있어요 + + + 내 삶을 더 잘 이해하는 첫 걸음 + + + + 자꾸 미뤄졌던 나에 대한 고민,
    퍼즐핏에서 구체적인 답을 찾아보세요. +
    + + + + 회원가입 후, 유료로 진행됩니다 + + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-192-dd2c3f0c1c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-192-dd2c3f0c1c.snap new file mode 100644 index 0000000..2918b88 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-192-dd2c3f0c1c.snap @@ -0,0 +1,17 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Svg() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-193-bd488a5710.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-193-bd488a5710.snap new file mode 100644 index 0000000..87d89c4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-193-bd488a5710.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Svg() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-194-17922977f6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-194-17922977f6.snap new file mode 100644 index 0000000..87d89c4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-194-17922977f6.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Svg() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-195-1a6efe22a8.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-195-1a6efe22a8.snap new file mode 100644 index 0000000..10b43af --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-195-1a6efe22a8.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Svg() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-196-d14f03afcd.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-196-d14f03afcd.snap new file mode 100644 index 0000000..10b43af --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-196-d14f03afcd.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Svg() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-197-026402bf2e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-197-026402bf2e.snap new file mode 100644 index 0000000..f560dcf --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-197-026402bf2e.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function FlexWithMaxW() { + return ( + +
    + + Hello World! + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-198-a9ea7ba9c3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-198-a9ea7ba9c3.snap new file mode 100644 index 0000000..641fbb3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-198-a9ea7ba9c3.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function FlexWithMaxW() { + return ( + +
    + + Hello World! + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-199-829a5c949d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-199-829a5c949d.snap new file mode 100644 index 0000000..04f2a2e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-199-829a5c949d.snap @@ -0,0 +1,36 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function FlexWithMaxW() { + return ( + +
    + + Hello World! + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-200-3313d92719.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-200-3313d92719.snap new file mode 100644 index 0000000..eec3fa9 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-200-3313d92719.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function FlexWithMaxW() { + return ( + +
    + + Hello World! + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-201-8207a4008e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-201-8207a4008e.snap new file mode 100644 index 0000000..73b1f41 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-201-8207a4008e.snap @@ -0,0 +1,30 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function FlexWithMaxW() { + return ( + +
    + + Hello World! + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-202-2786eda075.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-202-2786eda075.snap new file mode 100644 index 0000000..f4c7b0e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-202-2786eda075.snap @@ -0,0 +1,31 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-203-8af03217a3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-203-8af03217a3.snap new file mode 100644 index 0000000..edacbaf --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-203-8af03217a3.snap @@ -0,0 +1,31 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-204-2b2967c8c4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-204-2b2967c8c4.snap new file mode 100644 index 0000000..f4c7b0e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-204-2b2967c8c4.snap @@ -0,0 +1,31 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-205-cc3ea5202a.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-205-cc3ea5202a.snap new file mode 100644 index 0000000..9827cca --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-205-cc3ea5202a.snap @@ -0,0 +1,32 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-206-b5c5dc97eb.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-206-b5c5dc97eb.snap new file mode 100644 index 0000000..14c1e3c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-206-b5c5dc97eb.snap @@ -0,0 +1,31 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( +
    + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-207-b0e134acf4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-207-b0e134acf4.snap new file mode 100644 index 0000000..91d2d5a --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-207-b0e134acf4.snap @@ -0,0 +1,37 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-208-1a343e45db.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-208-1a343e45db.snap new file mode 100644 index 0000000..2d8fc99 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-208-1a343e45db.snap @@ -0,0 +1,33 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-209-0514b0990f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-209-0514b0990f.snap new file mode 100644 index 0000000..995bdd5 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-209-0514b0990f.snap @@ -0,0 +1,37 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-210-1b24060767.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-210-1b24060767.snap new file mode 100644 index 0000000..8d0cb3f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-210-1b24060767.snap @@ -0,0 +1,37 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TextWithAutoLayout() { + return ( + + + Hello World + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-211-2e15c55701.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-211-2e15c55701.snap new file mode 100644 index 0000000..a6ffc23 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-211-2e15c55701.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function ObjectFit() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-212-2a8f7b4a99.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-212-2a8f7b4a99.snap new file mode 100644 index 0000000..81259b4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-212-2a8f7b4a99.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function ObjectFit() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-213-aa53408d2f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-213-aa53408d2f.snap new file mode 100644 index 0000000..4da053d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-213-aa53408d2f.snap @@ -0,0 +1,86 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Case1MaskImage() { + return ( + + + + 플레이 제목 + + + + 2025.03.03 18:00 + + + + + + 2 + + + + + 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 댓글 내용 출력 + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-214-6dc49544c0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-214-6dc49544c0.snap new file mode 100644 index 0000000..e0943a0 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-214-6dc49544c0.snap @@ -0,0 +1,15 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Grid() { + return ( + + + + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-215-39e86f8f53.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-215-39e86f8f53.snap new file mode 100644 index 0000000..5eb2d29 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-215-39e86f8f53.snap @@ -0,0 +1,25 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Grid() { + return ( + + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-216-465422d47b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-216-465422d47b.snap new file mode 100644 index 0000000..efab40d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-216-465422d47b.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Grid() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-217-2d887b2a8b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-217-2d887b2a8b.snap new file mode 100644 index 0000000..9173311 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-217-2d887b2a8b.snap @@ -0,0 +1,18 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Grid() { + return ( + + + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-218-587666c709.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-218-587666c709.snap new file mode 100644 index 0000000..e7bf38d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-218-587666c709.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function MixBlendMode() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-219-c6446b7b2e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-219-c6446b7b2e.snap new file mode 100644 index 0000000..f5b524e --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-219-c6446b7b2e.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function MixBlendMode() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-220-5980153f26.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-220-5980153f26.snap new file mode 100644 index 0000000..ceb6e3f --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-220-5980153f26.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function MixBlendMode() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-221-d003bdb336.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-221-d003bdb336.snap new file mode 100644 index 0000000..4eed8e1 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-221-d003bdb336.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function MixBlendMode() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-222-f2d780c847.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-222-f2d780c847.snap new file mode 100644 index 0000000..3b351e2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-222-f2d780c847.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function MixBlendMode() { + return ( + + 데브파이브 + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-223-4dc8092992.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-223-4dc8092992.snap new file mode 100644 index 0000000..ab1133d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-223-4dc8092992.snap @@ -0,0 +1,220 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function TestCase드론아레나() { + return ( + + + 간편 로그인 연동 + + + + + 카카오 + + + 연결 전 + +
    + + 인증하기 + +
    +
    + + + 구글 + + + cooolvita@gmail.com + +
    + + 인증하기 + +
    +
    +
    + + + + + 서비스 이용약관 + + + + + + 개인정보 처리방침 + + + + + + 회원 탈퇴 + + + + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-224-075a41e65c.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-224-075a41e65c.snap new file mode 100644 index 0000000..ebdbea9 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-224-075a41e65c.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-225-00fb8a129e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-225-00fb8a129e.snap new file mode 100644 index 0000000..c36b88c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-225-00fb8a129e.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-226-b2c28bcc8f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-226-b2c28bcc8f.snap new file mode 100644 index 0000000..c36b88c --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-226-b2c28bcc8f.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-227-bebc4e7262.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-227-bebc4e7262.snap new file mode 100644 index 0000000..16ab850 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-227-bebc4e7262.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-228-221bd0c553.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-228-221bd0c553.snap new file mode 100644 index 0000000..495451d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-228-221bd0c553.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-229-9f57002cd6.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-229-9f57002cd6.snap new file mode 100644 index 0000000..9f63ada --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-229-9f57002cd6.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-230-2af59fd9fa.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-230-2af59fd9fa.snap new file mode 100644 index 0000000..16ab850 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-230-2af59fd9fa.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-231-117d816fb9.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-231-117d816fb9.snap new file mode 100644 index 0000000..9a76238 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-231-117d816fb9.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-232-8e875ce9e3.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-232-8e875ce9e3.snap new file mode 100644 index 0000000..37bbcdf --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-232-8e875ce9e3.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-233-0a60be5fbc.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-233-0a60be5fbc.snap new file mode 100644 index 0000000..14b38f3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-233-0a60be5fbc.snap @@ -0,0 +1,16 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function 다양한도형() { + return ( + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-234-01ad9a0db0.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-234-01ad9a0db0.snap new file mode 100644 index 0000000..32959a4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-234-01ad9a0db0.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-235-8a3992468b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-235-8a3992468b.snap new file mode 100644 index 0000000..32959a4 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-235-8a3992468b.snap @@ -0,0 +1,8 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-236-621c6d6a9e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-236-621c6d6a9e.snap new file mode 100644 index 0000000..2d4526b --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-236-621c6d6a9e.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-237-01ee478666.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-237-01ee478666.snap new file mode 100644 index 0000000..a5f630d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-237-01ee478666.snap @@ -0,0 +1,20 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-238-1a8cf8c870.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-238-1a8cf8c870.snap new file mode 100644 index 0000000..e5df167 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-238-1a8cf8c870.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-239-a6dada3682.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-239-a6dada3682.snap new file mode 100644 index 0000000..b66c064 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-239-a6dada3682.snap @@ -0,0 +1,20 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-240-77d56a1585.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-240-77d56a1585.snap new file mode 100644 index 0000000..e5df167 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-240-77d56a1585.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-241-e171ef72ce.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-241-e171ef72ce.snap new file mode 100644 index 0000000..b66c064 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-241-e171ef72ce.snap @@ -0,0 +1,20 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-242-5c198a8490.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-242-5c198a8490.snap new file mode 100644 index 0000000..7ed8240 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-242-5c198a8490.snap @@ -0,0 +1,12 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function SvgDetail() { + return ( +
    + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-243-14366a47ff.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-243-14366a47ff.snap new file mode 100644 index 0000000..d8e8013 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-243-14366a47ff.snap @@ -0,0 +1,21 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function DecorativeText() { + return ( + + 16.8s + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-244-4ccea91f13.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-244-4ccea91f13.snap new file mode 100644 index 0000000..ece36c3 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-244-4ccea91f13.snap @@ -0,0 +1,23 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function DecorativeText() { + return ( + + 홈페이지와 앱 제작 + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-245-537356bcf4.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-245-537356bcf4.snap new file mode 100644 index 0000000..4a94767 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-245-537356bcf4.snap @@ -0,0 +1,23 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function DecorativeText() { + return ( + + + 온글 + + 과 함께라면 + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-246-295f39e09b.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-246-295f39e09b.snap new file mode 100644 index 0000000..caa1e44 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-246-295f39e09b.snap @@ -0,0 +1,22 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function DecorativeText() { + return ( + + 데브파이브 + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-247-39d6959685.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-247-39d6959685.snap new file mode 100644 index 0000000..dfa286d --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-247-39d6959685.snap @@ -0,0 +1,23 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function DecorativeText() { + return ( + + 데브파이브 + + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-248-d1bc18e068.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-248-d1bc18e068.snap new file mode 100644 index 0000000..c5a0755 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-248-d1bc18e068.snap @@ -0,0 +1,34 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function List() { + return ( + +
  • + 어떤 증상이 가장 힘들고 일상생활에 영향을 주나요? +
  • +
  • + 증상이 언제부터 시작되었나요? +
  • +
  • + 증상이 시간이 지나면서 어떻게 변했나요? +
  • +
  • + 스트레스나 상황에 따라 증상이 달라지나요? +
  • +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-249-6b8a42981d.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-249-6b8a42981d.snap new file mode 100644 index 0000000..0ef3e58 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-249-6b8a42981d.snap @@ -0,0 +1,42 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function GradientButton() { + return ( +
    + + 자세히 알아보기 → + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-250-935ccdb80f.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-250-935ccdb80f.snap new file mode 100644 index 0000000..21b40f2 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-250-935ccdb80f.snap @@ -0,0 +1,65 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export interface ButtonProps { + size: 'Md' | 'Sm' + variant: 'primary' | 'white' +} + +export function Button({ size, variant }: ButtonProps) { + return ( +
    + + 참가 신청하기 + +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-251-50acddfb96.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-251-50acddfb96.snap new file mode 100644 index 0000000..39c0d88 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-251-50acddfb96.snap @@ -0,0 +1,132 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function UnderConstruction() { + return ( +
    + + + + + + + Under Construction + + + 제주국제관악제 리뉴얼 알림 + + + + + 더 나은 서비스 제공을 위해 시스템 점검 및 리뉴얼을 진행 중입니다.
    이용에 불편을 드려 죄송하며, 빠른 시일 내에 다시 찾아뵙겠습니다. +
    + + We are currently updating our website to serve you better.
    We apologize for the inconvenience. +
    +
    +
    + + + 제주국제관악제 최신 소식 확인하기 + + + + + + + + + + + + 문의 : 064-722-8704 / bandfestival@hanmail.net + + +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-252-49e979239e.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-252-49e979239e.snap new file mode 100644 index 0000000..91a49c7 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-252-49e979239e.snap @@ -0,0 +1,145 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function UnderConstruction() { + return ( +
    + + + + + + + Under Construction + + + 제주국제관악제
    리뉴얼 알림 +
    +
    + + + 더 나은 서비스 제공을 위해
    시스템 점검 및 리뉴얼을 진행 중입니다.
    이용에 불편을 드려 죄송하며,
    빠른 시일 내에 다시 찾아뵙겠습니다. +
    + + We are currently updating our website
    to serve you better.
    We apologize for the inconvenience. +
    +
    +
    + + + 제주국제관악제 최신 소식 확인하기 + + + + + + + + + + + + 문의 : 064-722-8704 /
    bandfestival@hanmail.net +
    +
    +
    +
    + ) +}" diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-253-347a2e5fb2.snap b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-253-347a2e5fb2.snap new file mode 100644 index 0000000..6f23ac1 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-253-347a2e5fb2.snap @@ -0,0 +1,109 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: actual +--- + +"export function Greetings() { + return ( + + + +
    + + + + + + +
    + + + + + + “ 섬, 그 바람의 울림! ”
    희망찬 봄을 여는 관악의 울림이 더
    널리,
    더 멀리 퍼져나가기를 기원합니다.{" "} +
    + + 음악과 자연이 함께 어우러지는 제주국제관악제가 30주년을 맞게 되었습니다.

    제주국제관악제를 아껴주시는 모든 분들과 함께 세계 속의 제주관악의 역사를 써 왔음에 깊이 감사드립니다.
    그동안 힘들고 어려운 순간들 속에서도 관악의 힘찬 울림은 우리에게 큰 위로와 보람을 안겨주었습니다.
    새로운 세대를 여는 앞으로의 시간과 함께 켜켜이 쌓여가는 역사 속에서, 세계를 향한 우리의 각오와 노력이 더해질 것입니다.

    희망찬 봄을 여는 관악의 울림이 더 널리, 더 멀리 퍼져나가기를 기원합니다.
    감사합니다. +
    + + + 제주국제관악제조직위원장{" "} + + + 양승보 + + +
    +
    +
    +