From c7bb5ce32a91256f45b56440e7ff23d34d70ce33 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Sun, 30 Aug 2026 23:29:47 +0900 Subject: [PATCH 01/97] docs: design Figma remote MCP integration --- .../2026-08-30-figma-remote-mcp-design.md | 334 ++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md 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..50e1000 --- /dev/null +++ b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md @@ -0,0 +1,334 @@ +# devup-mcp Figma Remote MCP 설계 + +## 상태 + +- 작성일: 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과 현재 열린 파일에 의존하는 문제 + +### 단일 Rust package로 시작한다 + +별도의 `devup-figma`, `devup-auth`, `devup-ir`, `devup-mcp-server` crate를 만들지 않는다. 현재 공개 단위와 실행 단위는 하나이므로 `devup-mcp` package 내부 모듈로 경계를 유지한다. + +```text +devup-mcp/ +├─ Cargo.toml +├─ src/ +│ ├─ main.rs +│ ├─ lib.rs +│ ├─ server/ +│ │ ├─ mod.rs +│ │ └─ tools.rs +│ ├─ figma/ +│ │ ├─ mod.rs +│ │ ├─ url.rs +│ │ ├─ upstream.rs +│ │ ├─ oauth.rs +│ │ ├─ credentials.rs +│ │ ├─ projection.rs +│ │ └─ errors.rs +│ ├─ codegen/ +│ │ ├─ mod.rs +│ │ ├─ component.rs +│ │ ├─ layout.rs +│ │ ├─ style.rs +│ │ └─ text.rs +│ └─ theme/ +│ ├─ mod.rs +│ ├─ tokens.rs +│ └─ devup_json.rs +└─ tests/ + ├─ fixtures/ + └─ integration/ +``` + +모듈 간 타입이 독립적으로 재사용되거나 빌드 feature 분리가 실제로 필요해질 때만 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`: projection이 지원하지 않는 컴포넌트 정보와 Code Connect 보조 정보 +- `get_code_connect_map`: 연결된 코드 컴포넌트 확인 +- `get_screenshot`: 선택적 시각 검증 자료 +- `use_figma`: 고정된 읽기 전용 projection script 실행 + +`use_figma`, `generate_figma_design`, `upload_assets`, `add_code_connect_map` 등 쓰기 가능 도구를 일반적으로 노출하지 않는다. `use_figma`는 예외적으로 호출하지만 Devup이 빌드 시 내장한 읽기 전용 script template만 실행한다. + +## Figma 데이터 projection + +실제 검증 결과 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가 Devup 코드생성에 필요한 속성만 compact JSON으로 투영한다. + +projection은 다음 데이터를 포함한다. + +- 공통: 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 + +임의 JavaScript를 사용자 입력으로 받지 않는다. file key와 node id는 파싱·검증한 후 JSON literal로만 script에 삽입한다. + +### 크기 제한과 청크 처리 + +Figma MCP 응답과 대형 선택 영역의 한계를 피하기 위해 다음 순서를 사용한다. + +1. `get_metadata`로 대상 구조를 얻는다. +2. 작은 노드는 한 번에 projection한다. +3. 예상 크기가 큰 Frame, Section 또는 Page는 직계 자식 단위로 분할한다. +4. bounded concurrency로 projection 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 코드를 다시 파싱해 주 데이터로 사용하지 않는다. projection이 지원하지 않는 의미 정보와 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_PROJECTION_UNSUPPORTED` +- `DEVUP_CODEGEN_FAILED` +- `DEVUP_THEME_CONFLICT` + +401은 refresh 후 한 번만 재시도한다. 429는 upstream retry hint가 있을 때만 bounded retry한다. projection 오류는 더 작은 subtree로 한 단계 분할한 뒤 한 번 재시도하고, 반복 실패하면 해당 node id를 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 +- projection JSON deserialize와 청크 재조립 +- 색상, 길이, 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. compact projection protocol과 청크 재조립 +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로 사용자에게 노출한다. From 499a7810e6bcbc6a6463f26da513d08bbac90b41 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Sun, 30 Aug 2026 23:41:36 +0900 Subject: [PATCH 02/97] docs: plan exhaustive Figma snapshot implementation --- .../plans/2026-08-30-figma-remote-mcp.md | 417 ++++++++++++++++++ .../2026-08-30-figma-remote-mcp-design.md | 41 +- 2 files changed, 445 insertions(+), 13 deletions(-) create mode 100644 docs/superpowers/plans/2026-08-30-figma-remote-mcp.md 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..0ae1e38 --- /dev/null +++ b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md @@ -0,0 +1,417 @@ +# Figma Remote MCP 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 a single Rust `devup-mcp` binary that 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:** `devup-mcp` is a downstream stdio MCP server and an upstream Streamable HTTP MCP client. A narrow Figma adapter owns OAuth, the read-only tool allowlist, snapshot collection and credential storage; deterministic codegen and theme modules consume raw-preserving snapshots without depending on a separate IR 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` + +## 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/specs/2026-08-30-figma-remote-mcp-design.md b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md index 50e1000..8ebf27f 100644 --- a/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md +++ b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md @@ -65,7 +65,7 @@ devup-mcp/ │ │ ├─ upstream.rs │ │ ├─ oauth.rs │ │ ├─ credentials.rs -│ │ ├─ projection.rs +│ │ ├─ snapshot.rs │ │ └─ errors.rs │ ├─ codegen/ │ │ ├─ mod.rs @@ -173,20 +173,20 @@ Figma mode 이름은 안정적인 JSON key로 정규화하되 원래 이름을 d - `get_metadata`: 파일의 페이지와 큰 노드의 구조 탐색 - `get_variable_defs`: 선택 범위에서 사용된 로컬·외부 변수 및 스타일 조회 -- `get_design_context`: projection이 지원하지 않는 컴포넌트 정보와 Code Connect 보조 정보 +- `get_design_context`: snapshot만으로 부족한 컴포넌트 의미와 Code Connect 보조 정보 - `get_code_connect_map`: 연결된 코드 컴포넌트 확인 - `get_screenshot`: 선택적 시각 검증 자료 -- `use_figma`: 고정된 읽기 전용 projection script 실행 +- `use_figma`: 고정된 읽기 전용 전체 snapshot script 실행 `use_figma`, `generate_figma_design`, `upload_assets`, `add_code_connect_map` 등 쓰기 가능 도구를 일반적으로 노출하지 않는다. `use_figma`는 예외적으로 호출하지만 Devup이 빌드 시 내장한 읽기 전용 script template만 실행한다. -## Figma 데이터 projection +## 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가 Devup 코드생성에 필요한 속성만 compact JSON으로 투영한다. +대신 고정된 읽기 전용 Plugin API script가 Figma Plugin API에서 공개되고 읽을 수 있는 디자인 필드를 손실 최소화 snapshot으로 직렬화한다. 현재 코드생성이 사용하지 않는 필드도 버리지 않고 raw JSON field로 보존한다. -projection은 다음 데이터를 포함한다. +snapshot은 Figma Plugin API typings에서 node type과 mixin별 데이터 property manifest를 생성해 다음 데이터를 포함한다. - 공통: id, type, name, visible, opacity, rotation - 트리: parent id, child ids 및 순서 @@ -197,6 +197,20 @@ projection은 다음 데이터를 포함한다. - 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에 삽입한다. @@ -205,9 +219,9 @@ projection은 다음 데이터를 포함한다. Figma MCP 응답과 대형 선택 영역의 한계를 피하기 위해 다음 순서를 사용한다. 1. `get_metadata`로 대상 구조를 얻는다. -2. 작은 노드는 한 번에 projection한다. +2. 작은 노드는 한 번에 전체 snapshot을 수집한다. 3. 예상 크기가 큰 Frame, Section 또는 Page는 직계 자식 단위로 분할한다. -4. bounded concurrency로 projection tool call을 실행한다. +4. bounded concurrency로 snapshot tool call을 실행한다. 5. Rust에서 node id와 child order를 기준으로 재조립한다. 6. 동일 파일 version 내 결과만 병합한다. version이 달라지면 일관성 오류로 재시도를 요청한다. @@ -242,7 +256,7 @@ Devup은 누락된 정보를 추측해 토큰을 만들지 않고 diagnostics에 5. 절대 배치, mask, vector, image 및 미지원 effect는 명시적 fallback과 diagnostics를 남긴다. 6. 결과는 formatter를 거쳐 결정적인 문자열로 만든다. -`get_design_context`가 반환한 React/Tailwind 코드를 다시 파싱해 주 데이터로 사용하지 않는다. projection이 지원하지 않는 의미 정보와 Code Connect 보조 자료로만 사용한다. +`get_design_context`가 반환한 React/Tailwind 코드를 다시 파싱해 주 데이터로 사용하지 않는다. snapshot만으로 부족한 의미 정보와 Code Connect 보조 자료로만 사용한다. ## 오류 모델 @@ -257,11 +271,11 @@ Devup은 누락된 정보를 추측해 토큰을 만들지 않고 diagnostics에 - `DEVUP_FIGMA_UNSUPPORTED_FILE` - `DEVUP_FIGMA_RESPONSE_TOO_LARGE` - `DEVUP_FIGMA_VERSION_CHANGED` -- `DEVUP_PROJECTION_UNSUPPORTED` +- `DEVUP_SNAPSHOT_UNSUPPORTED` - `DEVUP_CODEGEN_FAILED` - `DEVUP_THEME_CONFLICT` -401은 refresh 후 한 번만 재시도한다. 429는 upstream retry hint가 있을 때만 bounded retry한다. projection 오류는 더 작은 subtree로 한 단계 분할한 뒤 한 번 재시도하고, 반복 실패하면 해당 node id를 diagnostics에 남긴다. +401은 refresh 후 한 번만 재시도한다. 429는 upstream retry hint가 있을 때만 bounded retry한다. snapshot 오류는 더 작은 subtree로 한 단계 분할한 뒤 한 번 재시도하고, 반복 실패하면 해당 node id와 field 오류를 diagnostics에 남긴다. ## 보안과 개인정보 @@ -283,7 +297,8 @@ Devup은 누락된 정보를 추측해 토큰을 만들지 않고 diagnostics에 - Figma URL parser 및 branch URL 처리 - OAuth discovery, DCR, PKCE, state, refresh 및 timeout - credential redaction -- projection JSON deserialize와 청크 재조립 +- 전체 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 코드생성 @@ -317,7 +332,7 @@ Devup은 누락된 정보를 추측해 토큰을 만들지 않고 diagnostics에 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. compact projection protocol과 청크 재조립 +4. 전체 snapshot protocol, typings 기반 property manifest와 청크 재조립 5. `devup_figma_to_ui` Rust codegen 6. 변수 수집과 `devup_figma_to_json` 7. 실제 Figma OAuth 및 제공 노드 통합 검증 From f2a9493e1e6a22a197220904728d9e28b59ffe59 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Sun, 30 Aug 2026 23:47:09 +0900 Subject: [PATCH 03/97] feat: add Rust MCP server skeleton --- .github/workflows/ci.yml | 23 + .gitignore | 6 + Cargo.lock | 3450 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 38 + rust-toolchain.toml | 5 + src/lib.rs | 11 + src/main.rs | 12 + src/server/mod.rs | 70 + src/server/tools.rs | 32 + tests/stdio_tools.rs | 37 + 10 files changed, 3684 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 rust-toolchain.toml create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/server/mod.rs create mode 100644 src/server/tools.rs create mode 100644 tests/stdio_tools.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e0622eb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,23 @@ +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@v4 + - uses: dtolnay/rust-toolchain@1.88.0 + with: + components: rustfmt, clippy + - uses: Swatinem/rust-cache@v2 + - run: cargo fmt --all -- --check + - run: cargo clippy --all-targets --all-features -- -D warnings + - run: cargo test --all-features + - run: cargo build --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..8cf1751 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3450 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aes" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" +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 = "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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" +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 = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[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 = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[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 = "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 = "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.22.1", + "keyring", + "oauth2", + "pretty_assertions", + "rand 0.9.5", + "reqwest 0.12.28", + "rmcp", + "schemars", + "serde", + "serde_json", + "sha2 0.10.9", + "subtle", + "tempfile", + "thiserror 2.0.20", + "tokio", + "tracing", + "tracing-subscriber", + "url", + "webbrowser", +] + +[[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 = "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 = "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 = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[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_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.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[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 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "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", + "webpki-roots", +] + +[[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 = "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 = "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 = "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 = "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 = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[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", + "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-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", + "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", + "reqwest 0.12.28", + "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 = "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 = "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 = "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 = "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 = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "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.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[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", + "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.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a15bc53261a9dc37e105df006e4656c598379a8f9581f8950debb130f27a7cf" +dependencies = [ + "async-trait", + "base64 0.23.1", + "bytes", + "chrono", + "futures", + "http", + "indexmap", + "oauth2", + "pastey", + "pin-project-lite", + "reqwest 0.13.4", + "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.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a85d45508e9b4ba024fe996c2638799635d75b6dd0ba8f32ccf08f8026f0c780" +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 = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "aws-lc-rs", + "once_cell", + "ring", + "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 = "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 = [ + "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_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 = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[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 = "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 = "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-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[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 = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[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 = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +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", +] + +[[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", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[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_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[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 = "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..68e4973 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "devup-mcp" +version = "0.1.0" +edition = "2024" +rust-version = "1.88" +license = "MIT" +description = "Rust-native MCP server for Figma to DevupUI workflows" +repository = "https://github.com/dev-five-git/devup-mcp" + +[dependencies] +anyhow = "1" +async-trait = "0.1" +axum = "0.8" +base64 = "0.22" +keyring = "4.2" +oauth2 = { version = "5", default-features = false, features = ["reqwest", "rustls-tls"] } +rand = "0.9" +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +rmcp = { version = "3.1", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] } +schemars = "1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" +subtle = "2" +thiserror = "2" +tokio = { version = "1", features = ["full"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } +url = "2" +webbrowser = "1" + +[dev-dependencies] +pretty_assertions = "1" +tempfile = "3" + +[profile.release] +lto = "thin" +strip = true diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..89de10b --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +[toolchain] +channel = "1.88.0" +components = ["clippy", "rustfmt"] +profile = "minimal" + diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..f3ec74e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,11 @@ +pub mod server; + +pub async fn run_stdio() -> anyhow::Result<()> { + use rmcp::ServiceExt; + + let service = server::DevupServer::default() + .serve((tokio::io::stdin(), tokio::io::stdout())) + .await?; + service.waiting().await?; + Ok(()) +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d1cffd4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,12 @@ +#[tokio::main] +async fn main() -> anyhow::Result<()> { + 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().await +} diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..8d06f75 --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,70 @@ +mod tools; + +use rmcp::{ + ServerHandler, + handler::server::router::tool::ToolRouter, + model::{ServerCapabilities, ServerInfo}, + tool, tool_handler, tool_router, +}; + +pub use tools::{AuthInput, FigmaToJsonInput, FigmaToUiInput}; + +#[derive(Clone)] +pub struct DevupServer { + tool_router: ToolRouter, +} + +impl Default for DevupServer { + fn default() -> Self { + Self { + tool_router: Self::tool_router(), + } + } +} + +#[tool_router] +impl DevupServer { + #[tool(description = "Authenticate devup-mcp with Figma Remote MCP")] + async fn devup_figma_auth( + &self, + rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< + AuthInput, + >, + ) -> String { + format!("Figma auth action '{}' is not connected yet", input.action) + } + + #[tool(description = "Convert a Figma design link to DevupUI TypeScript")] + async fn devup_figma_to_ui( + &self, + rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< + FigmaToUiInput, + >, + ) -> String { + format!( + "Figma UI conversion for '{}' is not connected yet", + input.url + ) + } + + #[tool(description = "Convert Figma variables to devup.json")] + async fn devup_figma_to_json( + &self, + rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< + FigmaToJsonInput, + >, + ) -> String { + format!( + "Figma theme conversion for '{}' is not connected yet", + input.url + ) + } +} + +#[tool_handler(router = self.tool_router)] +impl ServerHandler for DevupServer { + fn get_info(&self) -> ServerInfo { + ServerInfo::new(ServerCapabilities::builder().enable_tools().build()) + .with_instructions("Read Figma designs and generate DevupUI artifacts") + } +} diff --git a/src/server/tools.rs b/src/server/tools.rs new file mode 100644 index 0000000..893cbee --- /dev/null +++ b/src/server/tools.rs @@ -0,0 +1,32 @@ +use rmcp::schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[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, +} + +#[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, +} + +fn default_scope() -> String { + "node".to_owned() +} diff --git a/tests/stdio_tools.rs b/tests/stdio_tools.rs new file mode 100644 index 0000000..441bbba --- /dev/null +++ b/tests/stdio_tools.rs @@ -0,0 +1,37 @@ +use devup_mcp::server::DevupServer; +use rmcp::ServiceExt; + +#[tokio::test] +async fn exposes_only_the_three_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 mut names = client + .list_all_tools() + .await? + .into_iter() + .map(|tool| tool.name.to_string()) + .collect::>(); + names.sort(); + + assert_eq!( + names, + [ + "devup_figma_auth", + "devup_figma_to_json", + "devup_figma_to_ui", + ] + ); + + client.cancel().await?; + server.await??; + Ok(()) +} From 834428f94b31cf2982942bfa2faa2e532dbf4a6b Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Sun, 30 Aug 2026 23:50:44 +0900 Subject: [PATCH 04/97] feat: parse Figma links safely --- src/figma/errors.rs | 57 +++++++++++++++++++++++++++ src/figma/mod.rs | 5 +++ src/figma/url.rs | 94 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + tests/figma_url.rs | 78 +++++++++++++++++++++++++++++++++++++ 5 files changed, 235 insertions(+) create mode 100644 src/figma/errors.rs create mode 100644 src/figma/mod.rs create mode 100644 src/figma/url.rs create mode 100644 tests/figma_url.rs diff --git a/src/figma/errors.rs b/src/figma/errors.rs new file mode 100644 index 0000000..cd88290 --- /dev/null +++ b/src/figma/errors.rs @@ -0,0 +1,57 @@ +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, + DevupFigmaNodeNotFound, + DevupFigmaUnsupportedFile, + DevupFigmaResponseTooLarge, + DevupFigmaVersionChanged, + DevupSnapshotUnsupported, + DevupCodegenFailed, + DevupThemeConflict, +} + +#[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 unsupported_file(message: impl Into) -> Self { + Self { + code: ErrorCode::DevupFigmaUnsupportedFile, + message: message.into(), + retryable: false, + details: serde_json::Value::Null, + } + } +} + +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/src/figma/mod.rs b/src/figma/mod.rs new file mode 100644 index 0000000..52d30aa --- /dev/null +++ b/src/figma/mod.rs @@ -0,0 +1,5 @@ +mod errors; +mod url; + +pub use errors::{DevupError, ErrorCode}; +pub use url::FigmaTarget; diff --git a/src/figma/url.rs b/src/figma/url.rs new file mode 100644 index 0000000..5a0ba9c --- /dev/null +++ b/src/figma/url.rs @@ -0,0 +1,94 @@ +use url::Url; + +use super::DevupError; + +#[derive(Debug, Clone, PartialEq, Eq)] +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/src/lib.rs b/src/lib.rs index f3ec74e..010e39d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod figma; pub mod server; pub async fn run_stdio() -> anyhow::Result<()> { diff --git a/tests/figma_url.rs b/tests/figma_url.rs new file mode 100644 index 0000000..0b0a168 --- /dev/null +++ b/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")); +} From 4ba6815b84c47688ea95dde0fe0e1398ad8fdda9 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Sun, 30 Aug 2026 23:59:28 +0900 Subject: [PATCH 05/97] feat: authenticate Figma with OAuth --- src/figma/credentials.rs | 128 +++++++++++ src/figma/errors.rs | 10 +- src/figma/mod.rs | 6 + src/figma/oauth.rs | 468 +++++++++++++++++++++++++++++++++++++++ tests/oauth_flow.rs | 166 ++++++++++++++ 5 files changed, 775 insertions(+), 3 deletions(-) create mode 100644 src/figma/credentials.rs create mode 100644 src/figma/oauth.rs create mode 100644 tests/oauth_flow.rs diff --git a/src/figma/credentials.rs b/src/figma/credentials.rs new file mode 100644 index 0000000..bf03548 --- /dev/null +++ b/src/figma/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/src/figma/errors.rs b/src/figma/errors.rs index cd88290..13cff3c 100644 --- a/src/figma/errors.rs +++ b/src/figma/errors.rs @@ -26,14 +26,18 @@ pub struct DevupError { } impl DevupError { - pub fn unsupported_file(message: impl Into) -> Self { + pub fn new(code: ErrorCode, message: impl Into, retryable: bool) -> Self { Self { - code: ErrorCode::DevupFigmaUnsupportedFile, + code, message: message.into(), - retryable: false, + retryable, details: serde_json::Value::Null, } } + + pub fn unsupported_file(message: impl Into) -> Self { + Self::new(ErrorCode::DevupFigmaUnsupportedFile, message, false) + } } impl std::fmt::Debug for DevupError { diff --git a/src/figma/mod.rs b/src/figma/mod.rs index 52d30aa..81698af 100644 --- a/src/figma/mod.rs +++ b/src/figma/mod.rs @@ -1,5 +1,11 @@ +mod credentials; mod errors; +mod oauth; mod url; +pub use credentials::{ + CredentialStore, KeyringCredentialStore, MemoryCredentialStore, StoredAuthorization, +}; pub use errors::{DevupError, ErrorCode}; +pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; pub use url::FigmaTarget; diff --git a/src/figma/oauth.rs b/src/figma/oauth.rs new file mode 100644 index 0000000..ee176d6 --- /dev/null +++ b/src/figma/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::RngCore; +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/tests/oauth_flow.rs b/tests/oauth_flow.rs new file mode 100644 index 0000000..2c0a468 --- /dev/null +++ b/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(()) +} From d4e04d3f53824c7ae046c49430d1e85957730863 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:03:08 +0900 Subject: [PATCH 06/97] feat: add read-only Figma MCP client --- src/figma/mod.rs | 2 + src/figma/scripts/snapshot.js | 4 + src/figma/scripts/variables.js | 3 + src/figma/upstream.rs | 243 +++++++++++++++++++++++++++++++++ tests/upstream_contract.rs | 54 ++++++++ 5 files changed, 306 insertions(+) create mode 100644 src/figma/scripts/snapshot.js create mode 100644 src/figma/scripts/variables.js create mode 100644 src/figma/upstream.rs create mode 100644 tests/upstream_contract.rs diff --git a/src/figma/mod.rs b/src/figma/mod.rs index 81698af..b28f962 100644 --- a/src/figma/mod.rs +++ b/src/figma/mod.rs @@ -1,6 +1,7 @@ mod credentials; mod errors; mod oauth; +mod upstream; mod url; pub use credentials::{ @@ -8,4 +9,5 @@ pub use credentials::{ }; pub use errors::{DevupError, ErrorCode}; pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; +pub use upstream::{BuiltinScript, FigmaUpstream, ReadToolCall, RemoteFigmaClient, UpstreamResult}; pub use url::FigmaTarget; diff --git a/src/figma/scripts/snapshot.js b/src/figma/scripts/snapshot.js new file mode 100644 index 0000000..a94d21e --- /dev/null +++ b/src/figma/scripts/snapshot.js @@ -0,0 +1,4 @@ +const node = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); +if (!node) throw new Error("DEVUP_NODE_NOT_FOUND"); +return { id: node.id, type: node.type, name: node.name }; + diff --git a/src/figma/scripts/variables.js b/src/figma/scripts/variables.js new file mode 100644 index 0000000..a164b04 --- /dev/null +++ b/src/figma/scripts/variables.js @@ -0,0 +1,3 @@ +const collections = await figma.variables.getLocalVariableCollectionsAsync(); +const variables = await figma.variables.getLocalVariablesAsync(); +return { collections, variables }; diff --git a/src/figma/upstream.rs b/src/figma/upstream.rs new file mode 100644 index 0000000..9ce58ab --- /dev/null +++ b/src/figma/upstream.rs @@ -0,0 +1,243 @@ +use async_trait::async_trait; +use rmcp::{ + ServiceExt, + model::CallToolRequestParams, + transport::{ + StreamableHttpClientTransport, streamable_http_client::StreamableHttpClientTransportConfig, + }, +}; +use serde_json::{Map, Value, json}; + +use super::{CredentialStore, DevupError, ErrorCode, OAuthManager}; + +const DEFAULT_FIGMA_MCP_ENDPOINT: &str = "https://mcp.figma.com/mcp"; +const MAX_SSE_EVENT_SIZE: usize = 16 * 1024 * 1024; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BuiltinScript { + NodeSnapshot, + LocalVariables, +} + +impl BuiltinScript { + fn source(self, node_id: &str) -> String { + let node_id = serde_json::to_string(node_id).expect("node id serializes"); + match self { + Self::NodeSnapshot => include_str!("scripts/snapshot.js"), + Self::LocalVariables => include_str!("scripts/variables.js"), + } + .replace("\"__DEVUP_NODE_ID__\"", &node_id) + } +} + +#[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, + }, +} + +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 { + Self::Snapshot { + file_key: file_key.into(), + node_id: node_id.into(), + script, + } + } + + 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 { .. } => "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, + } => json!({ + "fileKey": file_key, + "nodeId": node_id, + "code": script.source(node_id) + }), + }; + value.as_object().cloned().unwrap_or_default() + } +} + +#[derive(Debug, Clone)] +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, +} + +impl RemoteFigmaClient { + pub fn new(oauth: OAuthManager) -> Self { + Self { + endpoint: DEFAULT_FIGMA_MCP_ENDPOINT.to_owned(), + oauth, + } + } + + pub fn with_endpoint(endpoint: impl Into, oauth: OAuthManager) -> Self { + Self { + endpoint: endpoint.into(), + oauth, + } + } + + async fn connect( + &self, + ) -> Result, DevupError> { + 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(upstream_error) + } +} + +#[async_trait] +impl FigmaUpstream for RemoteFigmaClient { + async fn list_tools(&self) -> Result, DevupError> { + let client = self.connect().await?; + let mut names = client + .list_all_tools() + .await + .map_err(upstream_error)? + .into_iter() + .map(|tool| tool.name.to_string()) + .collect::>(); + names.sort(); + client.cancel().await.map_err(upstream_error)?; + Ok(names) + } + + async fn call_read_tool(&self, call: ReadToolCall) -> Result { + let client = self.connect().await?; + let available = client.list_all_tools().await.map_err(upstream_error)?; + if !available.iter().any(|tool| tool.name == call.tool_name()) { + client.cancel().await.map_err(upstream_error)?; + return Err(DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma Remote MCP가 필요한 읽기 도구를 제공하지 않습니다.", + false, + )); + } + let result = client + .call_tool( + CallToolRequestParams::new(call.tool_name()).with_arguments(call.arguments()), + ) + .await + .map_err(upstream_error)?; + client.cancel().await.map_err(upstream_error)?; + let raw = serde_json::to_value(result).map_err(|_| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답을 안전하게 해석하지 못했습니다.", + false, + ) + })?; + Ok(UpstreamResult { raw }) + } +} + +fn upstream_error(_error: E) -> DevupError { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma Remote MCP 요청을 완료하지 못했습니다.", + true, + ) +} diff --git a/tests/upstream_contract.rs b/tests/upstream_contract.rs new file mode 100644 index 0000000..d019c38 --- /dev/null +++ b/tests/upstream_contract.rs @@ -0,0 +1,54 @@ +use devup_mcp::figma::{BuiltinScript, ReadToolCall}; + +#[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(")); +} From b506b219242398b5d029765de64e709594c5232b Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:08:26 +0900 Subject: [PATCH 07/97] feat: preserve exhaustive Figma snapshots --- src/figma/mod.rs | 5 + src/figma/plugin_api_manifest.json | 25 ++++ src/figma/scripts/snapshot.js | 82 +++++++++++- src/figma/snapshot.rs | 197 +++++++++++++++++++++++++++++ src/figma/upstream.rs | 9 +- tests/snapshot.rs | 145 +++++++++++++++++++++ 6 files changed, 457 insertions(+), 6 deletions(-) create mode 100644 src/figma/plugin_api_manifest.json create mode 100644 src/figma/snapshot.rs create mode 100644 tests/snapshot.rs diff --git a/src/figma/mod.rs b/src/figma/mod.rs index b28f962..98e6338 100644 --- a/src/figma/mod.rs +++ b/src/figma/mod.rs @@ -1,6 +1,7 @@ mod credentials; mod errors; mod oauth; +mod snapshot; mod upstream; mod url; @@ -9,5 +10,9 @@ pub use credentials::{ }; pub use errors::{DevupError, ErrorCode}; pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; +pub use snapshot::{ + Diagnostic, RawNode, Snapshot, SnapshotChunk, TypedNode, merge_chunks, + snapshot_chunk_from_result, +}; pub use upstream::{BuiltinScript, FigmaUpstream, ReadToolCall, RemoteFigmaClient, UpstreamResult}; pub use url::FigmaTarget; diff --git a/src/figma/plugin_api_manifest.json b/src/figma/plugin_api_manifest.json new file mode 100644 index 0000000..3d9b7c6 --- /dev/null +++ b/src/figma/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", "componentSetId", "componentSetProperties", + "constraints", "cornerRadius", "cornerSmoothing", "counterAxisAlignContent", "counterAxisAlignItems", + "counterAxisSizingMode", "dashPattern", "description", "devStatus", "documentationLinks", "effects", + "effectStyleId", "expanded", "explicitVariableModes", "exportSettings", "fills", "fillStyleId", + "fontName", "fontSize", "gridColumnAnchorIndex", "gridColumnCount", "gridColumnGap", "gridColumnSpan", + "gridRowAnchorIndex", "gridRowCount", "gridRowGap", "gridRowSpan", "gridStyleId", "guides", "height", + "hyperlink", "inferredAutoLayout", "isAsset", "isMask", "isMaskOutline", "itemReverseZIndex", + "itemSpacing", "layoutAlign", "layoutGrids", "layoutGrow", "layoutMode", "layoutPositioning", + "layoutSizingHorizontal", "layoutSizingVertical", "layoutWrap", "letterSpacing", "lineHeight", + "locked", "mainAxisAlignItems", "mainAxisSizingMode", "maxHeight", "maxWidth", "measurements", + "minHeight", "minWidth", "name", "numberOfFixedChildren", "opacity", "overlayBackground", + "overlayBackgroundInteraction", "overlayPositionType", "paddingBottom", "paddingLeft", "paddingRight", + "paddingTop", "paragraphIndent", "paragraphSpacing", "paragraphSpacingMode", "pluginData", "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/src/figma/scripts/snapshot.js b/src/figma/scripts/snapshot.js index a94d21e..1915319 100644 --- a/src/figma/scripts/snapshot.js +++ b/src/figma/scripts/snapshot.js @@ -1,4 +1,80 @@ -const node = await figma.getNodeByIdAsync("__DEVUP_NODE_ID__"); -if (!node) throw new Error("DEVUP_NODE_NOT_FOUND"); -return { id: node.id, type: node.type, name: node.name }; +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 skipped = new Set(["id", "type", "parent", "children"]); + +function propertyNames(value) { + const names = new Set(manifest); + 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" && 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 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 = serialize(value); + (manifestSet.has(name) ? fields : extra)[name] = serialized; + } catch (error) { + fieldErrors[name] = String(error && error.message ? error.message : error); + } + } + return { id: node.id, type: node.type, fields, extra, fieldErrors }; +} + +const nodes = []; +const queue = [root]; +while (queue.length) { + const node = queue.shift(); + nodes.push(snapshotNode(node)); + if ("children" in node) queue.push(...node.children); +} + +return { + fileKey: figma.fileKey || "", + version: null, + rootIds: [root.id], + nodes, + diagnostics: [] +}; diff --git a/src/figma/snapshot.rs b/src/figma/snapshot.rs new file mode 100644 index 0000000..6656143 --- /dev/null +++ b/src/figma/snapshot.rs @@ -0,0 +1,197 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; + +use super::{DevupError, ErrorCode, UpstreamResult}; + +#[derive(Debug, Clone, 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, +} + +#[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, +} + +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/src/figma/upstream.rs b/src/figma/upstream.rs index 9ce58ab..9130384 100644 --- a/src/figma/upstream.rs +++ b/src/figma/upstream.rs @@ -22,11 +22,14 @@ pub enum BuiltinScript { impl BuiltinScript { fn source(self, node_id: &str) -> String { let node_id = serde_json::to_string(node_id).expect("node id serializes"); - match self { + let source = match self { Self::NodeSnapshot => include_str!("scripts/snapshot.js"), Self::LocalVariables => include_str!("scripts/variables.js"), - } - .replace("\"__DEVUP_NODE_ID__\"", &node_id) + }; + source.replace("\"__DEVUP_NODE_ID__\"", &node_id).replace( + "\"__DEVUP_PLUGIN_API_MANIFEST__\"", + include_str!("plugin_api_manifest.json"), + ) } } diff --git a/tests/snapshot.rs b/tests/snapshot.rs new file mode 100644 index 0000000..2cfd4d2 --- /dev/null +++ b/tests/snapshot.rs @@ -0,0 +1,145 @@ +use devup_mcp::figma::{ + 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" + ); +} From 569a272eabd84eeff6b434f32395421ce735f77e Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:13:17 +0900 Subject: [PATCH 08/97] feat: generate DevupUI from Figma snapshots --- src/codegen/component.rs | 192 +++++++++++++++++++++++++++++++++++++++ src/codegen/layout.rs | 41 +++++++++ src/codegen/mod.rs | 6 ++ src/codegen/style.rs | 48 ++++++++++ src/codegen/text.rs | 31 +++++++ src/lib.rs | 1 + tests/codegen.rs | 99 ++++++++++++++++++++ 7 files changed, 418 insertions(+) create mode 100644 src/codegen/component.rs create mode 100644 src/codegen/layout.rs create mode 100644 src/codegen/mod.rs create mode 100644 src/codegen/style.rs create mode 100644 src/codegen/text.rs create mode 100644 tests/codegen.rs diff --git a/src/codegen/component.rs b/src/codegen/component.rs new file mode 100644 index 0000000..1c9e264 --- /dev/null +++ b/src/codegen/component.rs @@ -0,0 +1,192 @@ +use std::collections::{BTreeSet, HashSet}; + +use crate::figma::{DevupError, Diagnostic, ErrorCode, RawNode, Snapshot}; + +use super::{layout, style, text}; + +#[derive(Debug, Clone, Default)] +pub struct CodegenOptions { + pub component_name: Option, + pub include_diagnostics: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CodegenOutput { + pub tsx: String, + pub imports: Vec, + pub used_tokens: BTreeSet, + pub diagnostics: Vec, +} + +pub fn generate_component( + 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 component_name = options + .component_name + .as_deref() + .map(normalize_component_name) + .unwrap_or_else(|| normalize_component_name(root.typed_view().name().unwrap_or(""))); + let mut context = Context::default(); + let jsx = render_node(snapshot, root, 2, &mut context, &mut HashSet::new())?; + let imports = context.imports.iter().cloned().collect::>(); + let mut tsx = format!( + "import {{ {} }} from \"@devup-ui/react\";\n\n", + imports.join(", ") + ); + tsx.push_str(&format!( + "export function {component_name}() {{\n return (\n{jsx}\n );\n}}\n" + )); + Ok(CodegenOutput { + tsx, + imports, + used_tokens: context.used_tokens, + diagnostics: context.diagnostics, + }) +} + +#[derive(Default)] +struct Context { + imports: BTreeSet, + used_tokens: BTreeSet, + diagnostics: Vec, +} + +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 component = if view.node_type() == "TEXT" { + "Text" + } else if view.string("layoutMode").is_some_and(|mode| mode != "NONE") { + "Flex" + } else { + "Box" + }; + context.imports.insert(component.to_owned()); + + let mut props = Vec::new(); + layout::push_layout_props(&view, &mut props); + style::push_style_props(&view, component, &mut props, &mut context.used_tokens); + text::push_text_props(&view, &mut props); + let props = if props.is_empty() { + String::new() + } else { + format!(" {}", props.join(" ")) + }; + let indent = " ".repeat(depth); + let children = view + .child_ids() + .filter_map(|id| snapshot.nodes.get(id)) + .map(|child| render_node(snapshot, child, depth + 1, context, visiting)) + .collect::, _>>()?; + + let rendered = if component == "Text" { + let characters = view + .string("characters") + .map(text::escape_jsx_text) + .unwrap_or_default(); + format!("{indent}{characters}") + } else if children.is_empty() { + format!("{indent}<{component}{props} />") + } else { + format!( + "{indent}<{component}{props}>\n{}\n{indent}", + children.join("\n") + ) + }; + visiting.remove(&node.id); + Ok(rendered) +} + +fn add_fallback_diagnostics(node: &RawNode, context: &mut Context) { + let view = node.typed_view(); + let candidates = [ + ( + view.bool("isMask") == Some(true), + "DEVUP_CODEGEN_MASK_FALLBACK", + "Mask는 기본 Box 렌더링으로 보존됩니다.", + ), + ( + view.string("layoutPositioning") == Some("ABSOLUTE"), + "DEVUP_CODEGEN_ABSOLUTE_FALLBACK", + "절대 배치는 position props로 제한적으로 변환됩니다.", + ), + ( + view.value("effects") + .and_then(serde_json::Value::as_array) + .is_some_and(|effects| !effects.is_empty()), + "DEVUP_CODEGEN_EFFECT_FALLBACK", + "일부 Figma effect는 계산된 CSS로 변환되지 않을 수 있습니다.", + ), + ]; + for (enabled, code, message) in candidates { + if enabled { + context.diagnostics.push(Diagnostic { + code: code.to_owned(), + message: message.to_owned(), + node_id: Some(node.id.clone()), + }); + } + } +} + +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/src/codegen/layout.rs b/src/codegen/layout.rs new file mode 100644 index 0000000..e8ef9fa --- /dev/null +++ b/src/codegen/layout.rs @@ -0,0 +1,41 @@ +use crate::figma::TypedNode; + +pub(super) fn push_layout_props(view: &TypedNode<'_>, props: &mut Vec) { + push_px(view, props, "width", "w"); + push_px(view, props, "height", "h"); + if let Some(mode) = view.string("layoutMode") { + match mode { + "HORIZONTAL" => props.push("flexDir=\"row\"".to_owned()), + "VERTICAL" => props.push("flexDir=\"column\"".to_owned()), + _ => {} + } + } + push_px(view, props, "itemSpacing", "gap"); + + let padding = ["paddingTop", "paddingRight", "paddingBottom", "paddingLeft"] + .map(|field| view.number(field)); + if let [Some(top), Some(right), Some(bottom), Some(left)] = padding { + if top == right && right == bottom && bottom == left { + props.push(format!("p=\"{}\"", px(top))); + } else { + props.push(format!("pt=\"{}\"", px(top))); + props.push(format!("pr=\"{}\"", px(right))); + props.push(format!("pb=\"{}\"", px(bottom))); + props.push(format!("pl=\"{}\"", px(left))); + } + } +} + +fn push_px(view: &TypedNode<'_>, props: &mut Vec, field: &str, prop: &str) { + if let Some(value) = view.number(field) { + props.push(format!("{prop}=\"{}\"", px(value))); + } +} + +pub(super) fn px(value: f64) -> String { + if value.fract() == 0.0 { + format!("{value:.0}px") + } else { + format!("{value}px") + } +} diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs new file mode 100644 index 0000000..4bd0c55 --- /dev/null +++ b/src/codegen/mod.rs @@ -0,0 +1,6 @@ +mod component; +mod layout; +mod style; +mod text; + +pub use component::{CodegenOptions, CodegenOutput, generate_component, normalize_component_name}; diff --git a/src/codegen/style.rs b/src/codegen/style.rs new file mode 100644 index 0000000..7b68cfd --- /dev/null +++ b/src/codegen/style.rs @@ -0,0 +1,48 @@ +use std::collections::BTreeSet; + +use serde_json::Value; + +use crate::figma::TypedNode; + +pub(super) fn push_style_props( + view: &TypedNode<'_>, + component: &str, + props: &mut Vec, + used_tokens: &mut BTreeSet, +) { + 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()); + props.push(format!("{color_prop}=\"${token}\"")); + } else if let Some(color) = first_solid_color(view.value("fills")) { + props.push(format!("{color_prop}=\"{color}\"")); + } + if let Some(opacity) = view.number("opacity") + && opacity < 1.0 + { + props.push(format!("opacity={{{opacity}}}")); + } +} + +fn first_solid_color(value: Option<&Value>) -> Option { + let paint = value? + .as_array()? + .iter() + .find(|paint| paint["type"] == "SOLID")?; + let color = paint.get("color")?; + let channel = |name: &str| -> Option { + let value = color.get(name)?.as_f64()?; + Some((value.clamp(0.0, 1.0) * 255.0).round() as u8) + }; + Some(format!( + "#{:02x}{:02x}{:02x}", + channel("r")?, + channel("g")?, + channel("b")? + )) +} diff --git a/src/codegen/text.rs b/src/codegen/text.rs new file mode 100644 index 0000000..051ed7c --- /dev/null +++ b/src/codegen/text.rs @@ -0,0 +1,31 @@ +use serde_json::Value; + +use crate::figma::TypedNode; + +use super::layout::px; + +pub(super) fn push_text_props(view: &TypedNode<'_>, props: &mut Vec) { + if view.node_type() != "TEXT" { + return; + } + if let Some(font_size) = view.number("fontSize") { + props.push(format!("fontSize=\"{}\"", px(font_size))); + } + if let Some(line_height) = view + .value("lineHeight") + .and_then(Value::as_object) + .and_then(|line_height| line_height.get("value")) + .and_then(Value::as_f64) + { + props.push(format!("lineHeight=\"{}\"", px(line_height))); + } +} + +pub(super) fn escape_jsx_text(input: &str) -> String { + input + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('{', "{") + .replace('}', "}") +} diff --git a/src/lib.rs b/src/lib.rs index 010e39d..d399112 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod codegen; pub mod figma; pub mod server; diff --git a/tests/codegen.rs b/tests/codegen.rs new file mode 100644 index 0000000..f747884 --- /dev/null +++ b/tests/codegen.rs @@ -0,0 +1,99 @@ +use devup_mcp::{ + codegen::{CodegenOptions, generate_component, normalize_component_name}, + 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", "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": "안녕 ", + "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, + }, + ) + .expect("codegen"); + + assert_eq!( + output.tsx, + concat!( + "import { Flex, Text } from \"@devup-ui/react\";\n\n", + "export function Fr026본연체() {\n", + " return (\n", + " \n", + " 안녕 <Devup>\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")); +} From 76084fe7919513ac263c7e52085c5bfcfd485e23 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:18:12 +0900 Subject: [PATCH 09/97] feat: generate devup theme from Figma variables --- Cargo.lock | 1 + Cargo.toml | 2 +- src/figma/scripts/variables.js | 58 ++++++- src/lib.rs | 1 + src/theme/devup_json.rs | 269 +++++++++++++++++++++++++++++++++ src/theme/mod.rs | 7 + src/theme/tokens.rs | 36 +++++ tests/theme.rs | 116 ++++++++++++++ 8 files changed, 486 insertions(+), 4 deletions(-) create mode 100644 src/theme/devup_json.rs create mode 100644 src/theme/mod.rs create mode 100644 src/theme/tokens.rs create mode 100644 tests/theme.rs diff --git a/Cargo.lock b/Cargo.lock index 8cf1751..e9dc9d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2307,6 +2307,7 @@ version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ + "indexmap", "itoa", "memchr", "serde", diff --git a/Cargo.toml b/Cargo.toml index 68e4973..3b5e8f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ reqwest = { version = "0.12", default-features = false, features = ["json", "rus rmcp = { version = "3.1", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] } schemars = "1" serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json = { version = "1", features = ["preserve_order"] } sha2 = "0.10" subtle = "2" thiserror = "2" diff --git a/src/figma/scripts/variables.js b/src/figma/scripts/variables.js index a164b04..47f1812 100644 --- a/src/figma/scripts/variables.js +++ b/src/figma/scripts/variables.js @@ -1,3 +1,55 @@ -const collections = await figma.variables.getLocalVariableCollectionsAsync(); -const variables = await figma.variables.getLocalVariablesAsync(); -return { collections, variables }; +function serialize(value, seen = new WeakSet(), depth = 0) { + if (value === null || ["string", "number", "boolean"].includes(typeof value)) return value; + if (typeof value === "undefined") return null; + if (["function", "symbol"].includes(typeof value)) return undefined; + 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("_") || ["parent", "children"].includes(name)) continue; + try { + const serialized = serialize(value[name], seen, depth + 1); + if (typeof serialized !== "undefined") result[name] = serialized; + } catch (error) { + result[name] = { $error: String(error && error.message ? error.message : error) }; + } + } + seen.delete(value); + return result; +} + +const collections = (await figma.variables.getLocalVariableCollectionsAsync()).map(serialize); +const variables = (await figma.variables.getLocalVariablesAsync()).map(serialize); +const styleGroups = await Promise.all([ + figma.getLocalPaintStylesAsync(), + figma.getLocalTextStylesAsync(), + figma.getLocalEffectStylesAsync(), + figma.getLocalGridStylesAsync() +]); +const styleTypes = ["PAINT", "TEXT", "EFFECT", "GRID"]; +const styles = styleGroups.flatMap((group, index) => group.map((style) => ({ + ...serialize(style), + styleType: styleTypes[index], + value: serialize( + styleTypes[index] === "PAINT" ? style.paints + : styleTypes[index] === "EFFECT" ? style.effects + : styleTypes[index] === "GRID" ? style.layoutGrids + : style + ) +}))); + +return { + collections, + variables, + styles, + usedRemoteVariables: [], + localComplete: true +}; diff --git a/src/lib.rs b/src/lib.rs index d399112..4eb5d2e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod codegen; pub mod figma; pub mod server; +pub mod theme; pub async fn run_stdio() -> anyhow::Result<()> { use rmcp::ServiceExt; diff --git a/src/theme/devup_json.rs b/src/theme/devup_json.rs new file mode 100644 index 0000000..2152061 --- /dev/null +++ b/src/theme/devup_json.rs @@ -0,0 +1,269 @@ +use std::collections::{BTreeMap, HashMap, HashSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; + +use crate::figma::{DevupError, Diagnostic, ErrorCode}; + +use super::tokens::{normalize_token, variable_token}; + +#[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 local_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 fn generate_devup_json( + snapshot: &VariableSnapshot, + _scope: ThemeScope, +) -> Result { + let mut diagnostics = Vec::new(); + let collections = snapshot + .collections + .iter() + .map(|collection| (collection.id.as_str(), collection)) + .collect::>(); + let variables = snapshot + .variables + .iter() + .chain(snapshot.used_remote_variables.iter()) + .map(|variable| (variable.id.as_str(), variable)) + .collect::>(); + let mut colors: BTreeMap> = BTreeMap::new(); + let mut lengths: BTreeMap> = BTreeMap::new(); + + for variable in variables.values() { + let Some(collection) = collections.get(variable.variable_collection_id.as_str()) else { + diagnostics.push(Diagnostic { + code: "DEVUP_THEME_COLLECTION_MISSING".to_owned(), + message: format!("변수 '{}'의 collection을 찾지 못했습니다.", variable.name), + node_id: None, + }); + 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 { + diagnostics.push(Diagnostic { + code: "DEVUP_THEME_ALIAS_CYCLE".to_owned(), + message: format!( + "변수 '{}'의 alias를 안전하게 해석하지 못했습니다.", + variable.name + ), + node_id: None, + }); + continue; + }; + let mode_name = normalize_token(&mode.name); + match variable.resolved_type.as_str() { + "COLOR" => { + if let Some(color) = color_value(value) { + colors + .entry(mode_name) + .or_default() + .insert(token.clone(), Value::String(color)); + } + } + "FLOAT" => { + if let Some(number) = value.as_f64() { + lengths + .entry(mode_name) + .or_default() + .insert(token.clone(), Value::String(format_px(number))); + } + } + _ => {} + } + } + } + + let mut typography = BTreeMap::new(); + let mut shadows = BTreeMap::new(); + for style in &snapshot.styles { + let token = normalize_token(&style.name); + match style.style_type.as_str() { + "TEXT" => { + typography.insert(token, style.value.clone()); + } + "EFFECT" => { + shadows.insert(token, style.value.clone()); + } + _ => {} + } + } + + 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 snapshot.local_complete { + Completeness::FullLocalPlusUsedRemote + } else if !snapshot.variables.is_empty() || !snapshot.used_remote_variables.is_empty() { + Completeness::UsedTokens + } else { + Completeness::ResolvedValuesOnly + }; + Ok(ThemeOutput { + json: output, + counts: ThemeCounts { + collections: snapshot.collections.len(), + variables: snapshot.variables.len() + snapshot.used_remote_variables.len(), + styles: snapshot.styles.len(), + modes: snapshot + .collections + .iter() + .map(|collection| collection.modes.len()) + .sum(), + }, + completeness, + diagnostics, + }) +} + +fn resolve_value<'a>( + variable: &'a VariableDefinition, + mode: &str, + variables: &'a HashMap<&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/src/theme/mod.rs b/src/theme/mod.rs new file mode 100644 index 0000000..af48ad9 --- /dev/null +++ b/src/theme/mod.rs @@ -0,0 +1,7 @@ +mod devup_json; +mod tokens; + +pub use devup_json::{ + Completeness, ThemeCounts, ThemeOutput, ThemeScope, VariableCollection, VariableDefinition, + VariableSnapshot, VariableStyle, generate_devup_json, +}; diff --git a/src/theme/tokens.rs b/src/theme/tokens.rs new file mode 100644 index 0000000..357284f --- /dev/null +++ b/src/theme/tokens.rs @@ -0,0 +1,36 @@ +pub(super) 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(super) 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/tests/theme.rs b/tests/theme.rs new file mode 100644 index 0000000..0ae9035 --- /dev/null +++ b/tests/theme.rs @@ -0,0 +1,116 @@ +use devup_mcp::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 + })) + .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 + })) + .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\"")); +} From f927f9f77f85aabd7d7f7f5f44fb0eee262874e7 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:25:10 +0900 Subject: [PATCH 10/97] feat: wire Figma conversion tools --- src/figma/scripts/variables.js | 3 +- src/server/mod.rs | 216 +++++++++++++++++++++++++++----- src/theme/devup_json.rs | 44 ++++++- src/theme/mod.rs | 2 +- tests/downstream_integration.rs | 137 ++++++++++++++++++++ tests/theme.rs | 5 +- 6 files changed, 373 insertions(+), 34 deletions(-) create mode 100644 tests/downstream_integration.rs diff --git a/src/figma/scripts/variables.js b/src/figma/scripts/variables.js index 47f1812..f8813c5 100644 --- a/src/figma/scripts/variables.js +++ b/src/figma/scripts/variables.js @@ -51,5 +51,6 @@ return { variables, styles, usedRemoteVariables: [], - localComplete: true + localComplete: true, + usedRemoteComplete: false }; diff --git a/src/server/mod.rs b/src/server/mod.rs index 8d06f75..1e618d3 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,66 +1,226 @@ mod tools; +use std::sync::Arc; + +use async_trait::async_trait; use rmcp::{ - ServerHandler, - handler::server::router::tool::ToolRouter, - model::{ServerCapabilities, ServerInfo}, + ErrorData, ServerHandler, + handler::server::{ + router::tool::ToolRouter, + wrapper::{Json, Parameters}, + }, + model::{ErrorCode as McpErrorCode, ServerCapabilities, ServerInfo}, tool, tool_handler, tool_router, }; +use serde_json::{Value, json}; + +use crate::{ + codegen::{CodegenOptions, generate_component}, + figma::{ + AuthStatus, BuiltinScript, CredentialStore, DevupError, FigmaTarget, FigmaUpstream, + KeyringCredentialStore, OAuthManager, ReadToolCall, RemoteFigmaClient, SystemBrowser, + merge_chunks, snapshot_chunk_from_result, + }, + theme::{ThemeScope, generate_devup_json, variable_snapshot_from_result}, +}; pub use tools::{AuthInput, 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, } -impl Default for DevupServer { - fn default() -> Self { +impl DevupServer { + pub fn new(services: Services) -> Self { Self { tool_router: Self::tool_router(), + services, } } } +impl Default for DevupServer { + fn default() -> Self { + Self::new(Services::production()) + } +} + #[tool_router] impl DevupServer { - #[tool(description = "Authenticate devup-mcp with Figma Remote MCP")] + #[tool(description = "Check, start, or clear Figma Remote MCP OAuth")] async fn devup_figma_auth( &self, - rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< - AuthInput, - >, - ) -> String { - format!("Figma auth action '{}' is not connected yet", input.action) + Parameters(input): Parameters, + ) -> Result, ErrorData> { + 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( + crate::figma::ErrorCode::DevupAuthRequired, + "action은 status, login 또는 logout이어야 합니다.", + false, + ))); + } + } + .map_err(to_mcp_error)?; + Ok(Json(json!({ "status": status }))) } - #[tool(description = "Convert a Figma design link to DevupUI TypeScript")] + #[tool(description = "Convert a Figma design link to deterministic DevupUI TypeScript")] async fn devup_figma_to_ui( &self, - rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< - FigmaToUiInput, - >, - ) -> String { - format!( - "Figma UI conversion for '{}' is not connected yet", - input.url + Parameters(input): Parameters, + ) -> Result, ErrorData> { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + let node_id = target.node_id.clone().ok_or_else(|| { + to_mcp_error(DevupError::new( + crate::figma::ErrorCode::DevupFigmaNodeNotFound, + "UI 변환 링크에는 node-id가 필요합니다.", + false, + )) + })?; + let result = self + .services + .upstream + .call_read_tool(ReadToolCall::snapshot( + &target.file_key, + &node_id, + BuiltinScript::NodeSnapshot, + )) + .await + .map_err(to_mcp_error)?; + let chunk = snapshot_chunk_from_result(&result).map_err(to_mcp_error)?; + let snapshot = merge_chunks(vec![chunk]).map_err(to_mcp_error)?; + let output = generate_component( + &snapshot, + &node_id, + &CodegenOptions { + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + }, ) + .map_err(to_mcp_error)?; + let diagnostics = if input.include_diagnostics { + output.diagnostics + } else { + Vec::new() + }; + Ok(Json(json!({ + "tsx": output.tsx, + "imports": output.imports, + "usedTokens": output.used_tokens, + "diagnostics": diagnostics, + "source": { "fileKey": target.file_key, "nodeId": node_id, "version": snapshot.version }, + "snapshot": { + "preservedNodeCount": snapshot.nodes.len(), + "fieldErrorCount": snapshot.nodes.values().map(|node| node.field_errors.len()).sum::() + } + }))) } - #[tool(description = "Convert Figma variables to devup.json")] + #[tool(description = "Convert Figma variables and styles to deterministic devup.json")] async fn devup_figma_to_json( &self, - rmcp::handler::server::wrapper::Parameters(input): rmcp::handler::server::wrapper::Parameters< - FigmaToJsonInput, - >, - ) -> String { - format!( - "Figma theme conversion for '{}' is not connected yet", - input.url - ) + Parameters(input): Parameters, + ) -> Result, ErrorData> { + let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; + let scope = parse_scope(&input.scope).map_err(to_mcp_error)?; + let result = self + .services + .upstream + .call_read_tool(ReadToolCall::snapshot( + &target.file_key, + target.node_id.as_deref().unwrap_or("0:0"), + BuiltinScript::LocalVariables, + )) + .await + .map_err(to_mcp_error)?; + let variables = variable_snapshot_from_result(&result).map_err(to_mcp_error)?; + let output = generate_devup_json(&variables, scope).map_err(to_mcp_error)?; + let diagnostics = if input.include_diagnostics { + output.diagnostics + } else { + Vec::new() + }; + Ok(Json(json!({ + "devupJson": output.json, + "counts": output.counts, + "completeness": output.completeness, + "diagnostics": diagnostics, + "source": { "fileKey": target.file_key, "nodeId": target.node_id } + }))) } } +fn parse_scope(scope: &str) -> Result { + match scope { + "node" => Ok(ThemeScope::Node), + "page" => Ok(ThemeScope::Page), + "file" => Ok(ThemeScope::File), + _ => Err(DevupError::new( + crate::figma::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 { diff --git a/src/theme/devup_json.rs b/src/theme/devup_json.rs index 2152061..6d88bb2 100644 --- a/src/theme/devup_json.rs +++ b/src/theme/devup_json.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value, json}; -use crate::figma::{DevupError, Diagnostic, ErrorCode}; +use crate::figma::{DevupError, Diagnostic, ErrorCode, UpstreamResult}; use super::tokens::{normalize_token, variable_token}; @@ -83,6 +83,8 @@ pub struct VariableSnapshot { pub used_remote_variables: Vec, #[serde(default)] pub local_complete: bool, + #[serde(default)] + pub used_remote_complete: bool, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -194,7 +196,7 @@ pub fn generate_devup_json( })?; output.push('\n'); - let completeness = if snapshot.local_complete { + let completeness = if snapshot.local_complete && snapshot.used_remote_complete { Completeness::FullLocalPlusUsedRemote } else if !snapshot.variables.is_empty() || !snapshot.used_remote_variables.is_empty() { Completeness::UsedTokens @@ -218,6 +220,44 @@ pub fn generate_devup_json( }) } +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, diff --git a/src/theme/mod.rs b/src/theme/mod.rs index af48ad9..10bdc3b 100644 --- a/src/theme/mod.rs +++ b/src/theme/mod.rs @@ -3,5 +3,5 @@ mod tokens; pub use devup_json::{ Completeness, ThemeCounts, ThemeOutput, ThemeScope, VariableCollection, VariableDefinition, - VariableSnapshot, VariableStyle, generate_devup_json, + VariableSnapshot, VariableStyle, generate_devup_json, variable_snapshot_from_result, }; diff --git a/tests/downstream_integration.rs b/tests/downstream_integration.rs new file mode 100644 index 0000000..7957489 --- /dev/null +++ b/tests/downstream_integration.rs @@ -0,0 +1,137 @@ +use std::sync::Arc; + +use async_trait::async_trait; +use devup_mcp::{ + figma::{AuthStatus, DevupError, FigmaUpstream, ReadToolCall, UpstreamResult}, + server::{DevupAuth, DevupServer, Services}, +}; +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::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}, + "extra": {"futureField": true}, "fieldErrors": {} + }], "diagnostics": [] + }) + } + ReadToolCall::Snapshot { .. } => 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": [], "usedRemoteVariables": [], "localComplete": true, "usedRemoteComplete": false + }), + _ => { + 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 { + let server = DevupServer::new(Services::new( + Arc::new(ConnectedAuth), + Arc::new(FixtureUpstream), + )); + 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")) +} + +#[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!( + result["tsx"] + .as_str() + .unwrap() + .contains("export function Proofread") + ); + assert_eq!(result["source"]["nodeId"], "3879:35481"); + assert_eq!(result["snapshot"]["preservedNodeCount"], 1); + Ok(()) +} + +#[tokio::test] +async fn converts_figma_variables_to_structured_devup_json() -> anyhow::Result<()> { + let result = call_tool( + "devup_figma_to_json", + json!({ + "url": "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Name?node-id=3879-35481", + "scope": "file", + "includeDiagnostics": true + }), + ) + .await?; + + assert!( + result["devupJson"] + .as_str() + .unwrap() + .contains("\"primary\"") + ); + assert_eq!(result["completeness"], "used-tokens"); + Ok(()) +} diff --git a/tests/theme.rs b/tests/theme.rs index 0ae9035..87825c5 100644 --- a/tests/theme.rs +++ b/tests/theme.rs @@ -42,7 +42,8 @@ fn maps_variables_modes_aliases_and_styles_to_devup_json() { {"id": "style:effect", "name": "Elevation/Card", "styleType": "EFFECT", "value": "0 4px 12px #0000001a"} ], "usedRemoteVariables": [], - "localComplete": true + "localComplete": true, + "usedRemoteComplete": true })) .expect("variable snapshot"); @@ -100,7 +101,7 @@ fn reports_alias_cycles_instead_of_inventing_values() { {"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 + "styles": [], "usedRemoteVariables": [], "localComplete": true, "usedRemoteComplete": true })) .unwrap(); From 27ffe5ae7d1c5dd192589ba4615705436a849eeb Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:41:46 +0900 Subject: [PATCH 11/97] refactor: split devup-mcp into workspace crates --- .../changepack_log_figma_remote_mcp.json | 9 ++ .changepacks/config.json | 5 + .github/workflows/ci.yml | 6 +- Cargo.lock | 35 ++++-- Cargo.toml | 20 ++-- README.md | 107 +++++++++++++++++- crates/devup-mcp-devup-ui/Cargo.toml | 16 +++ .../src}/codegen/component.rs | 2 +- .../devup-mcp-devup-ui/src}/codegen/layout.rs | 2 +- .../devup-mcp-devup-ui/src}/codegen/mod.rs | 0 .../devup-mcp-devup-ui/src}/codegen/style.rs | 2 +- .../devup-mcp-devup-ui/src}/codegen/text.rs | 2 +- crates/devup-mcp-devup-ui/src/lib.rs | 2 + .../src}/theme/devup_json.rs | 2 +- .../devup-mcp-devup-ui/src}/theme/mod.rs | 0 .../devup-mcp-devup-ui/src}/theme/tokens.rs | 0 .../devup-mcp-devup-ui/tests}/codegen.rs | 8 +- .../devup-mcp-devup-ui/tests}/theme.rs | 2 +- crates/devup-mcp-figma/Cargo.toml | 28 +++++ .../devup-mcp-figma/src}/credentials.rs | 0 .../devup-mcp-figma/src}/errors.rs | 0 .../devup-mcp-figma/src/lib.rs | 0 .../devup-mcp-figma/src}/oauth.rs | 0 .../src}/plugin_api_manifest.json | 0 .../devup-mcp-figma/src}/scripts/snapshot.js | 0 .../devup-mcp-figma/src}/scripts/variables.js | 0 .../devup-mcp-figma/src}/snapshot.rs | 0 .../devup-mcp-figma/src}/upstream.rs | 0 .../devup-mcp-figma/src}/url.rs | 0 .../devup-mcp-figma/tests}/figma_url.rs | 2 +- .../devup-mcp-figma/tests}/oauth_flow.rs | 4 +- .../devup-mcp-figma/tests}/snapshot.rs | 2 +- .../tests}/upstream_contract.rs | 2 +- crates/devup-mcp/Cargo.toml | 24 ++++ {src => crates/devup-mcp/src}/lib.rs | 3 - {src => crates/devup-mcp/src}/main.rs | 0 {src => crates/devup-mcp/src}/server/mod.rs | 27 +++-- {src => crates/devup-mcp/src}/server/tools.rs | 0 .../tests}/downstream_integration.rs | 65 +++++++++-- .../devup-mcp/tests}/stdio_tools.rs | 0 .../plans/2026-08-30-figma-remote-mcp.md | 6 +- .../2026-08-30-figma-remote-mcp-design.md | 42 ++----- 42 files changed, 332 insertions(+), 93 deletions(-) create mode 100644 .changepacks/changepack_log_figma_remote_mcp.json create mode 100644 .changepacks/config.json create mode 100644 crates/devup-mcp-devup-ui/Cargo.toml rename {src => crates/devup-mcp-devup-ui/src}/codegen/component.rs (98%) rename {src => crates/devup-mcp-devup-ui/src}/codegen/layout.rs (97%) rename {src => crates/devup-mcp-devup-ui/src}/codegen/mod.rs (100%) rename {src => crates/devup-mcp-devup-ui/src}/codegen/style.rs (97%) rename {src => crates/devup-mcp-devup-ui/src}/codegen/text.rs (96%) create mode 100644 crates/devup-mcp-devup-ui/src/lib.rs rename {src => crates/devup-mcp-devup-ui/src}/theme/devup_json.rs (99%) rename {src => crates/devup-mcp-devup-ui/src}/theme/mod.rs (100%) rename {src => crates/devup-mcp-devup-ui/src}/theme/tokens.rs (100%) rename {tests => crates/devup-mcp-devup-ui/tests}/codegen.rs (94%) rename {tests => crates/devup-mcp-devup-ui/tests}/theme.rs (97%) create mode 100644 crates/devup-mcp-figma/Cargo.toml rename {src/figma => crates/devup-mcp-figma/src}/credentials.rs (100%) rename {src/figma => crates/devup-mcp-figma/src}/errors.rs (100%) rename src/figma/mod.rs => crates/devup-mcp-figma/src/lib.rs (100%) rename {src/figma => crates/devup-mcp-figma/src}/oauth.rs (100%) rename {src/figma => crates/devup-mcp-figma/src}/plugin_api_manifest.json (100%) rename {src/figma => crates/devup-mcp-figma/src}/scripts/snapshot.js (100%) rename {src/figma => crates/devup-mcp-figma/src}/scripts/variables.js (100%) rename {src/figma => crates/devup-mcp-figma/src}/snapshot.rs (100%) rename {src/figma => crates/devup-mcp-figma/src}/upstream.rs (100%) rename {src/figma => crates/devup-mcp-figma/src}/url.rs (100%) rename {tests => crates/devup-mcp-figma/tests}/figma_url.rs (98%) rename {tests => crates/devup-mcp-figma/tests}/oauth_flow.rs (99%) rename {tests => crates/devup-mcp-figma/tests}/snapshot.rs (99%) rename {tests => crates/devup-mcp-figma/tests}/upstream_contract.rs (96%) create mode 100644 crates/devup-mcp/Cargo.toml rename {src => crates/devup-mcp/src}/lib.rs (84%) rename {src => crates/devup-mcp/src}/main.rs (100%) rename {src => crates/devup-mcp/src}/server/mod.rs (90%) rename {src => crates/devup-mcp/src}/server/tools.rs (100%) rename {tests => crates/devup-mcp/tests}/downstream_integration.rs (71%) rename {tests => crates/devup-mcp/tests}/stdio_tools.rs (100%) diff --git a/.changepacks/changepack_log_figma_remote_mcp.json b/.changepacks/changepack_log_figma_remote_mcp.json new file mode 100644 index 0000000..3198e5f --- /dev/null +++ b/.changepacks/changepack_log_figma_remote_mcp.json @@ -0,0 +1,9 @@ +{ + "changes": { + "crates/devup-mcp/Cargo.toml": "Minor", + "crates/devup-mcp-figma/Cargo.toml": "Minor", + "crates/devup-mcp-devup-ui/Cargo.toml": "Minor" + }, + "note": "Add private Figma Remote MCP OAuth, exhaustive snapshots, DevupUI TSX, and devup.json generation", + "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 index e0622eb..5d11953 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,6 @@ jobs: components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 - run: cargo fmt --all -- --check - - run: cargo clippy --all-targets --all-features -- -D warnings - - run: cargo test --all-features - - run: cargo build --release + - run: cargo clippy --workspace --all-targets --all-features -- -D warnings + - run: cargo test --workspace --all-features + - run: cargo build --workspace --release diff --git a/Cargo.lock b/Cargo.lock index e9dc9d5..12d24d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -561,27 +561,49 @@ dependencies = [ [[package]] name = "devup-mcp" version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "devup-mcp-devup-ui", + "devup-mcp-figma", + "reqwest 0.12.28", + "rmcp", + "schemars", + "serde", + "serde_json", + "tokio", + "tracing-subscriber", +] + +[[package]] +name = "devup-mcp-devup-ui" +version = "0.1.0" +dependencies = [ + "devup-mcp-figma", + "pretty_assertions", + "serde", + "serde_json", +] + +[[package]] +name = "devup-mcp-figma" +version = "0.1.0" dependencies = [ "anyhow", "async-trait", "axum", "base64 0.22.1", "keyring", - "oauth2", - "pretty_assertions", "rand 0.9.5", "reqwest 0.12.28", "rmcp", - "schemars", "serde", "serde_json", "sha2 0.10.9", "subtle", "tempfile", - "thiserror 2.0.20", "tokio", - "tracing", - "tracing-subscriber", "url", "webbrowser", ] @@ -1486,7 +1508,6 @@ dependencies = [ "getrandom 0.2.17", "http", "rand 0.8.8", - "reqwest 0.12.28", "serde", "serde_json", "serde_path_to_error", diff --git a/Cargo.toml b/Cargo.toml index 3b5e8f9..cf21aca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,19 +1,24 @@ -[package] -name = "devup-mcp" +[workspace] +members = [ + "crates/devup-mcp", + "crates/devup-mcp-figma", + "crates/devup-mcp-devup-ui", +] +resolver = "3" + +[workspace.package] version = "0.1.0" edition = "2024" rust-version = "1.88" license = "MIT" -description = "Rust-native MCP server for Figma to DevupUI workflows" repository = "https://github.com/dev-five-git/devup-mcp" -[dependencies] +[workspace.dependencies] anyhow = "1" async-trait = "0.1" axum = "0.8" base64 = "0.22" keyring = "4.2" -oauth2 = { version = "5", default-features = false, features = ["reqwest", "rustls-tls"] } rand = "0.9" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } rmcp = { version = "3.1", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] } @@ -22,17 +27,12 @@ serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } sha2 = "0.10" subtle = "2" -thiserror = "2" tokio = { version = "1", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } url = "2" webbrowser = "1" -[dev-dependencies] -pretty_assertions = "1" -tempfile = "3" - [profile.release] lto = "thin" strip = true diff --git a/README.md b/README.md index c02a7cf..0a3144b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,108 @@ # 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`로 구성됩니다. 별도 IR/auth/server crate 없이 제품 설치 단위는 `devup-mcp` 하나입니다. + +## 현재 제공 기능 + +- `devup_figma_auth`: Figma 연결 상태 확인, 브라우저 OAuth 로그인, 로그아웃 +- `devup_figma_to_ui`: Figma node 링크를 `@devup-ui/react` TSX로 변환 +- `devup_figma_to_json`: Figma 변수와 로컬 스타일을 `devup.json`으로 변환 +- Figma Plugin API의 readable data property를 raw JSON으로 보존하고, 알려지지 않은 runtime field는 `extra`, 실패한 getter는 `fieldErrors`로 유지 + +Figma PAT, 사용자가 만든 OAuth app, 내장 client secret은 필요하지 않습니다. Figma Remote MCP의 OAuth discovery, Dynamic Client Registration, PKCE S256과 일시적인 `127.0.0.1` callback을 사용합니다. + +## 빌드와 설치 + +Rust 1.88 이상이 필요합니다. + +```bash +cargo install --git https://github.com/dev-five-git/devup-mcp.git --branch owjs3901/figma-remote-mcp --package devup-mcp +``` + +소스에서 검증하려면 다음을 실행합니다. + +```bash +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace --all-features +cargo build --workspace --release +``` + +## MCP 설정 + +stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. + +```json +{ + "mcpServers": { + "devup-mcp": { + "command": "devup-mcp" + } + } +} +``` + +최초 `devup_figma_auth`의 `login` 호출 또는 인증이 필요한 변환 호출에서 시스템 브라우저로 Figma 승인을 완료합니다. 인증 정보는 운영체제 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 +} +``` + +결과에는 `tsx`, import 목록, 사용된 token, source 식별자, 보존한 node 수와 fallback diagnostics가 포함됩니다. Auto Layout은 `Flex`, 일반 container는 `Box`, text는 `Text`로 변환하고 theme binding이 있으면 JSX prop에서 `$token`을 우선 사용합니다. + +### Figma → devup.json + +```json +{ + "url": "https://www.figma.com/design//?node-id=1-2", + "scope": "file", + "includeDiagnostics": true +} +``` + +결과는 `theme.colors`, `theme.typography`, `theme.length`, `theme.shadow`를 포함하는 결정적 JSON 문자열과 counts, completeness를 반환합니다. + +완전성 등급은 다음과 같습니다. + +- `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 write tool을 호출하지 않습니다. +- stdout에는 MCP frame만 출력하고 trace는 stderr로 보냅니다. +- access token, refresh token, OAuth code, PKCE verifier는 Debug, trace와 MCP error에 포함하지 않습니다. +- Figma snapshot과 screenshot을 기본적으로 디스크에 저장하지 않습니다. +- test fixture는 합성 데이터만 사용합니다. + +## Snapshot 의미와 현재 한계 + +Figma Remote MCP에서는 `JSON_REST_V1` export가 허용되지 않으므로 host object를 그대로 REST JSON으로 만들 수 없습니다. 대신 checked-in property manifest와 runtime prototype/enumerable 탐색을 함께 사용해 모든 읽을 수 있는 data field를 보존합니다. 함수, 순환 node object는 제외하거나 id로 바꾸고, binary asset은 bytes 대신 metadata로 나타내며, 타 plugin private data와 오류를 내는 getter는 읽을 수 없습니다. + +현재 private MVP의 남은 한계는 다음과 같습니다. + +- 큰 page/file snapshot의 metadata 기반 chunk fan-out은 후속 최적화가 필요합니다. +- 사용되지 않은 외부 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..5e178c0 --- /dev/null +++ b/crates/devup-mcp-devup-ui/Cargo.toml @@ -0,0 +1,16 @@ +[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" } +serde.workspace = true +serde_json.workspace = true + +[dev-dependencies] +pretty_assertions = "1" diff --git a/src/codegen/component.rs b/crates/devup-mcp-devup-ui/src/codegen/component.rs similarity index 98% rename from src/codegen/component.rs rename to crates/devup-mcp-devup-ui/src/codegen/component.rs index 1c9e264..8709eeb 100644 --- a/src/codegen/component.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/component.rs @@ -1,6 +1,6 @@ use std::collections::{BTreeSet, HashSet}; -use crate::figma::{DevupError, Diagnostic, ErrorCode, RawNode, Snapshot}; +use devup_mcp_figma::{DevupError, Diagnostic, ErrorCode, RawNode, Snapshot}; use super::{layout, style, text}; diff --git a/src/codegen/layout.rs b/crates/devup-mcp-devup-ui/src/codegen/layout.rs similarity index 97% rename from src/codegen/layout.rs rename to crates/devup-mcp-devup-ui/src/codegen/layout.rs index e8ef9fa..519b7a1 100644 --- a/src/codegen/layout.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/layout.rs @@ -1,4 +1,4 @@ -use crate::figma::TypedNode; +use devup_mcp_figma::TypedNode; pub(super) fn push_layout_props(view: &TypedNode<'_>, props: &mut Vec) { push_px(view, props, "width", "w"); diff --git a/src/codegen/mod.rs b/crates/devup-mcp-devup-ui/src/codegen/mod.rs similarity index 100% rename from src/codegen/mod.rs rename to crates/devup-mcp-devup-ui/src/codegen/mod.rs diff --git a/src/codegen/style.rs b/crates/devup-mcp-devup-ui/src/codegen/style.rs similarity index 97% rename from src/codegen/style.rs rename to crates/devup-mcp-devup-ui/src/codegen/style.rs index 7b68cfd..fae4856 100644 --- a/src/codegen/style.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/style.rs @@ -2,7 +2,7 @@ use std::collections::BTreeSet; use serde_json::Value; -use crate::figma::TypedNode; +use devup_mcp_figma::TypedNode; pub(super) fn push_style_props( view: &TypedNode<'_>, diff --git a/src/codegen/text.rs b/crates/devup-mcp-devup-ui/src/codegen/text.rs similarity index 96% rename from src/codegen/text.rs rename to crates/devup-mcp-devup-ui/src/codegen/text.rs index 051ed7c..0c31af0 100644 --- a/src/codegen/text.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/text.rs @@ -1,6 +1,6 @@ use serde_json::Value; -use crate::figma::TypedNode; +use devup_mcp_figma::TypedNode; use super::layout::px; 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..ed9b69c --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/lib.rs @@ -0,0 +1,2 @@ +pub mod codegen; +pub mod theme; diff --git a/src/theme/devup_json.rs b/crates/devup-mcp-devup-ui/src/theme/devup_json.rs similarity index 99% rename from src/theme/devup_json.rs rename to crates/devup-mcp-devup-ui/src/theme/devup_json.rs index 6d88bb2..0663860 100644 --- a/src/theme/devup_json.rs +++ b/crates/devup-mcp-devup-ui/src/theme/devup_json.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use serde::{Deserialize, Serialize}; use serde_json::{Map, Value, json}; -use crate::figma::{DevupError, Diagnostic, ErrorCode, UpstreamResult}; +use devup_mcp_figma::{DevupError, Diagnostic, ErrorCode, UpstreamResult}; use super::tokens::{normalize_token, variable_token}; diff --git a/src/theme/mod.rs b/crates/devup-mcp-devup-ui/src/theme/mod.rs similarity index 100% rename from src/theme/mod.rs rename to crates/devup-mcp-devup-ui/src/theme/mod.rs diff --git a/src/theme/tokens.rs b/crates/devup-mcp-devup-ui/src/theme/tokens.rs similarity index 100% rename from src/theme/tokens.rs rename to crates/devup-mcp-devup-ui/src/theme/tokens.rs diff --git a/tests/codegen.rs b/crates/devup-mcp-devup-ui/tests/codegen.rs similarity index 94% rename from tests/codegen.rs rename to crates/devup-mcp-devup-ui/tests/codegen.rs index f747884..56c4a98 100644 --- a/tests/codegen.rs +++ b/crates/devup-mcp-devup-ui/tests/codegen.rs @@ -1,11 +1,9 @@ -use devup_mcp::{ - codegen::{CodegenOptions, generate_component, normalize_component_name}, - figma::{SnapshotChunk, merge_chunks}, -}; +use devup_mcp_devup_ui::codegen::{CodegenOptions, 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 { +fn snapshot() -> devup_mcp_figma::Snapshot { let chunk: SnapshotChunk = serde_json::from_value(json!({ "fileKey": "file-key", "version": "1", diff --git a/tests/theme.rs b/crates/devup-mcp-devup-ui/tests/theme.rs similarity index 97% rename from tests/theme.rs rename to crates/devup-mcp-devup-ui/tests/theme.rs index 87825c5..0520d40 100644 --- a/tests/theme.rs +++ b/crates/devup-mcp-devup-ui/tests/theme.rs @@ -1,4 +1,4 @@ -use devup_mcp::theme::{Completeness, ThemeScope, VariableSnapshot, generate_devup_json}; +use devup_mcp_devup_ui::theme::{Completeness, ThemeScope, VariableSnapshot, generate_devup_json}; use pretty_assertions::assert_eq; use serde_json::json; diff --git a/crates/devup-mcp-figma/Cargo.toml b/crates/devup-mcp-figma/Cargo.toml new file mode 100644 index 0000000..1b254f2 --- /dev/null +++ b/crates/devup-mcp-figma/Cargo.toml @@ -0,0 +1,28 @@ +[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 +keyring.workspace = true +rand.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 +webbrowser.workspace = true + +[dev-dependencies] +anyhow.workspace = true +tempfile = "3" diff --git a/src/figma/credentials.rs b/crates/devup-mcp-figma/src/credentials.rs similarity index 100% rename from src/figma/credentials.rs rename to crates/devup-mcp-figma/src/credentials.rs diff --git a/src/figma/errors.rs b/crates/devup-mcp-figma/src/errors.rs similarity index 100% rename from src/figma/errors.rs rename to crates/devup-mcp-figma/src/errors.rs diff --git a/src/figma/mod.rs b/crates/devup-mcp-figma/src/lib.rs similarity index 100% rename from src/figma/mod.rs rename to crates/devup-mcp-figma/src/lib.rs diff --git a/src/figma/oauth.rs b/crates/devup-mcp-figma/src/oauth.rs similarity index 100% rename from src/figma/oauth.rs rename to crates/devup-mcp-figma/src/oauth.rs diff --git a/src/figma/plugin_api_manifest.json b/crates/devup-mcp-figma/src/plugin_api_manifest.json similarity index 100% rename from src/figma/plugin_api_manifest.json rename to crates/devup-mcp-figma/src/plugin_api_manifest.json diff --git a/src/figma/scripts/snapshot.js b/crates/devup-mcp-figma/src/scripts/snapshot.js similarity index 100% rename from src/figma/scripts/snapshot.js rename to crates/devup-mcp-figma/src/scripts/snapshot.js diff --git a/src/figma/scripts/variables.js b/crates/devup-mcp-figma/src/scripts/variables.js similarity index 100% rename from src/figma/scripts/variables.js rename to crates/devup-mcp-figma/src/scripts/variables.js diff --git a/src/figma/snapshot.rs b/crates/devup-mcp-figma/src/snapshot.rs similarity index 100% rename from src/figma/snapshot.rs rename to crates/devup-mcp-figma/src/snapshot.rs diff --git a/src/figma/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs similarity index 100% rename from src/figma/upstream.rs rename to crates/devup-mcp-figma/src/upstream.rs diff --git a/src/figma/url.rs b/crates/devup-mcp-figma/src/url.rs similarity index 100% rename from src/figma/url.rs rename to crates/devup-mcp-figma/src/url.rs diff --git a/tests/figma_url.rs b/crates/devup-mcp-figma/tests/figma_url.rs similarity index 98% rename from tests/figma_url.rs rename to crates/devup-mcp-figma/tests/figma_url.rs index 0b0a168..c09a3c4 100644 --- a/tests/figma_url.rs +++ b/crates/devup-mcp-figma/tests/figma_url.rs @@ -1,4 +1,4 @@ -use devup_mcp::figma::{ErrorCode, FigmaTarget}; +use devup_mcp_figma::{ErrorCode, FigmaTarget}; #[test] fn parses_design_link_and_normalizes_dash_node_id() { diff --git a/tests/oauth_flow.rs b/crates/devup-mcp-figma/tests/oauth_flow.rs similarity index 99% rename from tests/oauth_flow.rs rename to crates/devup-mcp-figma/tests/oauth_flow.rs index 2c0a468..522f007 100644 --- a/tests/oauth_flow.rs +++ b/crates/devup-mcp-figma/tests/oauth_flow.rs @@ -5,7 +5,7 @@ use axum::{ extract::{Form, State}, routing::{get, post}, }; -use devup_mcp::figma::{ +use devup_mcp_figma::{ AuthStatus, BrowserOpener, CredentialStore, MemoryCredentialStore, OAuthManager, }; use serde_json::{Value, json}; @@ -67,7 +67,7 @@ async fn token( struct CallbackOpener; impl BrowserOpener for CallbackOpener { - fn open(&self, authorization_url: &str) -> Result<(), devup_mcp::figma::DevupError> { + 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(); diff --git a/tests/snapshot.rs b/crates/devup-mcp-figma/tests/snapshot.rs similarity index 99% rename from tests/snapshot.rs rename to crates/devup-mcp-figma/tests/snapshot.rs index 2cfd4d2..ab32370 100644 --- a/tests/snapshot.rs +++ b/crates/devup-mcp-figma/tests/snapshot.rs @@ -1,4 +1,4 @@ -use devup_mcp::figma::{ +use devup_mcp_figma::{ ErrorCode, RawNode, Snapshot, SnapshotChunk, UpstreamResult, merge_chunks, snapshot_chunk_from_result, }; diff --git a/tests/upstream_contract.rs b/crates/devup-mcp-figma/tests/upstream_contract.rs similarity index 96% rename from tests/upstream_contract.rs rename to crates/devup-mcp-figma/tests/upstream_contract.rs index d019c38..fd12b03 100644 --- a/tests/upstream_contract.rs +++ b/crates/devup-mcp-figma/tests/upstream_contract.rs @@ -1,4 +1,4 @@ -use devup_mcp::figma::{BuiltinScript, ReadToolCall}; +use devup_mcp_figma::{BuiltinScript, ReadToolCall}; #[test] fn maps_every_read_call_to_the_fixed_figma_tool_contract() { diff --git a/crates/devup-mcp/Cargo.toml b/crates/devup-mcp/Cargo.toml new file mode 100644 index 0000000..9350cd3 --- /dev/null +++ b/crates/devup-mcp/Cargo.toml @@ -0,0 +1,24 @@ +[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 +devup-mcp-devup-ui = { path = "../devup-mcp-devup-ui" } +devup-mcp-figma = { path = "../devup-mcp-figma" } +rmcp.workspace = true +schemars.workspace = true +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +tracing-subscriber.workspace = true + +[dev-dependencies] +axum.workspace = true +reqwest.workspace = true diff --git a/src/lib.rs b/crates/devup-mcp/src/lib.rs similarity index 84% rename from src/lib.rs rename to crates/devup-mcp/src/lib.rs index 4eb5d2e..f3ec74e 100644 --- a/src/lib.rs +++ b/crates/devup-mcp/src/lib.rs @@ -1,7 +1,4 @@ -pub mod codegen; -pub mod figma; pub mod server; -pub mod theme; pub async fn run_stdio() -> anyhow::Result<()> { use rmcp::ServiceExt; diff --git a/src/main.rs b/crates/devup-mcp/src/main.rs similarity index 100% rename from src/main.rs rename to crates/devup-mcp/src/main.rs diff --git a/src/server/mod.rs b/crates/devup-mcp/src/server/mod.rs similarity index 90% rename from src/server/mod.rs rename to crates/devup-mcp/src/server/mod.rs index 1e618d3..f950ff3 100644 --- a/src/server/mod.rs +++ b/crates/devup-mcp/src/server/mod.rs @@ -14,15 +14,15 @@ use rmcp::{ }; use serde_json::{Value, json}; -use crate::{ +use devup_mcp_devup_ui::{ codegen::{CodegenOptions, generate_component}, - figma::{ - AuthStatus, BuiltinScript, CredentialStore, DevupError, FigmaTarget, FigmaUpstream, - KeyringCredentialStore, OAuthManager, ReadToolCall, RemoteFigmaClient, SystemBrowser, - merge_chunks, snapshot_chunk_from_result, - }, theme::{ThemeScope, generate_devup_json, variable_snapshot_from_result}, }; +use devup_mcp_figma::{ + AuthStatus, BuiltinScript, CredentialStore, DevupError, ErrorCode, FigmaTarget, FigmaUpstream, + KeyringCredentialStore, OAuthManager, ReadToolCall, RemoteFigmaClient, SystemBrowser, + merge_chunks, snapshot_chunk_from_result, +}; pub use tools::{AuthInput, FigmaToJsonInput, FigmaToUiInput}; @@ -83,6 +83,13 @@ impl DevupServer { services, } } + + async fn ensure_authenticated(&self) -> Result<(), ErrorData> { + if self.services.auth.status().await.map_err(to_mcp_error)? == AuthStatus::Disconnected { + self.services.auth.login().await.map_err(to_mcp_error)?; + } + Ok(()) + } } impl Default for DevupServer { @@ -104,7 +111,7 @@ impl DevupServer { "logout" => self.services.auth.logout().await, _ => { return Err(to_mcp_error(DevupError::new( - crate::figma::ErrorCode::DevupAuthRequired, + ErrorCode::DevupAuthRequired, "action은 status, login 또는 logout이어야 합니다.", false, ))); @@ -122,11 +129,12 @@ impl DevupServer { let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; let node_id = target.node_id.clone().ok_or_else(|| { to_mcp_error(DevupError::new( - crate::figma::ErrorCode::DevupFigmaNodeNotFound, + ErrorCode::DevupFigmaNodeNotFound, "UI 변환 링크에는 node-id가 필요합니다.", false, )) })?; + self.ensure_authenticated().await?; let result = self .services .upstream @@ -173,6 +181,7 @@ impl DevupServer { ) -> Result, ErrorData> { let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; let scope = parse_scope(&input.scope).map_err(to_mcp_error)?; + self.ensure_authenticated().await?; let result = self .services .upstream @@ -206,7 +215,7 @@ fn parse_scope(scope: &str) -> Result { "page" => Ok(ThemeScope::Page), "file" => Ok(ThemeScope::File), _ => Err(DevupError::new( - crate::figma::ErrorCode::DevupThemeConflict, + ErrorCode::DevupThemeConflict, "scope는 node, page 또는 file이어야 합니다.", false, )), diff --git a/src/server/tools.rs b/crates/devup-mcp/src/server/tools.rs similarity index 100% rename from src/server/tools.rs rename to crates/devup-mcp/src/server/tools.rs diff --git a/tests/downstream_integration.rs b/crates/devup-mcp/tests/downstream_integration.rs similarity index 71% rename from tests/downstream_integration.rs rename to crates/devup-mcp/tests/downstream_integration.rs index 7957489..30eb03f 100644 --- a/tests/downstream_integration.rs +++ b/crates/devup-mcp/tests/downstream_integration.rs @@ -1,10 +1,11 @@ -use std::sync::Arc; +use std::sync::{ + Arc, + atomic::{AtomicUsize, Ordering}, +}; use async_trait::async_trait; -use devup_mcp::{ - figma::{AuthStatus, DevupError, FigmaUpstream, ReadToolCall, UpstreamResult}, - server::{DevupAuth, DevupServer, Services}, -}; +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}; @@ -38,7 +39,7 @@ impl FigmaUpstream for FixtureUpstream { async fn call_read_tool(&self, call: ReadToolCall) -> Result { let payload = match call { ReadToolCall::Snapshot { - script: devup_mcp::figma::BuiltinScript::NodeSnapshot, + script: devup_mcp_figma::BuiltinScript::NodeSnapshot, .. } => { json!({ @@ -59,8 +60,8 @@ impl FigmaUpstream for FixtureUpstream { "styles": [], "usedRemoteVariables": [], "localComplete": true, "usedRemoteComplete": false }), _ => { - return Err(devup_mcp::figma::DevupError::new( - devup_mcp::figma::ErrorCode::DevupSnapshotUnsupported, + return Err(devup_mcp_figma::DevupError::new( + devup_mcp_figma::ErrorCode::DevupSnapshotUnsupported, "unexpected test call", false, )); @@ -73,10 +74,15 @@ impl FigmaUpstream for FixtureUpstream { } async fn call_tool(name: &str, arguments: Value) -> anyhow::Result { - let server = DevupServer::new(Services::new( - Arc::new(ConnectedAuth), - Arc::new(FixtureUpstream), - )); + call_tool_with_auth(Arc::new(ConnectedAuth), name, arguments).await +} + +async fn call_tool_with_auth( + auth: Arc, + name: &str, + arguments: Value, +) -> anyhow::Result { + let server = DevupServer::new(Services::new(auth, Arc::new(FixtureUpstream))); let (server_transport, client_transport) = tokio::io::duplex(64 * 1024); let task = tokio::spawn(async move { server.serve(server_transport).await?.waiting().await?; @@ -92,6 +98,41 @@ async fn call_tool(name: &str, arguments: Value) -> anyhow::Result { Ok(result.structured_content.expect("structured tool output")) } +#[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_starts_oauth_when_credentials_are_missing() -> anyhow::Result<()> { + let auth = Arc::new(LoginAuth::default()); + 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!(auth.logins.load(Ordering::SeqCst), 1); + Ok(()) +} + #[tokio::test] async fn converts_a_figma_link_to_structured_devup_ui() -> anyhow::Result<()> { let result = call_tool( diff --git a/tests/stdio_tools.rs b/crates/devup-mcp/tests/stdio_tools.rs similarity index 100% rename from tests/stdio_tools.rs rename to crates/devup-mcp/tests/stdio_tools.rs diff --git a/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md index 0ae1e38..83e6b2a 100644 --- a/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md +++ b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md @@ -2,14 +2,16 @@ > **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 single Rust `devup-mcp` binary that authenticates to Figma Remote MCP, reads a linked design without modifying it, preserves an exhaustive node snapshot, and emits DevupUI TSX or `devup.json`. +**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:** `devup-mcp` is a downstream stdio MCP server and an upstream Streamable HTTP MCP client. A narrow Figma adapter owns OAuth, the read-only tool allowlist, snapshot collection and credential storage; deterministic codegen and theme modules consume raw-preserving snapshots without depending on a separate IR crate. +**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`. 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 index 8ebf27f..613cb50 100644 --- a/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md +++ b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md @@ -46,43 +46,25 @@ https://mcp.figma.com/mcp - REST Variables API의 Enterprise 플랜 제한 - Figma Desktop과 현재 열린 파일에 의존하는 문제 -### 단일 Rust package로 시작한다 +### Cargo workspace와 책임별 crate로 구성한다 -별도의 `devup-figma`, `devup-auth`, `devup-ir`, `devup-mcp-server` crate를 만들지 않는다. 현재 공개 단위와 실행 단위는 하나이므로 `devup-mcp` package 내부 모듈로 경계를 유지한다. +제품과 설치 이름은 계속 `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 -├─ src/ -│ ├─ main.rs -│ ├─ lib.rs -│ ├─ server/ -│ │ ├─ mod.rs -│ │ └─ tools.rs -│ ├─ figma/ -│ │ ├─ mod.rs -│ │ ├─ url.rs -│ │ ├─ upstream.rs -│ │ ├─ oauth.rs -│ │ ├─ credentials.rs -│ │ ├─ snapshot.rs -│ │ └─ errors.rs -│ ├─ codegen/ -│ │ ├─ mod.rs -│ │ ├─ component.rs -│ │ ├─ layout.rs -│ │ ├─ style.rs -│ │ └─ text.rs -│ └─ theme/ -│ ├─ mod.rs -│ ├─ tokens.rs -│ └─ devup_json.rs -└─ tests/ - ├─ fixtures/ - └─ integration/ +└─ 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 ``` -모듈 간 타입이 독립적으로 재사용되거나 빌드 feature 분리가 실제로 필요해질 때만 crate로 추출한다. +의존 방향은 `devup-mcp -> devup-mcp-devup-ui -> devup-mcp-figma`이며 실행 crate도 `devup-mcp-figma`를 직접 조합한다. 세 crate 사이에 순환 의존은 없다. ## OAuth 설계 From 15ff918925344d56565fe6d895f29c8c14e1ffc4 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 00:43:33 +0900 Subject: [PATCH 12/97] docs: fix workspace install command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a3144b..8d44ad5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Figma PAT, 사용자가 만든 OAuth app, 내장 client secret은 필요하지 Rust 1.88 이상이 필요합니다. ```bash -cargo install --git https://github.com/dev-five-git/devup-mcp.git --branch owjs3901/figma-remote-mcp --package devup-mcp +cargo install --git https://github.com/dev-five-git/devup-mcp.git --branch owjs3901/figma-remote-mcp devup-mcp ``` 소스에서 검증하려면 다음을 실행합니다. From 6b2cd3ae38895032d352c95b4b437e731b34baed Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 01:22:36 +0900 Subject: [PATCH 13/97] docs: specify figma fallback and parity corpus --- .../2026-08-30-figma-remote-mcp-design.md | 4 + ...08-31-figma-host-fallback-parity-design.md | 408 ++++++++++++++++++ 2 files changed, 412 insertions(+) create mode 100644 docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md 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 index 613cb50..b2465a0 100644 --- a/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md +++ b/docs/superpowers/specs/2026-08-30-figma-remote-mcp-design.md @@ -1,5 +1,9 @@ # devup-mcp Figma Remote MCP 설계 +> 이 문서는 최초 직접 연결 설계를 기록한 역사 문서다. Catalog 제약 대응과 +> `devup-figma-plugin` 전수 호환성 설계는 +> `2026-08-31-figma-host-fallback-parity-design.md`가 대체한다. + ## 상태 - 작성일: 2026-08-30 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..fb7368b --- /dev/null +++ b/docs/superpowers/specs/2026-08-31-figma-host-fallback-parity-design.md @@ -0,0 +1,408 @@ +# 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 +├─ compat/devup-figma-plugin/ # pinned corpus, manifest, coverage ledger +└─ scripts/compat/ # 개발/CI 전용 corpus 생성과 drift 확인 +``` + +프로덕션 바이너리는 Bun, Node.js 또는 JavaScript runtime에 의존하지 않는다. Bun은 +고정된 원본 저장소에서 호환성 corpus를 생성·검증하는 개발/CI 과정에서만 사용한다. +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_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의 내용이 충돌하면 추측하지 않고 오류로 반환한다. + +고정 `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 취향으로 출력 계약을 임의 변경하지 않는다. + +## JavaScript 전수 호환성 corpus + +### 원칙 + +`cargo insta`는 출력 snapshot gate로 사용하되 전수성 자체는 manifest/ledger가 +보장한다. snapshot을 승인하거나 갱신하는 행위는 호환성 변경이며 일반 테스트 실행이 +자동으로 기대값을 덮어쓰지 않는다. + +```text +compat/devup-figma-plugin/ +├─ manifest.json # 원본 URL/SHA, generator, 파일·케이스·snapshot 수, checksum +├─ ledger.json # 모든 upstream test ID와 분류/fixture/snapshot/rationale +├─ cases/ +│ ├─ codegen/*.json # normalized SceneNode/variables/options/expected metadata +│ ├─ responsive/*.json +│ ├─ devup-json/*.json +│ └─ helpers/*.json +└─ upstream-snapshots/ # 원본 268개 snapshot의 LF-normalized golden +``` + +모든 test ID는 `source-file + full suite path + parameterized case index`로 안정적으로 +식별한다. 이름이 같은 parameterized test도 index와 input checksum으로 구분한다. + +### 생성 방식 + +`scripts/compat/generate`는 별도 임시 디렉터리에 기준 SHA를 checkout하고 frozen Bun +install을 수행한다. 원본 파일은 수정하지 않는다. 생성기는 임시 checkout에 계측 +adapter를 적용해 실제 JavaScript 구현과 테스트를 실행하고 다음을 기록한다. + +- 테스트 러너가 발견·실행한 전체 test ID와 pass/fail/skip +- Codegen/ResponsiveCodegen 진입 시 직렬화 가능한 Figma node graph, variables, + styles, options 및 Figma API stub 결과 +- `getProps`, renderer, devup exporter 같은 순수 경계의 입력과 실제 반환/오류 +- download/UI/plugin API 경계에 전달된 payload +- 기존 `.snap`의 이름과 원문 기대값 + +계측은 fixture 생성 전용이며 생성 결과에 JavaScript 함수나 executable code를 넣지 +않는다. 함수형 Figma mock은 호출 결과와 오류를 data로 펼치고, parent/child/main +component 참조는 ID graph로 정규화한다. key와 배열 순서가 계약인 곳은 보존하고, +비결정적인 시간·임시 경로만 명시적으로 정규화한다. + +생성 후 동일 SHA에서 원본 `bun run test`가 다시 0 fail인지 검증한다. 계측 때문에 +원본 동작이 변하거나 같은 입력의 결과가 달라지면 corpus 생성을 실패시킨다. + +### 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에는 분류별 최소 목표 수를 하드코딩하지 않는다. 대신 발견한 test ID 집합과 +ledger ID 집합의 완전 일치, 모든 항목의 fixture 또는 rationale/test reference 존재, +중복 없음, referenced file/checksum 존재를 검증한다. 이 규칙으로 불편한 테스트를 +숫자 맞추기 없이 제외하는 것을 막는다. + +### insta 사용 + +`devup-mcp-devup-ui`의 compatibility integration test가 manifest를 읽어 모든 +`rust_snapshot` case를 변환한다. + +- TSX, component definitions, imports: `insta::assert_snapshot!` +- NodeTree, devup.json, diagnostics: `insta::assert_json_snapshot!` +- case ID를 snapshot name으로 사용해 원본 test까지 역추적 +- JSON은 object key 정렬, 문자열은 LF만 정규화 +- snapshot update는 `cargo insta review` 후 manifest checksum 재생성 필요 +- CI는 `cargo insta test`로 `.snap.new` 파일 존재와 unreviewed snapshot을 실패로 처리 + +기존 268개 upstream snapshot은 첫 corpus에서 전부 보존한다. snapshot이 없던 변환 +assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot 또는 assertion으로 +옮긴다. + +### drift 관리 + +- manifest에 원본 repository URL, commit SHA, Bun lockfile checksum과 generator version 저장 +- `compat verify`는 pinned SHA, case count, test ID set, snapshot count와 모든 checksum 검증 +- `compat regenerate --source --rev `로 의도적 업데이트 +- CI의 일반 job은 network 없이 committed corpus를 실행 +- 수동/정기 drift job은 원본 최신 SHA와 차이를 보고하되 자동 승인하지 않음 +- production package에는 corpus generator와 Bun dependency를 포함하지 않음 + +## 테스트 게이트 + +### Rust 단위/계약 테스트 + +- URL, OAuth/PKCE/keyring redaction과 source 오류 분류 +- handoff session TTL, 크기/동시성, 중복 call, schema/file/version 검증 +- direct와 host input이 같은 `SnapshotChunk`와 최종 artifact를 만드는지 검증 +- 전체 node field 보존, 청크 분할/병합, version 충돌 +- variable/style alias, mode, scope, completeness +- read-only allowlist와 고정 script hash +- outputPath traversal/symlink 방지와 원자적 기록 + +### 호환성 테스트 + +- `compat verify` +- manifest/ledger 전수성 테스트 +- 모든 `rust_snapshot`, `rust_assertion`, `contract` case +- 기준 SHA의 원본 268개 snapshot 전부 대응과 `cargo insta test` +- 원본 기준 SHA에서 978 pass / 0 fail 재현 + +기준 SHA의 숫자는 baseline이지 영구 상수는 아니다. SHA를 갱신하면 원본 test discovery +결과와 ledger/corpus를 함께 갱신하며, 새 테스트가 분류되지 않으면 CI가 실패한다. + +### 통합 및 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. pinned source manifest, test discovery와 coverage ledger validator +2. corpus generator 계측 adapter, 원본 978/268 기준 재현 +3. `insta` compatibility runner와 최소 대표 corpus +4. Rust NodeTree/prop/render/devup.json 규칙을 corpus 기반 TDD로 전수 이식 +5. 완전 collector와 direct source 오류 분류 +6. memory-only handoff session과 `devup_figma_continue` +7. node/page/file, variables/styles/assets와 workspace export 완성 +8. direct/host mock 계약, 실제 공식 MCP와 opt-in live 검증 +9. 전체 corpus, 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를 완전한 data +fixture로 정규화하는 계측 난이도, Remote MCP의 beta contract 변화, 대형 파일의 호출 +수와 quota다. 첫 corpus 생성 단계에서 직렬화할 수 없는 경계를 ledger에 드러내고 +대표 adapter를 검증한 뒤 codegen 대량 이식을 진행한다. 이 단계가 원본 테스트를 +손상 없이 발견·재생할 수 없으면 변환 구현을 계속하지 않고 corpus 설계를 먼저 수정한다. From e1e7b1521b2c3a18f579b8ced9fed7482e515b8b Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 01:38:21 +0900 Subject: [PATCH 14/97] docs: keep devup-mcp cargo-only --- ...08-31-figma-host-fallback-parity-design.md | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) 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 index fb7368b..ae4ca55 100644 --- 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 @@ -46,12 +46,16 @@ devup-mcp/ │ ├─ 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 -├─ compat/devup-figma-plugin/ # pinned corpus, manifest, coverage ledger -└─ scripts/compat/ # 개발/CI 전용 corpus 생성과 drift 확인 +└─ compat/devup-figma-plugin/ # pinned corpus, manifest, coverage ledger ``` -프로덕션 바이너리는 Bun, Node.js 또는 JavaScript runtime에 의존하지 않는다. Bun은 -고정된 원본 저장소에서 호환성 corpus를 생성·검증하는 개발/CI 과정에서만 사용한다. +`devup-mcp` 저장소는 Cargo만으로 build/test하며 `package.json`, Bun lockfile, Node/Bun +script 또는 JavaScript test runtime을 두지 않는다. 고정 fixture corpus의 생성은 이미 +Bun을 사용하는 원본 `devup-figma-plugin` 저장소가 담당하고, 이 저장소에는 검토된 +JSON/snapshot artifact만 import한다. Figma `use_figma`가 요구하는 고정 읽기 전용 +JavaScript 문자열은 Rust binary에 resource로 포함되어 Figma sandbox에서 실행될 뿐, +로컬 JavaScript runtime 의존성이 아니다. + OAuth는 계속 `devup-mcp-figma` 내부에 둔다. 별도 `devup-auth`, `devup-ir`, `devup-mcp-server` crate는 만들지 않는다. @@ -261,11 +265,10 @@ compat/devup-figma-plugin/ 모든 test ID는 `source-file + full suite path + parameterized case index`로 안정적으로 식별한다. 이름이 같은 parameterized test도 index와 input checksum으로 구분한다. -### 생성 방식 +### 생성 방식과 저장소 경계 -`scripts/compat/generate`는 별도 임시 디렉터리에 기준 SHA를 checkout하고 frozen Bun -install을 수행한다. 원본 파일은 수정하지 않는다. 생성기는 임시 checkout에 계측 -adapter를 적용해 실제 JavaScript 구현과 테스트를 실행하고 다음을 기록한다. +corpus exporter는 `devup-figma-plugin`의 test-only 도구로 구현한다. 해당 저장소의 기존 +Bun test 환경에서 실제 JavaScript 구현과 테스트를 계측해 다음을 기록한다. - 테스트 러너가 발견·실행한 전체 test ID와 pass/fail/skip - Codegen/ResponsiveCodegen 진입 시 직렬화 가능한 Figma node graph, variables, @@ -274,13 +277,20 @@ adapter를 적용해 실제 JavaScript 구현과 테스트를 실행하고 다 - download/UI/plugin API 경계에 전달된 payload - 기존 `.snap`의 이름과 원문 기대값 -계측은 fixture 생성 전용이며 생성 결과에 JavaScript 함수나 executable code를 넣지 -않는다. 함수형 Figma mock은 호출 결과와 오류를 data로 펼치고, parent/child/main -component 참조는 ID graph로 정규화한다. key와 배열 순서가 계약인 곳은 보존하고, -비결정적인 시간·임시 경로만 명시적으로 정규화한다. +계측은 원본 저장소의 fixture 생성 전용이며 생성 결과에 JavaScript 함수나 executable +code를 넣지 않는다. 함수형 Figma mock은 호출 결과와 오류를 data로 펼치고, +parent/child/main component 참조는 ID graph로 정규화한다. key와 배열 순서가 계약인 +곳은 보존하고, 비결정적인 시간·임시 경로만 명시적으로 정규화한다. + +exporter는 생성 후 동일 SHA에서 원본 `bun run test`가 다시 0 fail인지 검증하고, +source commit, exporter version, test ID 집합 및 파일 checksum을 포함한 archive를 만든다. +계측 때문에 원본 동작이 변하거나 같은 입력의 결과가 달라지면 export를 실패시킨다. -생성 후 동일 SHA에서 원본 `bun run test`가 다시 0 fail인지 검증한다. 계측 때문에 -원본 동작이 변하거나 같은 입력의 결과가 달라지면 corpus 생성을 실패시킨다. +`devup-mcp`에서는 Rust로 작성한 import/verify test만 이 archive를 다룬다. 검토자가 +archive의 source commit과 변경 diff를 확인한 뒤 `compat/devup-figma-plugin`에 +commit한다. Cargo test는 JSON을 deserialize하고 checksum, ID 전수성, snapshot 참조를 +검증한다. 따라서 `devup-mcp` 개발자와 CI는 Bun 설치나 원본 repository checkout 없이 +모든 호환성 테스트를 실행한다. ### ledger 분류 @@ -320,12 +330,12 @@ assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot ### drift 관리 -- manifest에 원본 repository URL, commit SHA, Bun lockfile checksum과 generator version 저장 -- `compat verify`는 pinned SHA, case count, test ID set, snapshot count와 모든 checksum 검증 -- `compat regenerate --source --rev `로 의도적 업데이트 -- CI의 일반 job은 network 없이 committed corpus를 실행 -- 수동/정기 drift job은 원본 최신 SHA와 차이를 보고하되 자동 승인하지 않음 -- production package에는 corpus generator와 Bun dependency를 포함하지 않음 +- manifest에 원본 repository URL, commit SHA, upstream lockfile checksum과 exporter version 저장 +- Cargo integration test는 pinned SHA, case count, test ID set, snapshot count와 모든 checksum 검증 +- corpus 갱신은 원본 plugin 저장소의 exporter가 만든 archive를 명시적으로 import +- `devup-mcp` CI는 network와 JavaScript runtime 없이 committed corpus만 실행 +- 원본 plugin CI의 수동/정기 job이 최신 source와 corpus 차이를 보고하되 자동 승인하지 않음 +- production package와 `devup-mcp` 개발 의존성에 corpus generator/Bun/Node를 포함하지 않음 ## 테스트 게이트 @@ -341,7 +351,7 @@ assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot ### 호환성 테스트 -- `compat verify` +- Rust corpus manifest/checksum verifier - manifest/ledger 전수성 테스트 - 모든 `rust_snapshot`, `rust_assertion`, `contract` case - 기준 SHA의 원본 268개 snapshot 전부 대응과 `cargo insta test` @@ -377,9 +387,9 @@ verifier, Figma 사용자 정보, 원본 node 내용은 오류와 tracing에서 ## 구현 순서와 완료 기준 -1. pinned source manifest, test discovery와 coverage ledger validator -2. corpus generator 계측 adapter, 원본 978/268 기준 재현 -3. `insta` compatibility runner와 최소 대표 corpus +1. 원본 plugin 저장소의 corpus exporter와 978/268 기준 재현 +2. pinned source manifest, Rust coverage ledger/checksum validator +3. `insta` compatibility runner와 최소 대표 corpus import 4. Rust NodeTree/prop/render/devup.json 규칙을 corpus 기반 TDD로 전수 이식 5. 완전 collector와 direct source 오류 분류 6. memory-only handoff session과 `devup_figma_continue` From 8a39ce48d66eaaca0342aa2edcc352a6e82353cf Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 01:46:57 +0900 Subject: [PATCH 15/97] docs: define json fixture and figma search flow --- ...08-31-figma-host-fallback-parity-design.md | 240 ++++++++++++------ 1 file changed, 168 insertions(+), 72 deletions(-) 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 index ae4ca55..08fefa1 100644 --- 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 @@ -46,15 +46,15 @@ devup-mcp/ │ ├─ 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 -└─ compat/devup-figma-plugin/ # pinned corpus, manifest, coverage ledger +└─ 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을 두지 않는다. 고정 fixture corpus의 생성은 이미 -Bun을 사용하는 원본 `devup-figma-plugin` 저장소가 담당하고, 이 저장소에는 검토된 -JSON/snapshot artifact만 import한다. Figma `use_figma`가 요구하는 고정 읽기 전용 -JavaScript 문자열은 Rust binary에 resource로 포함되어 Figma sandbox에서 실행될 뿐, -로컬 JavaScript runtime 의존성이 아니다. +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는 만들지 않는다. @@ -110,7 +110,7 @@ agent/host <── needs_figma + calls ────┘ ## MCP 도구 계약 -기존 세 도구를 유지하고 continuation을 추가한다. +기존 세 도구를 유지하고 검색과 continuation을 추가한다. ### `devup_figma_auth` @@ -145,6 +145,43 @@ agent/host <── needs_figma + calls ────┘ } ``` +### `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 @@ -200,6 +237,10 @@ collector는 source와 무관한 계획/병합 계층이다. direct transport와 5. 모든 chunk의 file key와 version이 같아야 한다. 도중 version 변경은 전체 결과를 폐기한다. 6. 같은 ID의 내용이 충돌하면 추측하지 않고 오류로 반환한다. +이름 검색은 같은 collector가 만든 metadata/snapshot index를 순회한다. source가 direct든 +host handoff든 정규화와 정렬 결과가 같아야 하며, 검색을 위해 원본 node data를 별도로 +disk cache하지 않는다. + 고정 `use_figma` serializer는 공개된 모든 data property를 우선 raw JSON으로 보존한다. 함수, 순환 참조와 binary는 ID/metadata로 치환하고 읽기 실패 getter는 `fieldErrors`, typed projection이 모르는 새 값은 `extra`에 둔다. Plugin API typings와 serializer @@ -242,55 +283,107 @@ Rust 변환기는 JavaScript `Codegen.buildTree()`의 NodeTree 의미와 render 원본 JavaScript가 내는 의미 있는 문자열은 줄바꿈을 LF로 정규화한 뒤 byte-identical을 목표로 한다. Rust formatter 취향으로 출력 계약을 임의 변경하지 않는다. -## JavaScript 전수 호환성 corpus +## JSON fixture 및 JavaScript 전수 호환성 ### 원칙 -`cargo insta`는 출력 snapshot gate로 사용하되 전수성 자체는 manifest/ledger가 -보장한다. snapshot을 승인하거나 갱신하는 행위는 호환성 변경이며 일반 테스트 실행이 -자동으로 기대값을 덮어쓰지 않는다. +모든 변환 입력은 실행 가능한 TypeScript mock이 아니라 순수 JSON fixture다. Rust는 이 +JSON을 production과 같은 `serde_json` 경로로 읽고 TSX, `devup.json`, NodeTree 또는 +구조화 오류를 생성한다. `cargo insta`는 출력 snapshot gate로 사용하고 전수성은 +manifest/ledger가 보장한다. 일반 테스트 실행은 기대값을 자동으로 덮어쓰지 않는다. ```text -compat/devup-figma-plugin/ -├─ manifest.json # 원본 URL/SHA, generator, 파일·케이스·snapshot 수, checksum -├─ ledger.json # 모든 upstream test ID와 분류/fixture/snapshot/rationale +fixtures/devup-figma-plugin/ +├─ manifest.json # source SHA, schema, case/snapshot 수, checksum +├─ ledger.json # 모든 upstream test ID와 fixture/분류/rationale ├─ cases/ -│ ├─ codegen/*.json # normalized SceneNode/variables/options/expected metadata -│ ├─ responsive/*.json -│ ├─ devup-json/*.json -│ └─ helpers/*.json -└─ upstream-snapshots/ # 원본 268개 snapshot의 LF-normalized golden +│ ├─ 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으로 구분한다. +식별한다. 이름이 같은 parameterized test도 index와 input checksum으로 구분한다. case +파일명은 사람이 읽을 수 있는 kebab-case이고 JSON의 `id`는 전체 corpus에서 유일하다. + +### fixture schema + +각 fixture는 자기완결적이며 다음 envelope를 사용한다. + +```json +{ + "schemaVersion": 1, + "id": "codegen.simple-frame", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "test": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component", + "parameterIndex": 0 + }, + "request": { + "rootId": "1:1", + "componentName": "SimpleFrame", + "options": {} + }, + "snapshot": { + "fileKey": "fixture", + "version": "1", + "roots": ["1:1"], + "nodes": { + "1:1": { + "id": "1:1", + "type": "FRAME", + "fields": { "name": "Frame", "childrenIds": [] }, + "extra": {}, + "fieldErrors": {} + } + } + }, + "variables": [], + "styles": [] +} +``` + +`operation`은 `tsx`, `responsive-tsx`, `devup-json`, `snapshot` 또는 `error` 중 하나다. +expected output은 JSON에 중복 저장하지 않고 같은 `id`의 insta snapshot 한 곳에만 둔다. -### 생성 방식과 저장소 경계 +fixture의 `snapshot`은 별도 test mock 형식이 아니라 실제 collector의 정규화 출력 +schema와 동일하다. TypeScript test에서 함수로 표현했던 값은 이전 시 다음처럼 data로 +평탄화한다. -corpus exporter는 `devup-figma-plugin`의 test-only 도구로 구현한다. 해당 저장소의 기존 -Bun test 환경에서 실제 JavaScript 구현과 테스트를 계측해 다음을 기록한다. +- `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 -- 테스트 러너가 발견·실행한 전체 test ID와 pass/fail/skip -- Codegen/ResponsiveCodegen 진입 시 직렬화 가능한 Figma node graph, variables, - styles, options 및 Figma API stub 결과 -- `getProps`, renderer, devup exporter 같은 순수 경계의 입력과 실제 반환/오류 -- download/UI/plugin API 경계에 전달된 payload -- 기존 `.snap`의 이름과 원문 기대값 +JSON에는 함수, Symbol, 순환 object 또는 executable code가 들어갈 수 없다. fixture +loader는 unknown field를 보존하지만 잘못된 참조, 중복 ID와 지원하지 않는 schema +version은 변환 전에 실패시킨다. -계측은 원본 저장소의 fixture 생성 전용이며 생성 결과에 JavaScript 함수나 executable -code를 넣지 않는다. 함수형 Figma mock은 호출 결과와 오류를 data로 펼치고, -parent/child/main component 참조는 ID graph로 정규화한다. key와 배열 순서가 계약인 -곳은 보존하고, 비결정적인 시간·임시 경로만 명시적으로 정규화한다. +### 최초 이전 -exporter는 생성 후 동일 SHA에서 원본 `bun run test`가 다시 0 fail인지 검증하고, -source commit, exporter version, test ID 집합 및 파일 checksum을 포함한 archive를 만든다. -계측 때문에 원본 동작이 변하거나 같은 입력의 결과가 달라지면 export를 실패시킨다. +기준 commit의 inline TypeScript 입력을 `cases/**/*.json`으로 이전한다. 기존 268개 +JavaScript snapshot은 LF로만 정규화해 동일 ID의 최초 insta golden으로 사용한다. +snapshot이 없던 변환 assertion은 기준 JavaScript 테스트의 실제 기대값을 snapshot으로 +옮긴다. 이전 완료 후 모든 변환 fixture는 JSON이 기준이며, Rust 프로젝트에는 변환용 +JavaScript exporter나 runner를 남기지 않는다. -`devup-mcp`에서는 Rust로 작성한 import/verify test만 이 archive를 다룬다. 검토자가 -archive의 source commit과 변경 diff를 확인한 뒤 `compat/devup-figma-plugin`에 -commit한다. Cargo test는 JSON을 deserialize하고 checksum, ID 전수성, snapshot 참조를 -검증한다. 따라서 `devup-mcp` 개발자와 CI는 Bun 설치나 원본 repository checkout 없이 -모든 호환성 테스트를 실행한다. +원본 54개 파일과 978개 test ID는 ledger에 전부 기록한다. 변환과 관련된 항목은 반드시 +fixture ID와 snapshot 또는 Rust assertion에 연결한다. plugin bootstrap, browser iframe, +Figma 쓰기처럼 JSON 변환 pipeline 자체가 아닌 항목만 근거와 대응 안전성 test를 가진 +범위 외 분류를 허용한다. ### ledger 분류 @@ -307,35 +400,34 @@ commit한다. Cargo test는 JSON을 deserialize하고 checksum, ID 전수성, sn 읽기 전용 allowlist가 해당 동작을 불가능하게 한다는 테스트에 연결한다. `upstream_runtime_only`는 가능한 경우 MCP/파일 export의 동등한 경계 테스트에 연결한다. -ledger에는 분류별 최소 목표 수를 하드코딩하지 않는다. 대신 발견한 test ID 집합과 -ledger ID 집합의 완전 일치, 모든 항목의 fixture 또는 rationale/test reference 존재, -중복 없음, referenced file/checksum 존재를 검증한다. 이 규칙으로 불편한 테스트를 -숫자 맞추기 없이 제외하는 것을 막는다. +ledger에는 분류별 최소 목표 수를 하드코딩하지 않는다. 대신 manifest에 기록한 기준 +commit의 upstream test ID 집합과 ledger ID 집합의 완전 일치, 모든 항목의 fixture 또는 +rationale/test reference 존재, 중복 없음, referenced file/checksum 존재를 검증한다. +이 규칙으로 불편한 테스트를 숫자 맞추기 없이 제외하는 것을 막는다. ### insta 사용 -`devup-mcp-devup-ui`의 compatibility integration test가 manifest를 읽어 모든 -`rust_snapshot` case를 변환한다. +`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으로 사용해 원본 test까지 역추적 +- 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을 실패로 처리 -기존 268개 upstream snapshot은 첫 corpus에서 전부 보존한다. snapshot이 없던 변환 -assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot 또는 assertion으로 -옮긴다. +테스트는 glob으로 발견한 JSON 집합, manifest case 집합과 snapshot 집합의 일대일 대응을 +검증한다. orphan JSON, orphan snapshot, 중복 ID, 잘못된 source test 또는 ledger에서 +분류되지 않은 upstream test가 하나라도 있으면 실패한다. ### drift 관리 -- manifest에 원본 repository URL, commit SHA, upstream lockfile checksum과 exporter version 저장 -- Cargo integration test는 pinned SHA, case count, test ID set, snapshot count와 모든 checksum 검증 -- corpus 갱신은 원본 plugin 저장소의 exporter가 만든 archive를 명시적으로 import -- `devup-mcp` CI는 network와 JavaScript runtime 없이 committed corpus만 실행 -- 원본 plugin CI의 수동/정기 job이 최신 source와 corpus 차이를 보고하되 자동 승인하지 않음 -- production package와 `devup-mcp` 개발 의존성에 corpus generator/Bun/Node를 포함하지 않음 +- 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를 포함하지 않음 ## 테스트 게이트 @@ -345,6 +437,7 @@ assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot - 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 방지와 원자적 기록 @@ -355,10 +448,11 @@ assertion도 실제 JavaScript 반환값을 golden으로 저장해 Rust snapshot - manifest/ledger 전수성 테스트 - 모든 `rust_snapshot`, `rust_assertion`, `contract` case - 기준 SHA의 원본 268개 snapshot 전부 대응과 `cargo insta test` -- 원본 기준 SHA에서 978 pass / 0 fail 재현 +- manifest에 기록한 원본 기준 실행 결과 978 pass / 0 fail과 source SHA 검증 기준 SHA의 숫자는 baseline이지 영구 상수는 아니다. SHA를 갱신하면 원본 test discovery -결과와 ledger/corpus를 함께 갱신하며, 새 테스트가 분류되지 않으면 CI가 실패한다. +결과와 ledger/corpus를 함께 갱신한다. Rust CI는 원격 source를 실행하지 않지만, 갱신 +commit에 기록된 ID가 ledger/fixture/snapshot과 일치하지 않으면 실패한다. ### 통합 및 live 테스트 @@ -387,15 +481,17 @@ verifier, Figma 사용자 정보, 원본 node 내용은 오류와 tracing에서 ## 구현 순서와 완료 기준 -1. 원본 plugin 저장소의 corpus exporter와 978/268 기준 재현 -2. pinned source manifest, Rust coverage ledger/checksum validator -3. `insta` compatibility runner와 최소 대표 corpus import +1. fixture envelope/schema와 Rust JSON loader/validator +2. 기준 plugin의 inline input을 JSON으로 이전하고 978개 ledger/268개 golden 연결 +3. `insta` compatibility runner와 JSON/snapshot 일대일 검증 4. Rust NodeTree/prop/render/devup.json 규칙을 corpus 기반 TDD로 전수 이식 -5. 완전 collector와 direct source 오류 분류 -6. memory-only handoff session과 `devup_figma_continue` -7. node/page/file, variables/styles/assets와 workspace export 완성 -8. direct/host mock 계약, 실제 공식 MCP와 opt-in live 검증 -9. 전체 corpus, lint/test/build, changepack, 문서와 배포 +5. JSON fixture 전체 gate 통과. 이 단계 전에는 검색 기능으로 넘어가지 않음 +6. 완전 collector와 direct source 오류 분류 +7. memory-only handoff session과 `devup_figma_continue` +8. `devup_figma_search`와 검색 결과별 `devup_figma_to_ui` 흐름 +9. node/page/file, variables/styles/assets와 workspace export 완성 +10. direct/host mock 계약, 실제 공식 MCP와 opt-in live 검증 +11. 전체 corpus, lint/test/build, changepack, 문서와 배포 완료는 단순히 Rust test가 green인 상태가 아니다. pinned 원본의 모든 test ID가 ledger에 있고, 모든 읽기/변환 케이스가 Rust snapshot/assertion/contract로 통과하며, 범위 밖 @@ -411,8 +507,8 @@ verifier, Figma 사용자 정보, 원본 node 내용은 오류와 tracing에서 - Figma write tool은 direct allowlist와 host handoff 모두에서 생성하지 않는다. - host가 반환한 result는 신뢰 경계 밖 입력으로 보고 크기/schema/context를 검증한다. -가장 큰 남은 위험은 JavaScript의 Figma mock 함수와 plugin side effect를 완전한 data -fixture로 정규화하는 계측 난이도, Remote MCP의 beta contract 변화, 대형 파일의 호출 -수와 quota다. 첫 corpus 생성 단계에서 직렬화할 수 없는 경계를 ledger에 드러내고 -대표 adapter를 검증한 뒤 codegen 대량 이식을 진행한다. 이 단계가 원본 테스트를 -손상 없이 발견·재생할 수 없으면 변환 구현을 계속하지 않고 corpus 설계를 먼저 수정한다. +가장 큰 남은 위험은 JavaScript의 Figma mock 함수와 plugin side effect를 손실 없이 +정규화된 JSON data로 이전하는 난이도, Remote MCP의 beta contract 변화, 대형 파일의 +호출 수와 quota다. 최초 이전에서 함수의 의미를 추측하지 않고 실제 기대값과 대조하며, +직렬화할 수 없는 경계는 ledger에 드러낸다. 대표 fixture가 기존 golden을 재현하지 +못하면 codegen 대량 이식을 계속하지 않고 fixture schema를 먼저 수정한다. From c6ec60e4e8851e18f23268b1afa82dd85d8bd41b Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 01:50:38 +0900 Subject: [PATCH 16/97] docs: derive fixtures from live figma payloads --- ...08-31-figma-host-fallback-parity-design.md | 87 ++++++++----------- 1 file changed, 38 insertions(+), 49 deletions(-) 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 index 08fefa1..05aff26 100644 --- 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 @@ -241,6 +241,26 @@ collector는 source와 무관한 계획/병합 계층이다. direct transport와 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 @@ -316,42 +336,10 @@ fixtures/devup-figma-plugin/ ### fixture schema -각 fixture는 자기완결적이며 다음 envelope를 사용한다. - -```json -{ - "schemaVersion": 1, - "id": "codegen.simple-frame", - "operation": "tsx", - "source": { - "repository": "dev-five-git/devup-figma-plugin", - "commit": "243db650f1d635ab5385546a2a297eae4ea93515", - "test": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component", - "parameterIndex": 0 - }, - "request": { - "rootId": "1:1", - "componentName": "SimpleFrame", - "options": {} - }, - "snapshot": { - "fileKey": "fixture", - "version": "1", - "roots": ["1:1"], - "nodes": { - "1:1": { - "id": "1:1", - "type": "FRAME", - "fields": { "name": "Frame", "childrenIds": [] }, - "extra": {}, - "fieldErrors": {} - } - } - }, - "variables": [], - "styles": [] -} -``` +각 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 한 곳에만 둔다. @@ -374,8 +362,9 @@ version은 변환 전에 실패시킨다. ### 최초 이전 -기준 commit의 inline TypeScript 입력을 `cases/**/*.json`으로 이전한다. 기존 268개 -JavaScript snapshot은 LF로만 정규화해 동일 ID의 최초 insta golden으로 사용한다. +실제 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를 남기지 않는다. @@ -481,17 +470,17 @@ verifier, Figma 사용자 정보, 원본 node 내용은 오류와 tracing에서 ## 구현 순서와 완료 기준 -1. fixture envelope/schema와 Rust JSON loader/validator -2. 기준 plugin의 inline input을 JSON으로 이전하고 978개 ledger/268개 golden 연결 -3. `insta` compatibility runner와 JSON/snapshot 일대일 검증 -4. Rust NodeTree/prop/render/devup.json 규칙을 corpus 기반 TDD로 전수 이식 -5. JSON fixture 전체 gate 통과. 이 단계 전에는 검색 기능으로 넘어가지 않음 -6. 완전 collector와 direct source 오류 분류 -7. memory-only handoff session과 `devup_figma_continue` -8. `devup_figma_search`와 검색 결과별 `devup_figma_to_ui` 흐름 -9. node/page/file, variables/styles/assets와 workspace export 완성 -10. direct/host mock 계약, 실제 공식 MCP와 opt-in live 검증 -11. 전체 corpus, lint/test/build, changepack, 문서와 배포 +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로 통과하며, 범위 밖 From 1bb2af11f3acf8a6544c9276573fdae88703d7fa Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:02:13 +0900 Subject: [PATCH 17/97] docs: plan figma collection parity and search --- .../plans/2026-08-30-figma-remote-mcp.md | 4 + ...26-08-31-figma-collection-live-contract.md | 494 +++++++++++++++++ .../2026-08-31-figma-search-and-export.md | 304 +++++++++++ .../plans/2026-08-31-json-fixture-parity.md | 502 ++++++++++++++++++ 4 files changed, 1304 insertions(+) create mode 100644 docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md create mode 100644 docs/superpowers/plans/2026-08-31-figma-search-and-export.md create mode 100644 docs/superpowers/plans/2026-08-31-json-fixture-parity.md diff --git a/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md index 83e6b2a..89fb1e0 100644 --- a/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md +++ b/docs/superpowers/plans/2026-08-30-figma-remote-mcp.md @@ -1,5 +1,9 @@ # 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`. 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..2b67896 --- /dev/null +++ b/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md @@ -0,0 +1,494 @@ +# 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 }`. + +- [ ] **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(CollectedPayload), +} + +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:** +- 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-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-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" +``` From a487d659d0dcbfa4e2ad1688991c668efb126a91 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:06:52 +0900 Subject: [PATCH 18/97] feat: classify figma source failures --- crates/devup-mcp-figma/src/errors.rs | 20 ++ crates/devup-mcp-figma/src/lib.rs | 6 + crates/devup-mcp-figma/src/source.rs | 177 ++++++++++++++++++ crates/devup-mcp-figma/src/upstream.rs | 57 +++--- crates/devup-mcp-figma/tests/source_policy.rs | 167 +++++++++++++++++ 5 files changed, 401 insertions(+), 26 deletions(-) create mode 100644 crates/devup-mcp-figma/src/source.rs create mode 100644 crates/devup-mcp-figma/tests/source_policy.rs diff --git a/crates/devup-mcp-figma/src/errors.rs b/crates/devup-mcp-figma/src/errors.rs index 13cff3c..a681a60 100644 --- a/crates/devup-mcp-figma/src/errors.rs +++ b/crates/devup-mcp-figma/src/errors.rs @@ -8,6 +8,11 @@ pub enum ErrorCode { DevupAuthStateMismatch, DevupFigmaPermissionDenied, DevupFigmaRateLimited, + DevupFigmaDirectUnavailable, + DevupFigmaCatalogRejected, + DevupFigmaHostRequired, + DevupFigmaHandoffExpired, + DevupFigmaHandoffInvalid, DevupFigmaNodeNotFound, DevupFigmaUnsupportedFile, DevupFigmaResponseTooLarge, @@ -15,6 +20,7 @@ pub enum ErrorCode { DevupSnapshotUnsupported, DevupCodegenFailed, DevupThemeConflict, + DevupCompatCorpusDrift, } #[derive(Clone, Serialize, Deserialize)] @@ -38,6 +44,20 @@ impl DevupError { 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 { diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index 98e6338..ec99d47 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -2,6 +2,7 @@ mod credentials; mod errors; mod oauth; mod snapshot; +mod source; mod upstream; mod url; @@ -14,5 +15,10 @@ pub use snapshot::{ Diagnostic, RawNode, Snapshot, 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, FigmaUpstream, ReadToolCall, RemoteFigmaClient, UpstreamResult}; pub use url::FigmaTarget; diff --git a/crates/devup-mcp-figma/src/source.rs b/crates/devup-mcp-figma/src/source.rs new file mode 100644 index 0000000..bcb97fb --- /dev/null +++ b/crates/devup-mcp-figma/src/source.rs @@ -0,0 +1,177 @@ +use serde::{Deserialize, Serialize}; +use serde_json::json; + +use crate::{DevupError, ErrorCode}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum SourcePolicy { + Auto, + Direct, + Host, +} + +impl Default for SourcePolicy { + fn default() -> Self { + Self::Auto + } +} + +#[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/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs index 9130384..cd4d8eb 100644 --- a/crates/devup-mcp-figma/src/upstream.rs +++ b/crates/devup-mcp-figma/src/upstream.rs @@ -8,7 +8,10 @@ use rmcp::{ }; use serde_json::{Map, Value, json}; -use super::{CredentialStore, DevupError, ErrorCode, OAuthManager}; +use super::{ + CredentialStore, DevupError, OAuthManager, 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; @@ -188,7 +191,7 @@ impl RemoteFigmaClient { .reinit_on_expired_session(true); ().serve(StreamableHttpClientTransport::from_config(config)) .await - .map_err(upstream_error) + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error)) } } @@ -199,48 +202,50 @@ impl FigmaUpstream for RemoteFigmaClient { let mut names = client .list_all_tools() .await - .map_err(upstream_error)? + .map_err(|error| map_upstream_error(UpstreamFailureContext::ListTools, error))? .into_iter() .map(|tool| tool.name.to_string()) .collect::>(); names.sort(); - client.cancel().await.map_err(upstream_error)?; + client + .cancel() + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error))?; Ok(names) } async fn call_read_tool(&self, call: ReadToolCall) -> Result { let client = self.connect().await?; - let available = client.list_all_tools().await.map_err(upstream_error)?; + let available = client + .list_all_tools() + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::ListTools, error))?; if !available.iter().any(|tool| tool.name == call.tool_name()) { - client.cancel().await.map_err(upstream_error)?; - return Err(DevupError::new( - ErrorCode::DevupSnapshotUnsupported, - "Figma Remote MCP가 필요한 읽기 도구를 제공하지 않습니다.", - false, - )); + client + .cancel() + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error))?; + return Err(UpstreamFailureKind::CapabilityUnavailable.into_devup_error(None)); } let result = client .call_tool( CallToolRequestParams::new(call.tool_name()).with_arguments(call.arguments()), ) .await - .map_err(upstream_error)?; - client.cancel().await.map_err(upstream_error)?; - let raw = serde_json::to_value(result).map_err(|_| { - DevupError::new( - ErrorCode::DevupSnapshotUnsupported, - "Figma MCP 응답을 안전하게 해석하지 못했습니다.", - false, - ) - })?; + .map_err(|error| map_upstream_error(UpstreamFailureContext::CallTool, error))?; + client + .cancel() + .await + .map_err(|error| map_upstream_error(UpstreamFailureContext::Connect, error))?; + let raw = serde_json::to_value(result) + .map_err(|error| map_upstream_error(UpstreamFailureContext::Decode, error))?; Ok(UpstreamResult { raw }) } } -fn upstream_error(_error: E) -> DevupError { - DevupError::new( - ErrorCode::DevupSnapshotUnsupported, - "Figma Remote MCP 요청을 완료하지 못했습니다.", - true, - ) +fn map_upstream_error( + context: UpstreamFailureContext, + error: E, +) -> DevupError { + upstream_failure_error(context, None, &error.to_string()) } 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") + ); +} From 4557b592ca5412a778a4efd1d321c3380124a484 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:12:35 +0900 Subject: [PATCH 19/97] feat: add resumable figma collector --- crates/devup-mcp-figma/src/collector.rs | 237 ++++++++++++++++++ crates/devup-mcp-figma/src/lib.rs | 6 + crates/devup-mcp-figma/src/metadata.rs | 68 +++++ crates/devup-mcp-figma/tests/collector.rs | 190 ++++++++++++++ ...26-08-31-figma-collection-live-contract.md | 4 +- 5 files changed, 504 insertions(+), 1 deletion(-) create mode 100644 crates/devup-mcp-figma/src/collector.rs create mode 100644 crates/devup-mcp-figma/src/metadata.rs create mode 100644 crates/devup-mcp-figma/tests/collector.rs diff --git a/crates/devup-mcp-figma/src/collector.rs b/crates/devup-mcp-figma/src/collector.rs new file mode 100644 index 0000000..8155090 --- /dev/null +++ b/crates/devup-mcp-figma/src/collector.rs @@ -0,0 +1,237 @@ +use std::collections::{BTreeMap, BTreeSet, VecDeque}; + +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +use crate::{ + BuiltinScript, DevupError, ErrorCode, FigmaTarget, ReadToolCall, SnapshotChunk, UpstreamResult, + metadata::metadata_from_result, snapshot_chunk_from_result, +}; + +const LARGE_SUBTREE_THRESHOLD: usize = 200; +const MAX_PENDING_CALLS: usize = 4; + +#[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 include_variables: bool, + pub include_context: bool, +} + +impl CollectionRequest { + pub fn new(target: FigmaTarget, scope: CollectionScope) -> Self { + Self { + target, + scope, + include_variables: false, + include_context: 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, +} + +#[derive(Debug, Clone)] +pub enum CollectorStep { + Call(PlannedCall), + AwaitingResults, + Complete(Box), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum CallKind { + Metadata, + Snapshot, +} + +#[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, + source_version: Option, + snapshot_chunks: BTreeMap, + next_id: usize, + completed: bool, +} + +impl CollectorSession { + pub fn new(request: CollectionRequest) -> Self { + Self { + request, + queued: VecDeque::new(), + pending: BTreeMap::new(), + consumed: BTreeSet::new(), + metadata: None, + source_version: None, + snapshot_chunks: BTreeMap::new(), + next_id: 0, + completed: false, + } + } + + pub fn advance(&mut self) -> Result { + if self.completed { + return Err(invalid_call("완료된 Figma 수집 session입니다.")); + } + if self.metadata.is_none() && self.pending.is_empty() && self.queued.is_empty() { + let node_id = 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, + ); + } + if self.pending.len() < MAX_PENDING_CALLS + && let Some(call) = self.queued.pop_front() + { + self.pending.insert(call.planned.id.clone(), call.clone()); + return Ok(CollectorStep::Call(call.planned)); + } + if !self.pending.is_empty() { + return Ok(CollectorStep::AwaitingResults); + } + if self.metadata.is_some() && self.queued.is_empty() { + self.completed = true; + 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: std::mem::take(&mut self.snapshot_chunks) + .into_values() + .collect(), + variables: None, + styles: None, + source_version: self.source_version.clone(), + }))); + } + 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::Metadata => self.accept_metadata(result), + CallKind::Snapshot => self.accept_snapshot(&pending.planned, pending.order, result), + } + } + + fn accept_metadata(&mut self, result: UpstreamResult) -> Result<(), DevupError> { + let document = metadata_from_result(&result)?; + if document.file_key != self.request.target.file_key { + return Err(invalid_call("Figma metadata의 file key가 요청과 다릅니다.")); + } + self.source_version = document.version.clone(); + self.metadata = Some(result.raw); + let root = document.root().ok_or_else(|| { + DevupError::new( + ErrorCode::DevupFigmaNodeNotFound, + "Figma metadata에서 대상 node를 찾지 못했습니다.", + false, + ) + })?; + 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 accept_snapshot( + &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 snapshot의 file key가 요청과 다릅니다.")); + } + if chunk.version != self.source_version { + return Err(DevupError::new( + ErrorCode::DevupFigmaVersionChanged, + "수집 중 Figma 파일 버전이 변경되었습니다.", + true, + )); + } + self.snapshot_chunks.insert(order, chunk); + 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 invalid_call(message: &str) -> DevupError { + DevupError::new(ErrorCode::DevupFigmaHandoffInvalid, message, false) +} diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index ec99d47..e272f52 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -1,3 +1,4 @@ +mod collector; mod credentials; mod errors; mod oauth; @@ -22,3 +23,8 @@ pub use source::{ }; pub use upstream::{BuiltinScript, FigmaUpstream, ReadToolCall, RemoteFigmaClient, UpstreamResult}; pub use url::FigmaTarget; +mod metadata; +pub use collector::{ + CollectedParts, CollectionRequest, CollectionScope, CollectorSession, CollectorStep, + PlannedCall, +}; diff --git a/crates/devup-mcp-figma/src/metadata.rs b/crates/devup-mcp-figma/src/metadata.rs new file mode 100644 index 0000000..0c6fb10 --- /dev/null +++ b/crates/devup-mcp-figma/src/metadata.rs @@ -0,0 +1,68 @@ +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 children_ids: Vec, + #[serde(default)] + pub descendant_count: usize, +} + +impl MetadataDocument { + pub fn root(&self) -> Option<&MetadataNode> { + self.nodes.iter().find(|node| node.id == self.root_id) + } +} + +pub fn metadata_from_result(result: &UpstreamResult) -> Result { + find_metadata(&result.raw).ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답에서 metadata를 찾지 못했습니다.", + false, + ) + }) +} + +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/tests/collector.rs b/crates/devup-mcp-figma/tests/collector.rs new file mode 100644 index 0000000..97632b7 --- /dev/null +++ b/crates/devup-mcp-figma/tests/collector.rs @@ -0,0 +1,190 @@ +use devup_mcp_figma::{ + CollectionRequest, CollectionScope, CollectorSession, CollectorStep, ErrorCode, FigmaTarget, + UpstreamResult, +}; +use serde_json::json; + +fn target(node_id: &str) -> FigmaTarget { + FigmaTarget::parse(&format!( + "https://www.figma.com/design/FileKey123/Fixture?node-id={}", + node_id.replace(':', "-") + )) + .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": {} + }] + }), + } +} + +#[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); +} 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 index 2b67896..70e16cb 100644 --- a/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md +++ b/docs/superpowers/plans/2026-08-31-figma-collection-live-contract.md @@ -142,6 +142,7 @@ git commit -m "feat: classify figma source failures" - 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** @@ -169,7 +170,7 @@ Expected: compile failure for the collector types. ```rust pub enum CollectorStep { Call(PlannedCall), - Complete(CollectedPayload), + Complete(Box), } pub fn advance(&mut self) -> Result; @@ -204,6 +205,7 @@ git commit -m "feat: add resumable figma collector" - 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. From ff87ba688e4a263734e50cc88640edf2ec401725 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:15:58 +0900 Subject: [PATCH 20/97] feat: define collected figma payload contract --- crates/devup-mcp-figma/src/lib.rs | 2 + crates/devup-mcp-figma/src/payload.rs | 138 ++++++++++++++++++ crates/devup-mcp-figma/src/upstream.rs | 3 +- crates/devup-mcp-figma/src/url.rs | 5 +- .../devup-mcp-figma/tests/payload_contract.rs | 81 ++++++++++ 5 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 crates/devup-mcp-figma/src/payload.rs create mode 100644 crates/devup-mcp-figma/tests/payload_contract.rs diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index e272f52..c4a1819 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -2,6 +2,7 @@ mod collector; mod credentials; mod errors; mod oauth; +mod payload; mod snapshot; mod source; mod upstream; @@ -12,6 +13,7 @@ pub use credentials::{ }; pub use errors::{DevupError, ErrorCode}; pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; +pub use payload::{CollectedPayload, PayloadCompleteness, PayloadStructure}; pub use snapshot::{ Diagnostic, RawNode, Snapshot, SnapshotChunk, TypedNode, merge_chunks, snapshot_chunk_from_result, diff --git a/crates/devup-mcp-figma/src/payload.rs b/crates/devup-mcp-figma/src/payload.rs new file mode 100644 index 0000000..fe0510d --- /dev/null +++ b/crates/devup-mcp-figma/src/payload.rs @@ -0,0 +1,138 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; +use sha2::{Digest, Sha256}; + +use crate::{ + CollectedParts, CollectionScope, DevupError, FigmaTarget, Snapshot, 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, +} + +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, + }) + } +} + +#[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/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs index cd4d8eb..63f853c 100644 --- a/crates/devup-mcp-figma/src/upstream.rs +++ b/crates/devup-mcp-figma/src/upstream.rs @@ -6,6 +6,7 @@ use rmcp::{ StreamableHttpClientTransport, streamable_http_client::StreamableHttpClientTransportConfig, }, }; +use serde::{Deserialize, Serialize}; use serde_json::{Map, Value, json}; use super::{ @@ -149,7 +150,7 @@ impl ReadToolCall { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct UpstreamResult { pub raw: Value, } diff --git a/crates/devup-mcp-figma/src/url.rs b/crates/devup-mcp-figma/src/url.rs index 5a0ba9c..50a6125 100644 --- a/crates/devup-mcp-figma/src/url.rs +++ b/crates/devup-mcp-figma/src/url.rs @@ -1,8 +1,11 @@ use url::Url; +use serde::{Deserialize, Serialize}; + use super::DevupError; -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct FigmaTarget { pub file_key: String, pub node_id: Option, 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..837123c --- /dev/null +++ b/crates/devup-mcp-figma/tests/payload_contract.rs @@ -0,0 +1,81 @@ +use devup_mcp_figma::{ + CollectedParts, CollectedPayload, CollectionScope, FigmaTarget, PayloadCompleteness, + PayloadStructure, SnapshotChunk, UpstreamResult, +}; +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()), + } +} + +#[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}"); + } +} From cce27bf2bc5951a3f5db3fe02ffc6f3d7d046c0f Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:30:59 +0900 Subject: [PATCH 21/97] feat: preserve complete figma collection context --- crates/devup-mcp-figma/src/collector.rs | 34 ++++++++++++++- crates/devup-mcp-figma/src/lib.rs | 4 +- crates/devup-mcp-figma/src/payload.rs | 20 +++++++++ .../src/plugin_api_manifest.json | 14 +++---- crates/devup-mcp-figma/tests/collector.rs | 41 +++++++++++++++++++ .../devup-mcp-figma/tests/payload_contract.rs | 15 ++++++- .../tests/upstream_contract.rs | 40 ++++++++++++++++++ 7 files changed, 156 insertions(+), 12 deletions(-) diff --git a/crates/devup-mcp-figma/src/collector.rs b/crates/devup-mcp-figma/src/collector.rs index 8155090..9c1d9ca 100644 --- a/crates/devup-mcp-figma/src/collector.rs +++ b/crates/devup-mcp-figma/src/collector.rs @@ -68,6 +68,7 @@ pub enum CollectorStep { enum CallKind { Metadata, Snapshot, + Variables, } #[derive(Debug, Clone)] @@ -84,8 +85,10 @@ pub struct CollectorSession { pending: BTreeMap, consumed: BTreeSet, metadata: Option, + root_node_id: Option, source_version: Option, snapshot_chunks: BTreeMap, + variables: Option, next_id: usize, completed: bool, } @@ -98,8 +101,10 @@ impl CollectorSession { pending: BTreeMap::new(), consumed: BTreeSet::new(), metadata: None, + root_node_id: None, source_version: None, snapshot_chunks: BTreeMap::new(), + variables: None, next_id: 0, completed: false, } @@ -126,6 +131,26 @@ impl CollectorSession { if !self.pending.is_empty() { return Ok(CollectorStep::AwaitingResults); } + if self.metadata.is_some() + && self.request.include_variables + && 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::LocalVariables, + ), + Some(node_id), + CallKind::Variables, + ); + return self.advance(); + } if self.metadata.is_some() && self.queued.is_empty() { self.completed = true; return Ok(CollectorStep::Complete(Box::new(CollectedParts { @@ -135,8 +160,8 @@ impl CollectorSession { snapshot_chunks: std::mem::take(&mut self.snapshot_chunks) .into_values() .collect(), - variables: None, - styles: None, + variables: self.variables.clone(), + styles: self.variables.clone(), source_version: self.source_version.clone(), }))); } @@ -152,6 +177,10 @@ impl CollectorSession { match pending.kind { CallKind::Metadata => self.accept_metadata(result), CallKind::Snapshot => self.accept_snapshot(&pending.planned, pending.order, result), + CallKind::Variables => { + self.variables = Some(result); + Ok(()) + } } } @@ -161,6 +190,7 @@ impl CollectorSession { return Err(invalid_call("Figma metadata의 file key가 요청과 다릅니다.")); } self.source_version = document.version.clone(); + self.root_node_id = Some(document.root_id.clone()); self.metadata = Some(result.raw); let root = document.root().ok_or_else(|| { DevupError::new( diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index c4a1819..d193f35 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -13,7 +13,9 @@ pub use credentials::{ }; pub use errors::{DevupError, ErrorCode}; pub use oauth::{AuthStatus, BrowserOpener, OAuthManager, SecretString, SystemBrowser}; -pub use payload::{CollectedPayload, PayloadCompleteness, PayloadStructure}; +pub use payload::{ + CollectedPayload, PayloadCompleteness, PayloadStructure, validate_payload_context, +}; pub use snapshot::{ Diagnostic, RawNode, Snapshot, SnapshotChunk, TypedNode, merge_chunks, snapshot_chunk_from_result, diff --git a/crates/devup-mcp-figma/src/payload.rs b/crates/devup-mcp-figma/src/payload.rs index fe0510d..4be3027 100644 --- a/crates/devup-mcp-figma/src/payload.rs +++ b/crates/devup-mcp-figma/src/payload.rs @@ -53,6 +53,26 @@ impl TryFrom for CollectedPayload { } } +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 { diff --git a/crates/devup-mcp-figma/src/plugin_api_manifest.json b/crates/devup-mcp-figma/src/plugin_api_manifest.json index 3d9b7c6..0bbbd62 100644 --- a/crates/devup-mcp-figma/src/plugin_api_manifest.json +++ b/crates/devup-mcp-figma/src/plugin_api_manifest.json @@ -2,19 +2,19 @@ "absoluteBoundingBox", "absoluteRenderBounds", "annotations", "arcData", "attachedConnectors", "authorVisible", "backgrounds", "backgroundStyleId", "blendMode", "bottomLeftRadius", "bottomRightRadius", "boundVariables", "characters", "clipsContent", "componentDescription", - "componentProperties", "componentPropertyDefinitions", "componentSetId", "componentSetProperties", + "componentProperties", "componentPropertyDefinitions", "componentPropertyReferences", "componentSetId", "componentSetProperties", "constraints", "cornerRadius", "cornerSmoothing", "counterAxisAlignContent", "counterAxisAlignItems", - "counterAxisSizingMode", "dashPattern", "description", "devStatus", "documentationLinks", "effects", - "effectStyleId", "expanded", "explicitVariableModes", "exportSettings", "fills", "fillStyleId", + "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", "isMask", "isMaskOutline", "itemReverseZIndex", + "hyperlink", "inferredAutoLayout", "isAsset", "isExposedInstance", "isMask", "isMaskOutline", "itemReverseZIndex", "itemSpacing", "layoutAlign", "layoutGrids", "layoutGrow", "layoutMode", "layoutPositioning", "layoutSizingHorizontal", "layoutSizingVertical", "layoutWrap", "letterSpacing", "lineHeight", - "locked", "mainAxisAlignItems", "mainAxisSizingMode", "maxHeight", "maxWidth", "measurements", + "locked", "mainAxisAlignItems", "mainAxisSizingMode", "maskType", "maxHeight", "maxWidth", "measurements", "minHeight", "minWidth", "name", "numberOfFixedChildren", "opacity", "overlayBackground", - "overlayBackgroundInteraction", "overlayPositionType", "paddingBottom", "paddingLeft", "paddingRight", - "paddingTop", "paragraphIndent", "paragraphSpacing", "paragraphSpacingMode", "pluginData", "reactions", + "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", diff --git a/crates/devup-mcp-figma/tests/collector.rs b/crates/devup-mcp-figma/tests/collector.rs index 97632b7..3093e7c 100644 --- a/crates/devup-mcp-figma/tests/collector.rs +++ b/crates/devup-mcp-figma/tests/collector.rs @@ -188,3 +188,44 @@ fn rejects_unknown_or_replayed_call_ids() { .unwrap_err(); assert_eq!(replayed.code, ErrorCode::DevupFigmaHandoffInvalid); } + +#[test] +fn variable_collection_runs_after_snapshot_and_preserves_the_raw_result() { + let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); + request.include_variables = true; + 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(variable_call) = collector.advance().unwrap() else { + panic!("variable/style read should follow the snapshot") + }; + assert_eq!(variable_call.call.tool_name(), "use_figma"); + assert_eq!(variable_call.expected_node_id.as_deref(), Some("1:2")); + let raw = UpstreamResult { + raw: json!({ + "content": [{ + "type": "text", + "text": "{\"collections\":[],\"variables\":[],\"styles\":[],\"localComplete\":true,\"usedRemoteComplete\":false}" + }] + }), + }; + collector.accept(&variable_call.id, raw.clone()).unwrap(); + + let CollectorStep::Complete(parts) = collector.advance().unwrap() else { + panic!("collection should finish after variables") + }; + assert_eq!(parts.variables, Some(raw.clone())); + assert_eq!(parts.styles, Some(raw)); +} diff --git a/crates/devup-mcp-figma/tests/payload_contract.rs b/crates/devup-mcp-figma/tests/payload_contract.rs index 837123c..51ba5a3 100644 --- a/crates/devup-mcp-figma/tests/payload_contract.rs +++ b/crates/devup-mcp-figma/tests/payload_contract.rs @@ -1,6 +1,6 @@ use devup_mcp_figma::{ - CollectedParts, CollectedPayload, CollectionScope, FigmaTarget, PayloadCompleteness, - PayloadStructure, SnapshotChunk, UpstreamResult, + CollectedParts, CollectedPayload, CollectionScope, ErrorCode, FigmaTarget, PayloadCompleteness, + PayloadStructure, SnapshotChunk, UpstreamResult, validate_payload_context, }; use serde_json::json; @@ -79,3 +79,14 @@ fn structure_report_contains_shapes_but_no_design_values() { 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); +} diff --git a/crates/devup-mcp-figma/tests/upstream_contract.rs b/crates/devup-mcp-figma/tests/upstream_contract.rs index fd12b03..d358ac4 100644 --- a/crates/devup-mcp-figma/tests/upstream_contract.rs +++ b/crates/devup-mcp-figma/tests/upstream_contract.rs @@ -52,3 +52,43 @@ fn snapshot_accepts_only_compiled_in_scripts() { 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 built_in_scripts_expose_only_read_operations() { + for script in [BuiltinScript::NodeSnapshot, BuiltinScript::LocalVariables] { + 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}" + ); + } + } +} From 9f6eca3f2b3b904c4437e05c51a4e0a64b99d04d Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:35:38 +0900 Subject: [PATCH 22/97] feat: add bounded figma handoff sessions --- Cargo.lock | 2 + crates/devup-mcp/Cargo.toml | 2 + crates/devup-mcp/src/server/handoff.rs | 315 +++++++++++++++++++++++++ crates/devup-mcp/src/server/mod.rs | 1 + crates/devup-mcp/tests/handoff.rs | 268 +++++++++++++++++++++ 5 files changed, 588 insertions(+) create mode 100644 crates/devup-mcp/src/server/handoff.rs create mode 100644 crates/devup-mcp/tests/handoff.rs diff --git a/Cargo.lock b/Cargo.lock index 12d24d0..ca8f63f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -565,8 +565,10 @@ dependencies = [ "anyhow", "async-trait", "axum", + "base64 0.22.1", "devup-mcp-devup-ui", "devup-mcp-figma", + "rand 0.9.5", "reqwest 0.12.28", "rmcp", "schemars", diff --git a/crates/devup-mcp/Cargo.toml b/crates/devup-mcp/Cargo.toml index 9350cd3..ac2e95e 100644 --- a/crates/devup-mcp/Cargo.toml +++ b/crates/devup-mcp/Cargo.toml @@ -10,9 +10,11 @@ repository.workspace = true [dependencies] anyhow.workspace = true async-trait.workspace = true +base64.workspace = true devup-mcp-devup-ui = { path = "../devup-mcp-devup-ui" } devup-mcp-figma = { path = "../devup-mcp-figma" } rmcp.workspace = true +rand.workspace = true schemars.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/devup-mcp/src/server/handoff.rs b/crates/devup-mcp/src/server/handoff.rs new file mode 100644 index 0000000..94c48bd --- /dev/null +++ b/crates/devup-mcp/src/server/handoff.rs @@ -0,0 +1,315 @@ +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_figma::{ + CollectedParts, CollectorSession, CollectorStep, DevupError, ErrorCode, UpstreamResult, +}; +use rand::RngCore; +use serde_json::{Value, json}; +use tokio::sync::Mutex; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PendingOperation { + Collect, + ToUi { + component_name: Option, + include_diagnostics: bool, + }, + ToJson { + scope: String, + include_diagnostics: bool, + }, +} + +#[derive(Debug, Clone)] +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 { + 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 index f950ff3..224d4db 100644 --- a/crates/devup-mcp/src/server/mod.rs +++ b/crates/devup-mcp/src/server/mod.rs @@ -1,3 +1,4 @@ +pub mod handoff; mod tools; use std::sync::Arc; 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); +} From 21e0bb4db770fb4c4f2340e3bf66ba563ef86448 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 02:42:46 +0900 Subject: [PATCH 23/97] feat: add figma source fallback orchestration --- crates/devup-mcp/src/server/handoff.rs | 4 +- crates/devup-mcp/src/server/mod.rs | 345 ++++++++++++---- crates/devup-mcp/src/server/tools.rs | 18 + .../devup-mcp/tests/downstream_integration.rs | 24 +- .../devup-mcp/tests/source_orchestration.rs | 387 ++++++++++++++++++ crates/devup-mcp/tests/stdio_tools.rs | 30 +- 6 files changed, 729 insertions(+), 79 deletions(-) create mode 100644 crates/devup-mcp/tests/source_orchestration.rs diff --git a/crates/devup-mcp/src/server/handoff.rs b/crates/devup-mcp/src/server/handoff.rs index 94c48bd..2139c42 100644 --- a/crates/devup-mcp/src/server/handoff.rs +++ b/crates/devup-mcp/src/server/handoff.rs @@ -9,6 +9,7 @@ use devup_mcp_figma::{ CollectedParts, CollectorSession, CollectorStep, DevupError, ErrorCode, UpstreamResult, }; use rand::RngCore; +use serde::Serialize; use serde_json::{Value, json}; use tokio::sync::Mutex; @@ -25,7 +26,8 @@ pub enum PendingOperation { }, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] pub struct HandoffCall { pub call_id: String, pub server: &'static str, diff --git a/crates/devup-mcp/src/server/mod.rs b/crates/devup-mcp/src/server/mod.rs index 224d4db..a9d0051 100644 --- a/crates/devup-mcp/src/server/mod.rs +++ b/crates/devup-mcp/src/server/mod.rs @@ -20,12 +20,15 @@ use devup_mcp_devup_ui::{ theme::{ThemeScope, generate_devup_json, variable_snapshot_from_result}, }; use devup_mcp_figma::{ - AuthStatus, BuiltinScript, CredentialStore, DevupError, ErrorCode, FigmaTarget, FigmaUpstream, - KeyringCredentialStore, OAuthManager, ReadToolCall, RemoteFigmaClient, SystemBrowser, - merge_chunks, snapshot_chunk_from_result, + AuthStatus, CollectedParts, CollectedPayload, CollectionRequest, CollectionScope, + CollectorSession, CollectorStep, CredentialStore, DevupError, ErrorCode, FigmaTarget, + FigmaUpstream, KeyringCredentialStore, OAuthManager, RemoteFigmaClient, SourcePolicy, + SystemBrowser, fallback_allowed_for_error, }; -pub use tools::{AuthInput, FigmaToJsonInput, FigmaToUiInput}; +use handoff::{HandoffStep, HandoffStore, PendingOperation}; + +pub use tools::{AuthInput, ContinueInput, FigmaToJsonInput, FigmaToUiInput}; const FIGMA_ENDPOINT: &str = "https://mcp.figma.com/mcp"; @@ -75,6 +78,7 @@ impl Services { pub struct DevupServer { tool_router: ToolRouter, services: Services, + handoffs: HandoffStore, } impl DevupServer { @@ -82,15 +86,9 @@ impl DevupServer { Self { tool_router: Self::tool_router(), services, + handoffs: HandoffStore::default(), } } - - async fn ensure_authenticated(&self) -> Result<(), ErrorData> { - if self.services.auth.status().await.map_err(to_mcp_error)? == AuthStatus::Disconnected { - self.services.auth.login().await.map_err(to_mcp_error)?; - } - Ok(()) - } } impl Default for DevupServer { @@ -99,6 +97,67 @@ impl Default for DevupServer { } } +impl DevupServer { + async fn start_operation( + &self, + operation: PendingOperation, + request: CollectionRequest, + policy: SourcePolicy, + ) -> Result { + if policy == SourcePolicy::Host { + return self.begin_handoff(operation, request).await; + } + + let auth_status = self.services.auth.status().await?; + if auth_status == AuthStatus::Disconnected { + if policy == SourcePolicy::Auto { + return self.begin_handoff(operation, request).await; + } + return Err(DevupError::with_details( + ErrorCode::DevupAuthRequired, + "Figma direct 연결을 사용하려면 devup_figma_auth login이 필요합니다.", + false, + json!({"source": "direct"}), + )); + } + + match self.run_direct(request.clone()).await { + Ok(parts) => complete_operation(operation, parts, "direct"), + Err(error) if fallback_allowed_for_error(policy, &error) => { + self.begin_handoff(operation, request).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 result = self.services.upstream.call_read_tool(planned.call).await?; + collector.accept(&planned.id, result)?; + } + CollectorStep::AwaitingResults => continue, + CollectorStep::Complete(parts) => return Ok(*parts), + } + } + } + + async fn begin_handoff( + &self, + operation: PendingOperation, + request: CollectionRequest, + ) -> Result { + let session_id = self + .handoffs + .begin(operation, CollectorSession::new(request)) + .await?; + let step = self.handoffs.next(&session_id).await?; + handoff_step_to_value(step, "host") + } +} + #[tool_router] impl DevupServer { #[tool(description = "Check, start, or clear Figma Remote MCP OAuth")] @@ -128,51 +187,28 @@ impl DevupServer { Parameters(input): Parameters, ) -> Result, ErrorData> { let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; - let node_id = target.node_id.clone().ok_or_else(|| { + target.node_id.as_ref().ok_or_else(|| { to_mcp_error(DevupError::new( ErrorCode::DevupFigmaNodeNotFound, "UI 변환 링크에는 node-id가 필요합니다.", false, )) })?; - self.ensure_authenticated().await?; + 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 request = CollectionRequest::new(target, scope); let result = self - .services - .upstream - .call_read_tool(ReadToolCall::snapshot( - &target.file_key, - &node_id, - BuiltinScript::NodeSnapshot, - )) + .start_operation( + PendingOperation::ToUi { + component_name: input.component_name, + include_diagnostics: input.include_diagnostics, + }, + request, + policy, + ) .await .map_err(to_mcp_error)?; - let chunk = snapshot_chunk_from_result(&result).map_err(to_mcp_error)?; - let snapshot = merge_chunks(vec![chunk]).map_err(to_mcp_error)?; - let output = generate_component( - &snapshot, - &node_id, - &CodegenOptions { - component_name: input.component_name, - include_diagnostics: input.include_diagnostics, - }, - ) - .map_err(to_mcp_error)?; - let diagnostics = if input.include_diagnostics { - output.diagnostics - } else { - Vec::new() - }; - Ok(Json(json!({ - "tsx": output.tsx, - "imports": output.imports, - "usedTokens": output.used_tokens, - "diagnostics": diagnostics, - "source": { "fileKey": target.file_key, "nodeId": node_id, "version": snapshot.version }, - "snapshot": { - "preservedNodeCount": snapshot.nodes.len(), - "fieldErrorCount": snapshot.nodes.values().map(|node| node.field_errors.len()).sum::() - } - }))) + Ok(Json(result)) } #[tool(description = "Convert Figma variables and styles to deterministic devup.json")] @@ -181,33 +217,202 @@ impl DevupServer { Parameters(input): Parameters, ) -> Result, ErrorData> { let target = FigmaTarget::parse(&input.url).map_err(to_mcp_error)?; - let scope = parse_scope(&input.scope).map_err(to_mcp_error)?; - self.ensure_authenticated().await?; + 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 mut request = CollectionRequest::new(target, collection_scope); + request.include_variables = true; let result = self - .services - .upstream - .call_read_tool(ReadToolCall::snapshot( - &target.file_key, - target.node_id.as_deref().unwrap_or("0:0"), - BuiltinScript::LocalVariables, - )) + .start_operation( + PendingOperation::ToJson { + scope: input.scope, + include_diagnostics: input.include_diagnostics, + }, + request, + policy, + ) .await .map_err(to_mcp_error)?; - let variables = variable_snapshot_from_result(&result).map_err(to_mcp_error)?; - let output = generate_devup_json(&variables, scope).map_err(to_mcp_error)?; - let diagnostics = if input.include_diagnostics { - output.diagnostics - } else { - Vec::new() - }; - Ok(Json(json!({ - "devupJson": output.json, - "counts": output.counts, - "completeness": output.completeness, - "diagnostics": diagnostics, - "source": { "fileKey": target.file_key, "nodeId": target.node_id } - }))) + Ok(Json(result)) } + + #[tool(description = "Continue a read-only Figma host handoff with an official MCP result")] + async fn devup_figma_continue( + &self, + Parameters(input): Parameters, + ) -> Result, ErrorData> { + 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(Json( + handoff_step_to_value(step, "host").map_err(to_mcp_error)?, + )) + } +} + +fn handoff_step_to_value(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 } => complete_operation(operation, *parts, source), + } +} + +fn complete_operation( + operation: PendingOperation, + parts: CollectedParts, + source_kind: &str, +) -> Result { + let payload = CollectedPayload::try_from(parts)?; + match operation { + PendingOperation::ToUi { + component_name, + include_diagnostics, + } => { + 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, + }, + )?; + let diagnostics = if include_diagnostics { + output.diagnostics + } else { + Vec::new() + }; + Ok(json!({ + "status": "complete", + "tsx": output.tsx, + "imports": output.imports, + "usedTokens": output.used_tokens, + "diagnostics": diagnostics, + "completeness": payload.completeness, + "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::() + } + })) + } + PendingOperation::ToJson { + scope, + include_diagnostics, + } => { + 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 diagnostics = if include_diagnostics { + output.diagnostics + } else { + Vec::new() + }; + Ok(json!({ + "status": "complete", + "devupJson": output.json, + "counts": output.counts, + "completeness": output.completeness, + "diagnostics": diagnostics, + "source": { + "kind": source_kind, + "fileKey": payload.target.file_key, + "nodeId": payload.target.node_id, + "version": payload.snapshot.version + } + })) + } + PendingOperation::Collect => Err(DevupError::new( + ErrorCode::DevupFigmaHandoffInvalid, + "내부 수집 operation은 MCP artifact로 완료할 수 없습니다.", + false, + )), + } +} + +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, + )), + } +} + +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, + )), + } +} + +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 { diff --git a/crates/devup-mcp/src/server/tools.rs b/crates/devup-mcp/src/server/tools.rs index 893cbee..67a8e1a 100644 --- a/crates/devup-mcp/src/server/tools.rs +++ b/crates/devup-mcp/src/server/tools.rs @@ -15,6 +15,10 @@ pub struct FigmaToUiInput { 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, } #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] @@ -25,8 +29,22 @@ pub struct FigmaToJsonInput { pub scope: String, #[serde(default)] pub include_diagnostics: bool, + #[serde(default = "default_source_policy")] + pub source_policy: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct ContinueInput { + pub session_id: String, + pub call_id: String, + pub result: serde_json::Value, } fn default_scope() -> String { "node".to_owned() } + +fn default_source_policy() -> String { + "auto".to_owned() +} diff --git a/crates/devup-mcp/tests/downstream_integration.rs b/crates/devup-mcp/tests/downstream_integration.rs index 30eb03f..d6fc526 100644 --- a/crates/devup-mcp/tests/downstream_integration.rs +++ b/crates/devup-mcp/tests/downstream_integration.rs @@ -38,6 +38,21 @@ impl FigmaUpstream for FixtureUpstream { 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, .. @@ -120,16 +135,17 @@ impl DevupAuth for LoginAuth { } #[tokio::test] -async fn conversion_starts_oauth_when_credentials_are_missing() -> anyhow::Result<()> { +async fn conversion_returns_host_handoff_without_starting_oauth() -> anyhow::Result<()> { let auth = Arc::new(LoginAuth::default()); - call_tool_with_auth( + 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!(auth.logins.load(Ordering::SeqCst), 1); + assert_eq!(output["status"], "needs_figma"); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); Ok(()) } @@ -144,6 +160,7 @@ async fn converts_a_figma_link_to_structured_devup_ui() -> anyhow::Result<()> { ) .await?; + assert_eq!(result["status"], "complete"); assert!( result["tsx"] .as_str() @@ -167,6 +184,7 @@ async fn converts_figma_variables_to_structured_devup_json() -> anyhow::Result<( ) .await?; + assert_eq!(result["status"], "complete"); assert!( result["devupJson"] .as_str() diff --git a/crates/devup-mcp/tests/source_orchestration.rs b/crates/devup-mcp/tests/source_orchestration.rs new file mode 100644 index 0000000..cb5da09 --- /dev/null +++ b/crates/devup-mcp/tests/source_orchestration.rs @@ -0,0 +1,387 @@ +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, +} + +#[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 { + 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("devup_figma_to_ui").with_arguments(arguments)) + .await?; + client.cancel().await?; + task.await??; + Ok(result) +} + +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", "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", "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"], "get_metadata"); + 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!(output["tsx"].as_str().unwrap().contains("SyntheticFrame")); + assert_eq!(upstream.calls.load(Ordering::SeqCst), 2); + assert_eq!(auth.logins.load(Ordering::SeqCst), 0); + 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 metadata_call = start["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")); + + 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 metadata_call = start["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"] { + 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_tools.rs b/crates/devup-mcp/tests/stdio_tools.rs index 441bbba..4c76b75 100644 --- a/crates/devup-mcp/tests/stdio_tools.rs +++ b/crates/devup-mcp/tests/stdio_tools.rs @@ -2,7 +2,7 @@ use devup_mcp::server::DevupServer; use rmcp::ServiceExt; #[tokio::test] -async fn exposes_only_the_three_devup_figma_tools() -> anyhow::Result<()> { +async fn exposes_only_the_four_devup_figma_tools() -> anyhow::Result<()> { let (server_transport, client_transport) = tokio::io::duplex(16 * 1024); let server = tokio::spawn(async move { DevupServer::default() @@ -14,10 +14,9 @@ async fn exposes_only_the_three_devup_figma_tools() -> anyhow::Result<()> { }); let client = ().serve(client_transport).await?; - let mut names = client - .list_all_tools() - .await? - .into_iter() + let tools = client.list_all_tools().await?; + let mut names = tools + .iter() .map(|tool| tool.name.to_string()) .collect::>(); names.sort(); @@ -26,11 +25,32 @@ async fn exposes_only_the_three_devup_figma_tools() -> anyhow::Result<()> { names, [ "devup_figma_auth", + "devup_figma_continue", "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("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(()) From 74a72db5e60e1b3e67c9db4465c72ed3813dbfa6 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 03:19:08 +0900 Subject: [PATCH 24/97] feat: support real figma collection envelopes --- Cargo.lock | 10 + Cargo.toml | 1 + README.md | 20 +- crates/devup-mcp-figma/Cargo.toml | 1 + crates/devup-mcp-figma/src/collector.rs | 90 ++++++++- crates/devup-mcp-figma/src/lib.rs | 2 + crates/devup-mcp-figma/src/metadata.rs | 166 ++++++++++++++++- .../devup-mcp-figma/src/scripts/snapshot.js | 2 +- .../src/scripts/variable_catalog.js | 49 +++++ .../devup-mcp-figma/src/scripts/variables.js | 56 +++--- crates/devup-mcp-figma/src/upstream.rs | 43 ++++- crates/devup-mcp-figma/src/variables.rs | 114 ++++++++++++ crates/devup-mcp-figma/tests/collector.rs | 171 +++++++++++++++++- .../tests/upstream_contract.rs | 6 +- .../devup-mcp/tests/downstream_integration.rs | 19 +- crates/devup-mcp/tests/live_figma_contract.rs | 64 +++++++ 16 files changed, 745 insertions(+), 69 deletions(-) create mode 100644 crates/devup-mcp-figma/src/scripts/variable_catalog.js create mode 100644 crates/devup-mcp-figma/src/variables.rs create mode 100644 crates/devup-mcp/tests/live_figma_contract.rs diff --git a/Cargo.lock b/Cargo.lock index ca8f63f..8ff239e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -597,6 +597,7 @@ dependencies = [ "axum", "base64 0.22.1", "keyring", + "quick-xml", "rand 0.9.5", "reqwest 0.12.28", "rmcp", @@ -1712,6 +1713,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.11" diff --git a/Cargo.toml b/Cargo.toml index cf21aca..3dfafcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ axum = "0.8" base64 = "0.22" keyring = "4.2" rand = "0.9" +quick-xml = "0.38" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } rmcp = { version = "3.1", features = ["server", "transport-io", "client", "transport-streamable-http-client-reqwest", "auth", "reqwest"] } schemars = "1" diff --git a/README.md b/README.md index 8d44ad5..f5d2e7b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Rust-native MCP server that reads Figma designs and generates DevupUI artifacts. - `devup_figma_auth`: Figma 연결 상태 확인, 브라우저 OAuth 로그인, 로그아웃 - `devup_figma_to_ui`: Figma node 링크를 `@devup-ui/react` TSX로 변환 - `devup_figma_to_json`: Figma 변수와 로컬 스타일을 `devup.json`으로 변환 +- `devup_figma_continue`: host가 실행한 공식 Figma MCP read 결과로 중단된 변환을 재개 - Figma Plugin API의 readable data property를 raw JSON으로 보존하고, 알려지지 않은 runtime field는 `extra`, 실패한 getter는 `fieldErrors`로 유지 Figma PAT, 사용자가 만든 OAuth app, 내장 client secret은 필요하지 않습니다. Figma Remote MCP의 OAuth discovery, Dynamic Client Registration, PKCE S256과 일시적인 `127.0.0.1` callback을 사용합니다. @@ -44,7 +45,7 @@ stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. } ``` -최초 `devup_figma_auth`의 `login` 호출 또는 인증이 필요한 변환 호출에서 시스템 브라우저로 Figma 승인을 완료합니다. 인증 정보는 운영체제 credential store에만 저장되며 `logout`은 해당 정보만 삭제합니다. +시스템 브라우저는 `devup_figma_auth`의 `login`을 명시적으로 호출할 때만 열립니다. 일반 변환의 기본 `auto` 정책은 direct credential이 없거나 Catalog/capability가 허용되지 않으면 브라우저를 열지 않고 공식 Figma MCP handoff를 반환합니다. 인증 정보는 운영체제 credential store에만 저장되며 `logout`은 해당 정보만 삭제합니다. ### 인증 @@ -60,7 +61,9 @@ stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. { "url": "https://www.figma.com/design//?node-id=1-2", "componentName": "OptionalComponentName", - "includeDiagnostics": true + "includeDiagnostics": true, + "sourcePolicy": "auto", + "scope": "node" } ``` @@ -72,12 +75,15 @@ stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. { "url": "https://www.figma.com/design//?node-id=1-2", "scope": "file", - "includeDiagnostics": true + "includeDiagnostics": true, + "sourcePolicy": "auto" } ``` 결과는 `theme.colors`, `theme.typography`, `theme.length`, `theme.shadow`를 포함하는 결정적 JSON 문자열과 counts, completeness를 반환합니다. +`sourcePolicy`는 `auto`, `direct`, `host` 중 하나입니다. `needs_figma` 응답의 read-only call을 host의 공식 Figma MCP에서 실행한 뒤 원본 result를 `devup_figma_continue`의 `sessionId`, `callId`, `result`로 전달하면 동일한 Rust collector가 이어서 처리합니다. session은 메모리에만 최대 10분 유지되며 완료·오류·만료 시 제거됩니다. + 완전성 등급은 다음과 같습니다. - `full-local-plus-used-remote`: 로컬 전체와 사용된 외부 token을 모두 확인 @@ -93,13 +99,19 @@ stdio MCP를 지원하는 클라이언트에 다음과 같이 등록합니다. - Figma snapshot과 screenshot을 기본적으로 디스크에 저장하지 않습니다. - test fixture는 합성 데이터만 사용합니다. +### 실제 Figma JSON contract gate + +`crates/devup-mcp/tests/live_figma_contract.rs`는 기본적으로 ignore됩니다. `DEVUP_MCP_LIVE_FIGMA=1`을 설정하고 공식 MCP의 `get_metadata`, 내장 node snapshot, variable/style catalog, resource batch 결과를 호출 순서대로 stdin에 전달하면 실제 payload를 디스크에 쓰거나 출력하지 않고 serde round-trip, 요청 context, node 존재, 변수/style parser를 검증하고 값이 제거된 `PayloadStructure`만 출력합니다. + +실제 확인된 공식 metadata는 XML text content envelope이며, local 변수/style은 catalog 후 resource 단위로 수집합니다. resource 단위 분할은 exhaustive style payload가 MCP text 출력 한도를 넘지 않게 하며, 공식 MCP seat/plan quota가 소진되면 live gate는 rate-limit 오류로 중단되고 committed offline fixture test에는 영향을 주지 않습니다. + ## Snapshot 의미와 현재 한계 Figma Remote MCP에서는 `JSON_REST_V1` export가 허용되지 않으므로 host object를 그대로 REST JSON으로 만들 수 없습니다. 대신 checked-in property manifest와 runtime prototype/enumerable 탐색을 함께 사용해 모든 읽을 수 있는 data field를 보존합니다. 함수, 순환 node object는 제외하거나 id로 바꾸고, binary asset은 bytes 대신 metadata로 나타내며, 타 plugin private data와 오류를 내는 getter는 읽을 수 없습니다. 현재 private MVP의 남은 한계는 다음과 같습니다. -- 큰 page/file snapshot의 metadata 기반 chunk fan-out은 후속 최적화가 필요합니다. +- 공식 `get_metadata`의 page/file 전체 탐색은 node XML과 다른 top-level page 목록 envelope를 사용하므로 추가 live 검증이 필요합니다. - 사용되지 않은 외부 Figma library 변수 전체는 Remote MCP가 제공하지 않을 수 있습니다. - node/page theme scope는 로컬 변수 API의 file-wide 결과를 기반으로 하며 세밀한 사용 범위 필터는 후속 보강 대상입니다. - vector, mask, image, absolute layout과 일부 effect는 diagnostics를 포함한 제한적 fallback입니다. diff --git a/crates/devup-mcp-figma/Cargo.toml b/crates/devup-mcp-figma/Cargo.toml index 1b254f2..3c794cd 100644 --- a/crates/devup-mcp-figma/Cargo.toml +++ b/crates/devup-mcp-figma/Cargo.toml @@ -13,6 +13,7 @@ axum.workspace = true base64.workspace = true keyring.workspace = true rand.workspace = true +quick-xml.workspace = true reqwest.workspace = true rmcp.workspace = true serde.workspace = true diff --git a/crates/devup-mcp-figma/src/collector.rs b/crates/devup-mcp-figma/src/collector.rs index 9c1d9ca..73902bc 100644 --- a/crates/devup-mcp-figma/src/collector.rs +++ b/crates/devup-mcp-figma/src/collector.rs @@ -4,12 +4,19 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use crate::{ - BuiltinScript, DevupError, ErrorCode, FigmaTarget, ReadToolCall, SnapshotChunk, UpstreamResult, - metadata::metadata_from_result, snapshot_chunk_from_result, + BuiltinScript, DevupError, ErrorCode, FigmaTarget, ReadToolCall, ResourceBatch, + ResourceStyleRef, SnapshotChunk, UpstreamResult, + metadata::metadata_from_result_for_target, + snapshot_chunk_from_result, + variables::{ + VariableBatchResult, VariableCatalog, batch_from_result, catalog_from_result, + merge_variable_results, + }, }; const LARGE_SUBTREE_THRESHOLD: usize = 200; const MAX_PENDING_CALLS: usize = 4; +const VARIABLE_BATCH_SIZE: usize = 1; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -68,7 +75,8 @@ pub enum CollectorStep { enum CallKind { Metadata, Snapshot, - Variables, + VariableCatalog, + VariableBatch, } #[derive(Debug, Clone)] @@ -88,6 +96,8 @@ pub struct CollectorSession { root_node_id: Option, source_version: Option, snapshot_chunks: BTreeMap, + variable_catalog: Option, + variable_batches: BTreeMap, variables: Option, next_id: usize, completed: bool, @@ -104,6 +114,8 @@ impl CollectorSession { root_node_id: None, source_version: None, snapshot_chunks: BTreeMap::new(), + variable_catalog: None, + variable_batches: BTreeMap::new(), variables: None, next_id: 0, completed: false, @@ -133,6 +145,7 @@ impl CollectorSession { } if self.metadata.is_some() && self.request.include_variables + && self.variable_catalog.is_none() && self.variables.is_none() && self.queued.is_empty() { @@ -144,13 +157,28 @@ impl CollectorSession { ReadToolCall::snapshot( &self.request.target.file_key, &node_id, - BuiltinScript::LocalVariables, + BuiltinScript::VariableCatalog, ), Some(node_id), - CallKind::Variables, + CallKind::VariableCatalog, ); return self.advance(); } + if self.metadata.is_some() + && self.request.include_variables + && 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.queued.is_empty() { self.completed = true; return Ok(CollectorStep::Complete(Box::new(CollectedParts { @@ -177,15 +205,21 @@ impl CollectorSession { match pending.kind { CallKind::Metadata => self.accept_metadata(result), CallKind::Snapshot => self.accept_snapshot(&pending.planned, pending.order, result), - CallKind::Variables => { - self.variables = Some(result); + CallKind::VariableCatalog => self.accept_variable_catalog(result), + CallKind::VariableBatch => { + self.variable_batches + .insert(pending.order, batch_from_result(&result)?); Ok(()) } } } fn accept_metadata(&mut self, result: UpstreamResult) -> Result<(), DevupError> { - let document = metadata_from_result(&result)?; + let document = metadata_from_result_for_target( + &result, + &self.request.target.file_key, + self.request.target.node_id.as_deref(), + )?; if document.file_key != self.request.target.file_key { return Err(invalid_call("Figma metadata의 file key가 요청과 다릅니다.")); } @@ -245,6 +279,40 @@ impl CollectorSession { 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가 없습니다."))?; + let resources = catalog + .variable_ids + .iter() + .cloned() + .map(ResourceItem::Variable) + .chain(catalog.styles.iter().cloned().map(ResourceItem::Style)) + .collect::>(); + for chunk in resources.chunks(VARIABLE_BATCH_SIZE) { + let mut batch = ResourceBatch { + variable_ids: Vec::new(), + styles: Vec::new(), + }; + for resource in chunk { + match resource { + ResourceItem::Variable(id) => batch.variable_ids.push(id.clone()), + ResourceItem::Style(style) => batch.styles.push(style.clone()), + } + } + self.enqueue( + ReadToolCall::resource_batch(&self.request.target.file_key, &node_id, batch), + Some(node_id.clone()), + CallKind::VariableBatch, + ); + } + self.variable_catalog = Some(catalog); + Ok(()) + } + fn enqueue(&mut self, call: ReadToolCall, expected_node_id: Option, kind: CallKind) { let order = self.next_id; let id = format!("call-{order}"); @@ -262,6 +330,12 @@ impl CollectorSession { } } +#[derive(Debug, Clone)] +enum ResourceItem { + Variable(String), + Style(ResourceStyleRef), +} + fn invalid_call(message: &str) -> DevupError { DevupError::new(ErrorCode::DevupFigmaHandoffInvalid, message, false) } diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index d193f35..3332599 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -7,6 +7,7 @@ mod snapshot; mod source; mod upstream; mod url; +mod variables; pub use credentials::{ CredentialStore, KeyringCredentialStore, MemoryCredentialStore, StoredAuthorization, @@ -27,6 +28,7 @@ pub use source::{ }; pub use upstream::{BuiltinScript, FigmaUpstream, ReadToolCall, RemoteFigmaClient, UpstreamResult}; pub use url::FigmaTarget; +pub use variables::{ResourceBatch, ResourceStyleRef}; mod metadata; pub use collector::{ CollectedParts, CollectionRequest, CollectionScope, CollectorSession, CollectorStep, diff --git a/crates/devup-mcp-figma/src/metadata.rs b/crates/devup-mcp-figma/src/metadata.rs index 0c6fb10..a18cba6 100644 --- a/crates/devup-mcp-figma/src/metadata.rs +++ b/crates/devup-mcp-figma/src/metadata.rs @@ -1,3 +1,4 @@ +use quick_xml::{Reader, events::Event}; use serde::Deserialize; use serde_json::Value; @@ -21,6 +22,8 @@ pub struct MetadataNode { #[serde(rename = "type")] pub node_type: String, #[serde(default)] + pub name: Option, + #[serde(default)] pub children_ids: Vec, #[serde(default)] pub descendant_count: usize, @@ -32,16 +35,165 @@ impl MetadataDocument { } } -pub fn metadata_from_result(result: &UpstreamResult) -> Result { - find_metadata(&result.raw).ok_or_else(|| { - DevupError::new( - ErrorCode::DevupSnapshotUnsupported, - "Figma MCP 응답에서 metadata를 찾지 못했습니다.", - false, - ) +pub fn metadata_from_result_for_target( + result: &UpstreamResult, + expected_file_key: &str, + expected_root_id: Option<&str>, +) -> Result { + find_metadata(&result.raw) + .or_else(|| find_xml_metadata(&result.raw, expected_file_key, expected_root_id)) + .ok_or_else(|| { + DevupError::new( + ErrorCode::DevupSnapshotUnsupported, + "Figma MCP 응답에서 metadata를 찾지 못했습니다.", + false, + ) + }) +} + +#[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( + &reader, + &element, + &mut nodes, + stack.last().copied().flatten(), + ); + stack.push(index); + } + Event::Empty(element) => { + push_xml_node( + &reader, + &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( + reader: &Reader<&[u8]>, + 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 == b"id" || key == b"name" { + let value = attribute + .decode_and_unescape_value(reader.decoder()) + .ok()? + .into_owned(); + if key == b"id" { + id = Some(value); + } else { + name = Some(value); + } + } + } + let id = id?; + let index = nodes.len(); + nodes.push(XmlNode { + id, + node_type: String::from_utf8_lossy(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() diff --git a/crates/devup-mcp-figma/src/scripts/snapshot.js b/crates/devup-mcp-figma/src/scripts/snapshot.js index 1915319..82863a0 100644 --- a/crates/devup-mcp-figma/src/scripts/snapshot.js +++ b/crates/devup-mcp-figma/src/scripts/snapshot.js @@ -21,7 +21,7 @@ function serialize(value, seen = new WeakSet(), depth = 0) { 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" && typeof value.id === "string" && typeof value.type === "string") { + 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)); 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 index f8813c5..05e729b 100644 --- a/crates/devup-mcp-figma/src/scripts/variables.js +++ b/crates/devup-mcp-figma/src/scripts/variables.js @@ -1,9 +1,17 @@ +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 null; - if (["function", "symbol"].includes(typeof value)) return undefined; + 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 = {}; @@ -17,7 +25,7 @@ function serialize(value, seen = new WeakSet(), depth = 0) { if (name.startsWith("_") || ["parent", "children"].includes(name)) continue; try { const serialized = serialize(value[name], seen, depth + 1); - if (typeof serialized !== "undefined") result[name] = serialized; + if (!(serialized && serialized.$unsupported === "function")) result[name] = serialized; } catch (error) { result[name] = { $error: String(error && error.message ? error.message : error) }; } @@ -26,31 +34,25 @@ function serialize(value, seen = new WeakSet(), depth = 0) { return result; } -const collections = (await figma.variables.getLocalVariableCollectionsAsync()).map(serialize); -const variables = (await figma.variables.getLocalVariablesAsync()).map(serialize); -const styleGroups = await Promise.all([ - figma.getLocalPaintStylesAsync(), - figma.getLocalTextStylesAsync(), - figma.getLocalEffectStylesAsync(), - figma.getLocalGridStylesAsync() +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 styleTypes = ["PAINT", "TEXT", "EFFECT", "GRID"]; -const styles = styleGroups.flatMap((group, index) => group.map((style) => ({ - ...serialize(style), - styleType: styleTypes[index], - value: serialize( - styleTypes[index] === "PAINT" ? style.paints - : styleTypes[index] === "EFFECT" ? style.effects - : styleTypes[index] === "GRID" ? style.layoutGrids - : style - ) -}))); +const styleTypes = new Map(resources.styles.map((style) => [style.id, style.styleType])); return { - collections, - variables, - styles, - usedRemoteVariables: [], - localComplete: true, - usedRemoteComplete: false + variables: variableValues.filter(Boolean).map((value) => serialize(value)), + styles: styleValues.filter(Boolean).map((style) => { + const styleType = styleTypes.get(style.id); + return { + ...serialize(style), + styleType, + value: serialize( + styleType === "PAINT" ? style.paints + : styleType === "EFFECT" ? style.effects + : styleType === "GRID" ? style.layoutGrids + : style + ) + }; + }) }; diff --git a/crates/devup-mcp-figma/src/upstream.rs b/crates/devup-mcp-figma/src/upstream.rs index 63f853c..bde522b 100644 --- a/crates/devup-mcp-figma/src/upstream.rs +++ b/crates/devup-mcp-figma/src/upstream.rs @@ -10,8 +10,8 @@ use serde::{Deserialize, Serialize}; use serde_json::{Map, Value, json}; use super::{ - CredentialStore, DevupError, OAuthManager, UpstreamFailureContext, UpstreamFailureKind, - upstream_failure_error, + CredentialStore, DevupError, OAuthManager, ResourceBatch, UpstreamFailureContext, + UpstreamFailureKind, upstream_failure_error, }; const DEFAULT_FIGMA_MCP_ENDPOINT: &str = "https://mcp.figma.com/mcp"; @@ -20,20 +20,31 @@ const MAX_SSE_EVENT_SIZE: usize = 16 * 1024 * 1024; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BuiltinScript { NodeSnapshot, + VariableCatalog, LocalVariables, } impl BuiltinScript { - fn source(self, node_id: &str) -> String { + fn source(self, node_id: &str, resources: Option<&ResourceBatch>) -> String { 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::VariableCatalog => include_str!("scripts/variable_catalog.js"), Self::LocalVariables => include_str!("scripts/variables.js"), }; - source.replace("\"__DEVUP_NODE_ID__\"", &node_id).replace( - "\"__DEVUP_PLUGIN_API_MANIFEST__\"", - include_str!("plugin_api_manifest.json"), - ) + let empty_resources = ResourceBatch { + variable_ids: Vec::new(), + styles: Vec::new(), + }; + let resources = serde_json::to_string(resources.unwrap_or(&empty_resources)) + .expect("resource batch serializes"); + source + .replace("\"__DEVUP_NODE_ID__\"", &node_id) + .replace( + "\"__DEVUP_PLUGIN_API_MANIFEST__\"", + include_str!("plugin_api_manifest.json"), + ) + .replace("\"__DEVUP_RESOURCE_BATCH__\"", &resources) } } @@ -63,6 +74,7 @@ pub enum ReadToolCall { file_key: String, node_id: String, script: BuiltinScript, + resources: Option, }, } @@ -111,6 +123,20 @@ impl ReadToolCall { file_key: file_key.into(), node_id: node_id.into(), script, + resources: None, + } + } + + 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), } } @@ -140,10 +166,11 @@ impl ReadToolCall { file_key, node_id, script, + resources, } => json!({ "fileKey": file_key, "nodeId": node_id, - "code": script.source(node_id) + "code": script.source(node_id, resources.as_ref()) }), }; value.as_object().cloned().unwrap_or_default() diff --git a/crates/devup-mcp-figma/src/variables.rs b/crates/devup-mcp-figma/src/variables.rs new file mode 100644 index 0000000..1245fba --- /dev/null +++ b/crates/devup-mcp-figma/src/variables.rs @@ -0,0 +1,114 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; + +use crate::{DevupError, ErrorCode, UpstreamResult}; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ResourceStyleRef { + pub id: String, + pub style_type: String, +} + +#[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 variables: Vec, + #[serde(default)] + pub styles: 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, +) -> UpstreamResult { + let mut variables = Vec::new(); + let mut styles = Vec::new(); + for batch in batches { + variables.extend(batch.variables); + styles.extend(batch.styles); + } + UpstreamResult { + raw: json!({ + "collections": catalog.collections, + "variables": variables, + "styles": styles, + "usedRemoteVariables": [], + "localComplete": catalog.local_complete, + "usedRemoteComplete": catalog.used_remote_complete + }), + } +} + +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, + ) +} diff --git a/crates/devup-mcp-figma/tests/collector.rs b/crates/devup-mcp-figma/tests/collector.rs index 3093e7c..667908e 100644 --- a/crates/devup-mcp-figma/tests/collector.rs +++ b/crates/devup-mcp-figma/tests/collector.rs @@ -49,6 +49,23 @@ fn snapshot(root_id: &str) -> UpstreamResult { } } +fn official_xml_metadata() -> UpstreamResult { + UpstreamResult { + raw: json!({ + "content": [ + { + "type": "text", + "text": "" + }, + { + "type": "text", + "text": "Synthetic guidance that is not metadata" + } + ] + }), + } +} + #[test] fn node_collection_advances_from_metadata_to_snapshot_to_complete() { let request = CollectionRequest::new(target("1:2"), CollectionScope::Node); @@ -190,7 +207,7 @@ fn rejects_unknown_or_replayed_call_ids() { } #[test] -fn variable_collection_runs_after_snapshot_and_preserves_the_raw_result() { +fn variable_collection_uses_catalog_then_batched_resources() { let mut request = CollectionRequest::new(target("1:2"), CollectionScope::Node); request.include_variables = true; let mut collector = CollectorSession::new(request); @@ -208,24 +225,158 @@ fn variable_collection_runs_after_snapshot_and_preserves_the_raw_result() { .accept(&snapshot_call.id, snapshot("1:2")) .unwrap(); - let CollectorStep::Call(variable_call) = collector.advance().unwrap() else { - panic!("variable/style read should follow the snapshot") + 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") }; - assert_eq!(variable_call.call.tool_name(), "use_figma"); - assert_eq!(variable_call.expected_node_id.as_deref(), Some("1:2")); - let raw = UpstreamResult { + 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": "{\"collections\":[],\"variables\":[],\"styles\":[],\"localComplete\":true,\"usedRemoteComplete\":false}" + "text": "{\"variables\":[{\"id\":\"v1\",\"name\":\"Synthetic Variable\"}],\"styles\":[]}" }] }), }; - collector.accept(&variable_call.id, raw.clone()).unwrap(); + 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") }; - assert_eq!(parts.variables, Some(raw.clone())); - assert_eq!(parts.styles, Some(raw)); + 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.include_variables = true; + 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..2) + .map(|index| format!("v{index:02}")) + .collect::>(); + 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!() + }; + collector + .accept( + &second.id, + UpstreamResult { + raw: json!({"variables": [{"id": "v01"}], "styles": []}), + }, + ) + .unwrap(); + collector + .accept( + &first.id, + UpstreamResult { + raw: json!({ + "variables": [{"id": "v00"}], + "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.first().copied(), Some("v00")); + assert_eq!(ids.last().copied(), Some("v01")); } diff --git a/crates/devup-mcp-figma/tests/upstream_contract.rs b/crates/devup-mcp-figma/tests/upstream_contract.rs index d358ac4..7af8a35 100644 --- a/crates/devup-mcp-figma/tests/upstream_contract.rs +++ b/crates/devup-mcp-figma/tests/upstream_contract.rs @@ -73,7 +73,11 @@ fn snapshot_manifest_covers_current_official_node_properties() { #[test] fn built_in_scripts_expose_only_read_operations() { - for script in [BuiltinScript::NodeSnapshot, BuiltinScript::LocalVariables] { + for script in [ + BuiltinScript::NodeSnapshot, + BuiltinScript::VariableCatalog, + BuiltinScript::LocalVariables, + ] { let call = ReadToolCall::snapshot("file-key", "1:2", script); let code = call.arguments()["code"].as_str().unwrap().to_owned(); for write_operation in [ diff --git a/crates/devup-mcp/tests/downstream_integration.rs b/crates/devup-mcp/tests/downstream_integration.rs index d6fc526..4431c5c 100644 --- a/crates/devup-mcp/tests/downstream_integration.rs +++ b/crates/devup-mcp/tests/downstream_integration.rs @@ -66,13 +66,26 @@ impl FigmaUpstream for FixtureUpstream { }], "diagnostics": [] }) } - ReadToolCall::Snapshot { .. } => json!({ - "collections": [{"id": "c", "name": "Theme", "defaultModeId": "m", "modes": [{"modeId": "m", "name": "Default"}]}], + ReadToolCall::Snapshot { + script: devup_mcp_figma::BuiltinScript::VariableCatalog, + .. + } => json!({ + "collections": [{ + "id": "c", "name": "Theme", "defaultModeId": "m", + "modes": [{"modeId": "m", "name": "Default"}] + }], + "variableIds": ["v"], "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}} }], - "styles": [], "usedRemoteVariables": [], "localComplete": true, "usedRemoteComplete": false + "styles": [] }), _ => { return Err(devup_mcp_figma::DevupError::new( 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..dc05471 --- /dev/null +++ b/crates/devup-mcp/tests/live_figma_contract.rs @@ -0,0 +1,64 @@ +use std::io::{self, BufRead}; + +use devup_mcp_devup_ui::theme::variable_snapshot_from_result; +use devup_mcp_figma::{ + CollectedPayload, CollectionRequest, CollectionScope, CollectorSession, CollectorStep, + FigmaTarget, PayloadStructure, UpstreamResult, validate_payload_context, +}; +use serde_json::Value; + +const LIVE_URL: &str = + "https://www.figma.com/design/85CgSws3o5XsLv7aAwWJyS/Fixture?node-id=3879-35481"; + +#[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.include_variables = true; + let mut collector = CollectorSession::new(request); + + let parts = loop { + match collector.advance().expect("advance collector") { + CollectorStep::Call(call) => { + let raw = read_result(&mut input, call.call.tool_name()); + 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!(!payload.snapshot.nodes.is_empty()); + let variable_result = payload.variables.as_ref().expect("variable result"); + let variables = variable_snapshot_from_result(variable_result) + .expect("official variable/style payload must parse"); + assert!(variables.local_complete); + + let structure = PayloadStructure::from_payload(&payload); + println!( + "{}", + serde_json::to_string(&structure).expect("serialize structural report") + ); +} + +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")) +} From 23d6d1912e1ffcac5270dd1eefcebba79cc7c0da Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 03:24:35 +0900 Subject: [PATCH 25/97] test: add production-shaped json fixtures --- Cargo.lock | 62 +++++++ Cargo.toml | 1 + crates/devup-mcp-devup-ui/Cargo.toml | 1 + .../tests/compat_fixtures.rs | 23 +++ .../devup-mcp-devup-ui/tests/support/mod.rs | 166 ++++++++++++++++++ .../cases/codegen/live-shape-smoke.json | 73 ++++++++ .../snapshots/codegen/live-shape-smoke.snap | 13 ++ 7 files changed, 339 insertions(+) create mode 100644 crates/devup-mcp-devup-ui/tests/compat_fixtures.rs create mode 100644 crates/devup-mcp-devup-ui/tests/support/mod.rs create mode 100644 fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/live-shape-smoke.snap diff --git a/Cargo.lock b/Cargo.lock index 8ff239e..cb8a653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -324,6 +324,16 @@ dependencies = [ "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" @@ -444,6 +454,17 @@ 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" @@ -583,6 +604,7 @@ name = "devup-mcp-devup-ui" version = "0.1.0" dependencies = [ "devup-mcp-figma", + "insta", "pretty_assertions", "serde", "serde_json", @@ -672,6 +694,12 @@ 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" @@ -912,6 +940,19 @@ dependencies = [ "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" @@ -1218,6 +1259,21 @@ dependencies = [ "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 = "ipnet" version = "2.12.1" @@ -2445,6 +2501,12 @@ 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 = "slab" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index 3dfafcb..7819dd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ async-trait = "0.1" axum = "0.8" base64 = "0.22" keyring = "4.2" +insta = { version = "1.48.0", features = ["glob", "json"] } rand = "0.9" quick-xml = "0.38" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } diff --git a/crates/devup-mcp-devup-ui/Cargo.toml b/crates/devup-mcp-devup-ui/Cargo.toml index 5e178c0..3a8a689 100644 --- a/crates/devup-mcp-devup-ui/Cargo.toml +++ b/crates/devup-mcp-devup-ui/Cargo.toml @@ -13,4 +13,5 @@ serde.workspace = true serde_json.workspace = true [dev-dependencies] +insta.workspace = true pretty_assertions = "1" 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..a0e96be --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/compat_fixtures.rs @@ -0,0 +1,23 @@ +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) +} + +#[test] +fn production_shaped_json_runs_through_the_converter() { + let case = support::load_case(fixture("codegen/live-shape-smoke.json")) + .expect("production-shaped fixture"); + assert_eq!(case.schema_version, 1); + let output = support::run_case(&case).expect("fixture conversion"); + insta::with_settings!({ + snapshot_path => "../../../fixtures/devup-figma-plugin/snapshots/codegen", + prepend_module_to_snapshot => false, + }, { + insta::assert_json_snapshot!(case.id, output); + }); +} 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..3395ea1 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/support/mod.rs @@ -0,0 +1,166 @@ +#![allow(dead_code)] + +use std::{fs, path::Path}; + +use devup_mcp_devup_ui::{ + codegen::{CodegenOptions, generate_component}, + theme::{ThemeScope, generate_devup_json, variable_snapshot_from_result}, +}; +use devup_mcp_figma::{CollectedPayload, DevupError}; +use serde::Deserialize; +use serde_json::{Value, json}; + +#[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, + 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, +} + +#[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 => { + let output = generate_component( + &case.payload.snapshot, + &case.request.root_id, + &CodegenOptions { + component_name: case.request.component_name.clone(), + include_diagnostics: true, + }, + )?; + 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, + ) + }), + }, + } +} diff --git a/fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json b/fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json new file mode 100644 index 0000000..50b2170 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/live-shape-smoke.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "live-shape-smoke", + "operation": "tsx", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "synthetic live payload contract smoke" + }, + "request": { + "rootId": "fixture:root", + "componentName": "Fixture Card" + }, + "payload": { + "target": { + "fileKey": "fixtureFileKey", + "nodeId": "1:1", + "branchKey": null + }, + "scope": "node", + "metadata": { + "document": { + "id": "fixture:root", + "name": "Fixture Card", + "type": "FRAME" + } + }, + "snapshot": { + "fileKey": "fixtureFileKey", + "version": "fixture-version-1", + "roots": ["fixture:root"], + "nodes": { + "fixture:root": { + "id": "fixture:root", + "type": "FRAME", + "fields": { + "name": "Fixture Card", + "childrenIds": ["fixture:text"], + "layoutMode": "VERTICAL", + "width": 320, + "height": 120, + "itemSpacing": 8, + "paddingTop": 16, + "paddingRight": 16, + "paddingBottom": 16, + "paddingLeft": 16, + "fills": [{"type": "SOLID", "color": {"r": 1, "g": 1, "b": 1}, "opacity": 1}] + }, + "extra": {}, + "fieldErrors": {} + }, + "fixture:text": { + "id": "fixture:text", + "type": "TEXT", + "fields": { + "name": "Title", + "childrenIds": [], + "characters": "Fixture", + "fontSize": 16, + "lineHeight": {"unit": "PIXELS", "value": 24} + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] + }, + "variables": null, + "styles": null, + "completeness": "resolved-values-only", + "sourceVersion": "fixture-version-1" + } +} diff --git a/fixtures/devup-figma-plugin/snapshots/codegen/live-shape-smoke.snap b/fixtures/devup-figma-plugin/snapshots/codegen/live-shape-smoke.snap new file mode 100644 index 0000000..7de1ab6 --- /dev/null +++ b/fixtures/devup-figma-plugin/snapshots/codegen/live-shape-smoke.snap @@ -0,0 +1,13 @@ +--- +source: crates/devup-mcp-devup-ui/tests/compat_fixtures.rs +expression: output +--- +{ + "tsx": "import { Flex, Text } from \"@devup-ui/react\";\n\nexport function FixtureCard() {\n return (\n \n Fixture\n \n );\n}\n", + "imports": [ + "Flex", + "Text" + ], + "usedTokens": [], + "diagnostics": [] +} From e0648ebbe61b31b693630027e7865cd199a3d8cb Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 03:30:29 +0900 Subject: [PATCH 26/97] test: track the complete plugin test corpus --- Cargo.lock | 1 + crates/devup-mcp-devup-ui/Cargo.toml | 1 + .../tests/compat_manifest.rs | 14 + .../devup-mcp-devup-ui/tests/support/mod.rs | 295 +- fixtures/devup-figma-plugin/ledger.json | 6891 +++++++++++++++++ fixtures/devup-figma-plugin/manifest.json | 85 + 6 files changed, 7286 insertions(+), 1 deletion(-) create mode 100644 crates/devup-mcp-devup-ui/tests/compat_manifest.rs create mode 100644 fixtures/devup-figma-plugin/ledger.json create mode 100644 fixtures/devup-figma-plugin/manifest.json diff --git a/Cargo.lock b/Cargo.lock index cb8a653..159e9c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -608,6 +608,7 @@ dependencies = [ "pretty_assertions", "serde", "serde_json", + "sha2 0.10.9", ] [[package]] diff --git a/crates/devup-mcp-devup-ui/Cargo.toml b/crates/devup-mcp-devup-ui/Cargo.toml index 3a8a689..dbb565e 100644 --- a/crates/devup-mcp-devup-ui/Cargo.toml +++ b/crates/devup-mcp-devup-ui/Cargo.toml @@ -15,3 +15,4 @@ serde_json.workspace = true [dev-dependencies] insta.workspace = true pretty_assertions = "1" +sha2.workspace = true 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..03f78fa --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/compat_manifest.rs @@ -0,0 +1,14 @@ +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, 1); + assert_eq!(summary.snapshots, 1); +} diff --git a/crates/devup-mcp-devup-ui/tests/support/mod.rs b/crates/devup-mcp-devup-ui/tests/support/mod.rs index 3395ea1..6ff1be6 100644 --- a/crates/devup-mcp-devup-ui/tests/support/mod.rs +++ b/crates/devup-mcp-devup-ui/tests/support/mod.rs @@ -1,6 +1,10 @@ #![allow(dead_code)] -use std::{fs, path::Path}; +use std::{ + collections::{BTreeMap, BTreeSet}, + fs, + path::{Path, PathBuf}, +}; use devup_mcp_devup_ui::{ codegen::{CodegenOptions, generate_component}, @@ -9,6 +13,7 @@ use devup_mcp_devup_ui::{ 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)] @@ -164,3 +169,291 @@ pub fn run_case(case: &FixtureCase) -> Result { }, } } + +#[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 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, + OutOfScopeWrite, + UpstreamRuntimeOnly, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CorpusSummary { + pub source_files: usize, + pub ledger_entries: usize, + pub cases: usize, + pub snapshots: usize, +} + +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::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 { + Sha256::digest(bytes) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} diff --git a/fixtures/devup-figma-plugin/ledger.json b/fixtures/devup-figma-plugin/ledger.json new file mode 100644 index 0000000..fde1125 --- /dev/null +++ b/fixtures/devup-figma-plugin/ledger.json @@ -0,0 +1,6891 @@ +{ + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-without-treeshaking", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-excel", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-devup-excel-without-treeshaking", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-assets", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > runCommand > dispatches export-pages-and-components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 1]", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_only_use_read_operations", + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 3]", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "upstream_runtime_only", + "fixtureIds": [], + "rustTest": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen > should generate responsive code when root node is SECTION", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > > should run command", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should extract keyframes import when code contains keyframes(", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should extract keyframes import when code contains keyframes`", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractImports > should not extract keyframes when not present", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should extract custom component imports", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should not include devup-ui components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should return empty array when no custom components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should sort custom components alphabetically", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should handle multiple components with same custom component", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > extractCustomComponentImports > should handle nested custom components", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with viewport variant > should generate CLI with custom component imports", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT without variant props", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT with variant props", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should filter reserved variant keys for COMPONENT", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT in COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT_SET with defaults", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should filter reserved variant keys for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should sanitize COMPONENT_SET property names with hash suffixes", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should include BOOLEAN and TEXT properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should skip BOOLEAN with false defaultValue for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should include TEXT properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should skip INSTANCE_SWAP properties for COMPONENT_SET", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should generate usage for COMPONENT_SET without componentPropertyDefinitions", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > generateComponentUsage > should return null for non-component nodes", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for INSTANCE node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for COMPONENT node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/code.test.ts > registerCodegen with usage output > should generate usage for COMPONENT_SET node", + "sourceFile": "src/__tests__/code.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/__tests__/utils.test.ts > space > should create space", + "sourceFile": "src/__tests__/utils.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component without variants [case 1]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders overflow hidden when clipsContent is true", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders objectFit contain for image asset", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders objectFit cover for image asset", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with vector node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with star node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with polygon node", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with ellipse inner radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with non-solid fills", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders asset with single child and fills", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with bound variable color", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with same color mask", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with children same color", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with different color children", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with non-solid fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders svg asset with invisible fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with horizontal MAX constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with horizontal CENTER constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with vertical MAX constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders absolute child with vertical CENTER constraint", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders aspect ratio when provided", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text with special characters", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text with leading and trailing spaces", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders single-line max line props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders multi-line max line props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders fixed size frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with padding", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding shorthand when all sides equal", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding with all sides different", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders padding from inferredAutoLayout", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with border radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders mixed border radius frame", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders ellipse with 50% border radius", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke outline CENTER alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke outline OUTSIDE alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with stroke border INSIDE alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders line with stroke outline", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with dashed stroke", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with section parent", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with maxWidth child width shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with maxHeight child height shrinker", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with individual stroke weights", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders group as Box with full size", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders boxSize when width equals height", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders min/max width/height with px", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders flex auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders grid auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders vstack auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders center auto layout props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders drop shadow effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders inner shadow effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders layer blur effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders background blur effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders noise effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders texture effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders glass effect props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with content", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders another text node with content", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with ellipsis props", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with single drop shadow", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with multiple drop shadows", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with stroke", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with multiple segments", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with unordered list", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with ordered list", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with negative rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with decimal rotation transform", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with opacity less than 1", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with darken blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with multiply blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with screen blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with overlay blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear burn blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color burn blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with lighten blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear dodge blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color dodge blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with soft light blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with hard light blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with difference blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with exclusion blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with hue blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with saturation blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with color blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with luminosity blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pass through blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with opacity and blend mode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders text node with textStyleId and typography", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with linear gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with radial gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with angular gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with diamond gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with image fill TILE scaleMode", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill START alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with pattern fill vertical alignment", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with invisible gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with zero opacity gradient fill", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders frame with solid fill opacity 0", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with variants", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with effect property", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with transition", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component with parent component set", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component set with press trigger", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component with parent component set name", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 1]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 2]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 3]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 4]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 5]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 6]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 7]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 8]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 9]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 10]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 11]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 12]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 13]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 14]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 15]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 16]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 17]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 18]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 19]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 20]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 21]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 22]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 23]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 24]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 25]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 26]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 27]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 28]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 29]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 30]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 31]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 32]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 33]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 34]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 35]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 36]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 37]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 38]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 39]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 40]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 41]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 42]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 43]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 44]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 45]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 46]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 47]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 48]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 49]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 50]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 51]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 52]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 53]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 54]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 55]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 56]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 57]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 58]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 59]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 60]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 61]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 62]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 63]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 64]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 65]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 66]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 67]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 68]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 69]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 70]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 71]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 72]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 73]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 74]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 75]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 76]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 77]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 78]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 79]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 80]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 81]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 82]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 83]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 84]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 85]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 86]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 87]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 88]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 89]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 90]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 91]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 92]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 93]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 94]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 95]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 96]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 97]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 98]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 99]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 100]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 101]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 102]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 103]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 104]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 105]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 106]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 107]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 108]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 109]", + "sourceFile": "src/codegen/__tests__/codegen.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderNode > indents nested children", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/codegen/__tests__/render.test.ts > renderComponent interface snapshot > BOOLEAN-only interface (all optional)", + "sourceFile": "src/codegen/__tests__/render.test.ts", + "classification": "rust_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "testId": "src/commands/__tests__/exportAssets.test.ts > exportAssets > runs Codegen for each selected node", + "sourceFile": "src/commands/__tests__/exportAssets.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportAssets.test.ts > exportAssets > handles empty selection", + "sourceFile": "src/commands/__tests__/exportAssets.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should notify and return if no components found", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should export components and call downloadFile", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportComponents.test.ts > exportComponents > should raise error", + "sourceFile": "src/commands/__tests__/exportComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > DEVUP_COMPONENTS > should contain expected devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract Box import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract multiple devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should extract keyframes import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should not extract keyframes when not present", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should return sorted imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractImports > should not include duplicates", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should extract custom component", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should extract multiple custom components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should not include devup-ui components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should return sorted imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should not include duplicates", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > extractCustomComponentImports > should return empty array when no custom components", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect SVG asset node", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect PNG asset node", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should skip invisible nodes", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should recursively collect from children", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should not descend into asset node children", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should deduplicate by type and name", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect from nested frames", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should collect both SVG and PNG assets", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should skip visited parent node entirely", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectAssetNodes > should work without visited set (backward compatible)", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should generate devup-ui import statement", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should generate custom component import statements", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should return empty string when no imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should include keyframes in devup-ui import", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should end with double newline when has imports", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > generateImportStatements > should return the same imports across repeated calls", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > collectSectionNotes > combines non-empty direct text and descendant annotations", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "testId": "src/commands/__tests__/exportPagesAndComponents.test.ts > exportPagesAndComponents > notifies an error when orchestration throws", + "sourceFile": "src/commands/__tests__/exportPagesAndComponents.test.ts", + "classification": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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_assertion", + "fixtureIds": [], + "rustTest": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "contract", + "fixtureIds": [], + "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "compat_fixtures::upstream_ledger_mapping" + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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_only_use_read_operations", + "rationale": "Figma 문서 또는 로컬 import 대상을 변경하는 upstream 동작이며 devup-mcp의 읽기 전용 경계 밖이다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + }, + { + "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": "upstream_contract::built_in_scripts_only_use_read_operations", + "rationale": "Figma plugin iframe 또는 JavaScript 런타임 수명주기 동작으로 Rust MCP transport 계약에서 검증한다." + } + ] +} diff --git a/fixtures/devup-figma-plugin/manifest.json b/fixtures/devup-figma-plugin/manifest.json new file mode 100644 index 0000000..d62e9a8 --- /dev/null +++ b/fixtures/devup-figma-plugin/manifest.json @@ -0,0 +1,85 @@ +{ + "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": 1, + "snapshots": 1, + "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/live-shape-smoke.json", + "sha256": "9497dfe8dd396bd5680c39cc04c526b6993d2d244136491f5593258c0e71faa7" + }, + { + "path": "snapshots/codegen/live-shape-smoke.snap", + "sha256": "e02a4e2bec9f689a134befb2cb19ddb896fbc90ac0cab8227a91f1584ffbdc81" + } + ] +} From 7c1c3f3f64c3003bec65977ce79c13a177288650 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 31 Aug 2026 03:42:12 +0900 Subject: [PATCH 27/97] test: import plugin codegen json goldens --- .../tests/compat_manifest.rs | 5 +- .../devup-mcp-devup-ui/tests/support/mod.rs | 5 + .../upstream-codegen-001-4410624749.json | 55 + .../upstream-codegen-002-c1ac954cb6.json | 56 + .../upstream-codegen-003-c855738695.json | 67 + .../upstream-codegen-004-8ec61c5bb5.json | 67 + .../upstream-codegen-005-bcc6ca7dbf.json | 67 + .../upstream-codegen-006-86c21dc8ce.json | 60 + .../upstream-codegen-007-c1c1afa5d7.json | 60 + .../upstream-codegen-008-8ea06a6c88.json | 60 + .../upstream-codegen-009-008aac1a2c.json | 63 + .../upstream-codegen-010-8454d22acd.json | 99 + .../upstream-codegen-011-72709aab82.json | 91 + .../upstream-codegen-012-92c671c0e8.json | 72 + .../upstream-codegen-013-351e69a13b.json | 77 + .../upstream-codegen-014-828c466260.json | 72 + .../upstream-codegen-015-eaef178e47.json | 111 + .../upstream-codegen-016-3f1fb1569b.json | 111 + .../upstream-codegen-017-44cff97cec.json | 99 + .../upstream-codegen-018-bc5eb21a9e.json | 72 + .../upstream-codegen-019-4988f86e5e.json | 139 + .../upstream-codegen-020-a9d569be7a.json | 139 + .../upstream-codegen-021-6cae93b843.json | 81 + .../upstream-codegen-022-8dce1fe15f.json | 83 + .../upstream-codegen-023-040bff1c77.json | 83 + .../upstream-codegen-024-eb534f354c.json | 83 + .../upstream-codegen-025-74cf3c3463.json | 83 + .../upstream-codegen-026-e6df42a1c0.json | 73 + .../upstream-codegen-027-2373d0fb1b.json | 61 + .../upstream-codegen-028-0dcf04d5ca.json | 101 + .../upstream-codegen-029-dd01228f04.json | 101 + .../upstream-codegen-030-f4528f2a74.json | 101 + .../upstream-codegen-031-5d6f0a82e3.json | 97 + .../upstream-codegen-032-be85ad69d0.json | 97 + .../upstream-codegen-033-4f42f0cabb.json | 59 + .../upstream-codegen-034-e25e34d3de.json | 63 + .../upstream-codegen-035-1d66b429cf.json | 63 + .../upstream-codegen-036-6803ff59e6.json | 63 + .../upstream-codegen-037-e576c2fba9.json | 63 + .../upstream-codegen-038-280770f34d.json | 63 + .../upstream-codegen-039-84e4037075.json | 65 + .../upstream-codegen-040-e2a36763a6.json | 60 + .../upstream-codegen-041-7c9175487c.json | 59 + .../upstream-codegen-042-246e72e17a.json | 62 + .../upstream-codegen-043-50fac72de7.json | 73 + .../upstream-codegen-044-a9f4c5ba13.json | 73 + .../upstream-codegen-045-958507518d.json | 73 + .../upstream-codegen-046-82a07e3ec3.json | 69 + .../upstream-codegen-047-d524fcd6c3.json | 77 + .../upstream-codegen-048-fa3442e264.json | 57 + .../upstream-codegen-049-b3bbd32960.json | 57 + .../upstream-codegen-050-fda399bfe0.json | 76 + .../upstream-codegen-051-53df7b9474.json | 76 + .../upstream-codegen-052-e6195ba5a2.json | 73 + .../upstream-codegen-053-5fbe283840.json | 73 + .../upstream-codegen-054-e536c17528.json | 76 + .../upstream-codegen-055-1539142ffd.json | 55 + .../upstream-codegen-056-834fa66895.json | 59 + .../upstream-codegen-057-595a483b50.json | 61 + .../upstream-codegen-058-a5bed8edb7.json | 61 + .../upstream-codegen-059-0b07052901.json | 62 + .../upstream-codegen-060-b58a7535c7.json | 97 + .../upstream-codegen-061-1c44313e59.json | 92 + .../upstream-codegen-062-4fdcb21c9d.json | 65 + .../upstream-codegen-063-a8231002de.json | 78 + .../upstream-codegen-064-764419ad9b.json | 78 + .../upstream-codegen-065-6c1be61067.json | 67 + .../upstream-codegen-066-6525a64377.json | 67 + .../upstream-codegen-067-3ffe06a1a9.json | 67 + .../upstream-codegen-068-0d86452528.json | 67 + .../upstream-codegen-069-0fa1145f4c.json | 67 + .../upstream-codegen-070-a01830c33f.json | 96 + .../upstream-codegen-071-3a132a6b4d.json | 96 + .../upstream-codegen-072-df70a74728.json | 96 + .../upstream-codegen-073-ef0cdd87cf.json | 113 + .../upstream-codegen-074-57a24a2690.json | 129 + .../upstream-codegen-075-fb8db22bb9.json | 108 + .../upstream-codegen-076-3d2d4543bb.json | 131 + .../upstream-codegen-077-a65991a745.json | 96 + .../upstream-codegen-078-d6b1085274.json | 96 + .../upstream-codegen-079-9e7f3ee9e4.json | 96 + .../upstream-codegen-080-f6233dd6a0.json | 131 + .../upstream-codegen-081-ed3fa48802.json | 60 + .../upstream-codegen-082-db0d8839e8.json | 60 + .../upstream-codegen-083-1820110e8a.json | 60 + .../upstream-codegen-084-3d01c94f87.json | 61 + .../upstream-codegen-085-1f274ec7a6.json | 61 + .../upstream-codegen-086-a44a580f30.json | 61 + .../upstream-codegen-087-e95c0eccc2.json | 61 + .../upstream-codegen-088-f9ca312d49.json | 61 + .../upstream-codegen-089-1d28dfdd93.json | 61 + .../upstream-codegen-090-e8878c5cbf.json | 61 + .../upstream-codegen-091-dc61cb2277.json | 61 + .../upstream-codegen-092-96adc16d0c.json | 61 + .../upstream-codegen-093-4573f32903.json | 61 + .../upstream-codegen-094-e0d0f3bfe1.json | 61 + .../upstream-codegen-095-af3315e549.json | 61 + .../upstream-codegen-096-f8978e56ee.json | 61 + .../upstream-codegen-097-da58ebc1a5.json | 61 + .../upstream-codegen-098-7c2267436f.json | 61 + .../upstream-codegen-099-a2f954e973.json | 61 + .../upstream-codegen-100-a546e9e784.json | 61 + .../upstream-codegen-101-394e6d9bf6.json | 61 + .../upstream-codegen-102-cbff7d3da9.json | 61 + .../upstream-codegen-103-246809daea.json | 61 + .../upstream-codegen-104-d68998542b.json | 72 + .../upstream-codegen-105-0137b6735e.json | 166 + .../upstream-codegen-106-6d687083cc.json | 100 + .../upstream-codegen-107-f624c65fa8.json | 100 + .../upstream-codegen-108-c6c4dabf49.json | 100 + .../upstream-codegen-109-e2824ad5be.json | 96 + .../upstream-codegen-110-f2505cce4b.json | 98 + .../upstream-codegen-111-72c9d38832.json | 98 + .../upstream-codegen-112-b5443c63a4.json | 107 + .../upstream-codegen-113-702dadab11.json | 98 + .../upstream-codegen-114-855686da78.json | 68 + .../upstream-codegen-115-45d3f116b5.json | 72 + .../upstream-codegen-116-23097e86ce.json | 72 + .../upstream-codegen-117-fb967a9342.json | 73 + .../upstream-codegen-118-b5cba733fa.json | 81 + .../upstream-codegen-119-882c2abd91.json | 98 + .../upstream-codegen-120-7634e1ee10.json | 98 + .../upstream-codegen-121-0536a2e75b.json | 71 + .../upstream-codegen-122-7ddad74cc1.json | 115 + .../upstream-codegen-123-179129a02c.json | 115 + .../upstream-codegen-124-bdedf14335.json | 108 + .../upstream-codegen-125-4a4a93c4c9.json | 108 + .../upstream-codegen-126-14073e1999.json | 148 + .../upstream-codegen-127-1d5ead088d.json | 148 + .../upstream-codegen-128-2222304a14.json | 149 + .../upstream-codegen-129-7c97156f7f.json | 149 + .../upstream-codegen-130-bbd4e9a97a.json | 138 + .../upstream-codegen-131-c6ef80ad0c.json | 138 + .../upstream-codegen-132-9a7b0243b6.json | 101 + .../upstream-codegen-133-f425fa006c.json | 101 + .../upstream-codegen-134-f80fffb8b4.json | 55 + .../upstream-codegen-135-e00e826755.json | 55 + .../upstream-codegen-136-b68bd43ea7.json | 73 + .../upstream-codegen-137-83b2706e92.json | 73 + .../upstream-codegen-138-9cccfcb552.json | 182 + .../upstream-codegen-139-63f7b1f175.json | 182 + .../upstream-codegen-140-e577df9ad5.json | 199 + .../upstream-codegen-141-48307df49b.json | 162 + .../upstream-codegen-142-ac82229282.json | 162 + .../upstream-codegen-143-52b441f9f4.json | 226 + .../upstream-codegen-144-042a6de403.json | 226 + .../upstream-codegen-145-f7001b5648.json | 226 + .../upstream-codegen-146-56be99e864.json | 105 + .../upstream-codegen-147-bb7df0f2f1.json | 104 + .../upstream-codegen-148-62e9137131.json | 104 + .../upstream-codegen-149-2491f4c5a5.json | 234 + .../upstream-codegen-150-ecb5bb4337.json | 234 + .../upstream-codegen-151-7993d252dc.json | 234 + .../upstream-codegen-152-a05026a9db.json | 234 + .../upstream-codegen-153-fb5205fc52.json | 234 + .../upstream-codegen-154-1409376769.json | 234 + .../upstream-codegen-155-557eb84a98.json | 234 + .../upstream-codegen-156-bec8be9b99.json | 161 + .../upstream-codegen-157-4cb71f2863.json | 161 + .../upstream-codegen-158-8e4821dcbc.json | 161 + .../upstream-codegen-159-30962241b1.json | 161 + .../upstream-codegen-160-db5d3ac9d8.json | 161 + .../upstream-codegen-161-5b230821f2.json | 299 + .../upstream-codegen-162-51e1254b4c.json | 299 + .../upstream-codegen-163-2a9f9a056a.json | 299 + .../upstream-codegen-164-33e4c6591c.json | 341 + .../upstream-codegen-165-501ee1df12.json | 636 + .../upstream-codegen-166-cda14f0b08.json | 670 + .../upstream-codegen-167-114a88771f.json | 428 + .../upstream-codegen-168-4211bd8279.json | 131 + .../upstream-codegen-169-796132e0cf.json | 131 + .../upstream-codegen-170-eab2ed7d4c.json | 131 + .../upstream-codegen-171-7e33e2b6a9.json | 131 + .../upstream-codegen-172-99028c85ce.json | 131 + .../upstream-codegen-173-64dbd7a102.json | 131 + .../upstream-codegen-174-68dd47d3f8.json | 151 + .../upstream-codegen-175-ec3fd45731.json | 151 + .../upstream-codegen-176-653a030fdc.json | 106 + .../upstream-codegen-177-c147e7dd39.json | 106 + .../upstream-codegen-178-d69d60d688.json | 106 + .../upstream-codegen-179-80620f6587.json | 131 + .../upstream-codegen-180-ad1a31fd03.json | 134 + .../upstream-codegen-181-5afa626d49.json | 295 + .../upstream-codegen-182-c45d19171b.json | 135 + .../upstream-codegen-183-7ede517e99.json | 135 + .../upstream-codegen-184-0c09788bb7.json | 250 + .../upstream-codegen-185-e79c2ae189.json | 250 + .../upstream-codegen-186-0988e78887.json | 250 + .../upstream-codegen-187-8b30b935a4.json | 142 + .../upstream-codegen-188-ea2a1af6a1.json | 141 + .../upstream-codegen-189-75736e48e0.json | 130 + .../upstream-codegen-190-d5a9045231.json | 130 + .../upstream-codegen-191-2021d398f8.json | 1241 ++ .../upstream-codegen-192-dd2c3f0c1c.json | 195 + .../upstream-codegen-193-bd488a5710.json | 244 + .../upstream-codegen-194-17922977f6.json | 290 + .../upstream-codegen-195-1a6efe22a8.json | 286 + .../upstream-codegen-196-d14f03afcd.json | 310 + .../upstream-codegen-197-026402bf2e.json | 393 + .../upstream-codegen-198-a9ea7ba9c3.json | 397 + .../upstream-codegen-199-829a5c949d.json | 393 + .../upstream-codegen-200-3313d92719.json | 393 + .../upstream-codegen-201-8207a4008e.json | 393 + .../upstream-codegen-202-2786eda075.json | 343 + .../upstream-codegen-203-8af03217a3.json | 343 + .../upstream-codegen-204-2b2967c8c4.json | 343 + .../upstream-codegen-205-cc3ea5202a.json | 343 + .../upstream-codegen-206-b5c5dc97eb.json | 343 + .../upstream-codegen-207-b0e134acf4.json | 343 + .../upstream-codegen-208-1a343e45db.json | 343 + .../upstream-codegen-209-0514b0990f.json | 343 + .../upstream-codegen-210-1b24060767.json | 343 + .../upstream-codegen-211-2e15c55701.json | 201 + .../upstream-codegen-212-2a8f7b4a99.json | 201 + .../upstream-codegen-213-aa53408d2f.json | 1024 + .../upstream-codegen-214-6dc49544c0.json | 411 + .../upstream-codegen-215-39e86f8f53.json | 271 + .../upstream-codegen-216-465422d47b.json | 201 + .../upstream-codegen-217-2d887b2a8b.json | 201 + .../upstream-codegen-218-587666c709.json | 137 + .../upstream-codegen-219-c6446b7b2e.json | 137 + .../upstream-codegen-220-5980153f26.json | 137 + .../upstream-codegen-221-d003bdb336.json | 114 + .../upstream-codegen-222-f2d780c847.json | 168 + .../upstream-codegen-223-4dc8092992.json | 2483 +++ .../upstream-codegen-224-075a41e65c.json | 106 + .../upstream-codegen-225-00fb8a129e.json | 106 + .../upstream-codegen-226-b2c28bcc8f.json | 106 + .../upstream-codegen-227-bebc4e7262.json | 105 + .../upstream-codegen-228-221bd0c553.json | 105 + .../upstream-codegen-229-9f57002cd6.json | 105 + .../upstream-codegen-230-2af59fd9fa.json | 105 + .../upstream-codegen-231-117d816fb9.json | 105 + .../upstream-codegen-232-8e875ce9e3.json | 105 + .../upstream-codegen-233-0a60be5fbc.json | 106 + .../upstream-codegen-234-01ad9a0db0.json | 876 + .../upstream-codegen-235-8a3992468b.json | 880 + .../upstream-codegen-236-621c6d6a9e.json | 294 + .../upstream-codegen-237-01ee478666.json | 281 + .../upstream-codegen-238-1a8cf8c870.json | 317 + .../upstream-codegen-239-a6dada3682.json | 256 + .../upstream-codegen-240-77d56a1585.json | 317 + .../upstream-codegen-241-e171ef72ce.json | 256 + .../upstream-codegen-242-5c198a8490.json | 292 + .../upstream-codegen-243-14366a47ff.json | 224 + .../upstream-codegen-244-4ccea91f13.json | 199 + .../upstream-codegen-245-537356bcf4.json | 194 + .../upstream-codegen-246-295f39e09b.json | 206 + .../upstream-codegen-247-39d6959685.json | 220 + .../upstream-codegen-248-d1bc18e068.json | 176 + .../upstream-codegen-249-6b8a42981d.json | 1367 ++ .../upstream-codegen-250-935ccdb80f.json | 5063 +++++ .../upstream-codegen-251-50acddfb96.json | 2877 +++ .../upstream-codegen-252-49e979239e.json | 2866 +++ .../upstream-codegen-253-347a2e5fb2.json | 8206 ++++++++ .../upstream-codegen-254-9f340b6a10.json | 16513 ++++++++++++++++ .../upstream-codegen-255-d01d8c7de6.json | 232 + .../upstream-codegen-256-baf32cc08e.json | 232 + .../codegen/upstream-root-257-f23261dd4f.json | 61 + .../codegen/upstream-root-258-5cfe8baba5.json | 61 + .../codegen/upstream-root-259-0ae0aa9528.json | 61 + .../codegen/upstream-root-260-2dfc3ae054.json | 78 + .../upstream-responsive-266-4cd888ffd0.json | 108 + .../upstream-responsive-267-88b21cad2a.json | 769 + .../upstream-responsive-268-7dd1d5c323.json | 114 + .../upstream-viewport-261-928195cb2b.json | 373 + .../upstream-viewport-262-0f19b3123e.json | 223 + .../upstream-render-263-d2763f9b9f.json | 65 + .../upstream-render-264-51e29ada52.json | 61 + .../upstream-render-265-94e906e79b.json | 61 + fixtures/devup-figma-plugin/ledger.json | 2034 +- fixtures/devup-figma-plugin/manifest.json | 2148 +- .../upstream-codegen-001-4410624749.snap | 5 + .../upstream-codegen-002-c1ac954cb6.snap | 5 + .../upstream-codegen-003-c855738695.snap | 5 + .../upstream-codegen-004-8ec61c5bb5.snap | 5 + .../upstream-codegen-005-bcc6ca7dbf.snap | 5 + .../upstream-codegen-006-86c21dc8ce.snap | 5 + .../upstream-codegen-007-c1c1afa5d7.snap | 5 + .../upstream-codegen-008-8ea06a6c88.snap | 5 + .../upstream-codegen-009-008aac1a2c.snap | 5 + .../upstream-codegen-010-8454d22acd.snap | 5 + .../upstream-codegen-011-72709aab82.snap | 8 + .../upstream-codegen-012-92c671c0e8.snap | 5 + .../upstream-codegen-013-351e69a13b.snap | 5 + .../upstream-codegen-014-828c466260.snap | 13 + .../upstream-codegen-015-eaef178e47.snap | 13 + .../upstream-codegen-016-3f1fb1569b.snap | 5 + .../upstream-codegen-017-44cff97cec.snap | 5 + .../upstream-codegen-018-bc5eb21a9e.snap | 5 + .../upstream-codegen-019-4988f86e5e.snap | 13 + .../upstream-codegen-020-a9d569be7a.snap | 5 + .../upstream-codegen-021-6cae93b843.snap | 8 + .../upstream-codegen-022-8dce1fe15f.snap | 8 + .../upstream-codegen-023-040bff1c77.snap | 14 + .../upstream-codegen-024-eb534f354c.snap | 8 + .../upstream-codegen-025-74cf3c3463.snap | 14 + .../upstream-codegen-026-e6df42a1c0.snap | 8 + .../upstream-codegen-027-2373d0fb1b.snap | 5 + .../upstream-codegen-028-0dcf04d5ca.snap | 15 + .../upstream-codegen-029-dd01228f04.snap | 17 + .../upstream-codegen-030-f4528f2a74.snap | 17 + .../upstream-codegen-031-5d6f0a82e3.snap | 17 + .../upstream-codegen-032-be85ad69d0.snap | 19 + .../upstream-codegen-033-4f42f0cabb.snap | 5 + .../upstream-codegen-034-e25e34d3de.snap | 5 + .../upstream-codegen-035-1d66b429cf.snap | 5 + .../upstream-codegen-036-6803ff59e6.snap | 12 + .../upstream-codegen-037-e576c2fba9.snap | 12 + .../upstream-codegen-038-280770f34d.snap | 13 + .../upstream-codegen-039-84e4037075.snap | 5 + .../upstream-codegen-040-e2a36763a6.snap | 5 + .../upstream-codegen-041-7c9175487c.snap | 5 + .../upstream-codegen-042-246e72e17a.snap | 5 + .../upstream-codegen-043-50fac72de7.snap | 5 + .../upstream-codegen-044-a9f4c5ba13.snap | 5 + .../upstream-codegen-045-958507518d.snap | 5 + .../upstream-codegen-046-82a07e3ec3.snap | 5 + .../upstream-codegen-047-d524fcd6c3.snap | 5 + .../upstream-codegen-048-fa3442e264.snap | 5 + .../upstream-codegen-049-b3bbd32960.snap | 5 + .../upstream-codegen-050-fda399bfe0.snap | 8 + .../upstream-codegen-051-53df7b9474.snap | 8 + .../upstream-codegen-052-e6195ba5a2.snap | 8 + .../upstream-codegen-053-5fbe283840.snap | 8 + .../upstream-codegen-054-e536c17528.snap | 13 + .../upstream-codegen-055-1539142ffd.snap | 5 + .../upstream-codegen-056-834fa66895.snap | 5 + .../upstream-codegen-057-595a483b50.snap | 12 + .../upstream-codegen-058-a5bed8edb7.snap | 5 + .../upstream-codegen-059-0b07052901.snap | 12 + .../upstream-codegen-060-b58a7535c7.snap | 9 + .../upstream-codegen-061-1c44313e59.snap | 9 + .../upstream-codegen-062-4fdcb21c9d.snap | 5 + .../upstream-codegen-063-a8231002de.snap | 5 + .../upstream-codegen-064-764419ad9b.snap | 5 + .../upstream-codegen-065-6c1be61067.snap | 5 + .../upstream-codegen-066-6525a64377.snap | 5 + .../upstream-codegen-067-3ffe06a1a9.snap | 5 + .../upstream-codegen-068-0d86452528.snap | 5 + .../upstream-codegen-069-0fa1145f4c.snap | 5 + .../upstream-codegen-070-a01830c33f.snap | 16 + .../upstream-codegen-071-3a132a6b4d.snap | 16 + .../upstream-codegen-072-df70a74728.snap | 18 + .../upstream-codegen-073-ef0cdd87cf.snap | 17 + .../upstream-codegen-074-57a24a2690.snap | 17 + .../upstream-codegen-075-fb8db22bb9.snap | 18 + .../upstream-codegen-076-3d2d4543bb.snap | 19 + .../upstream-codegen-077-a65991a745.snap | 21 + .../upstream-codegen-078-d6b1085274.snap | 21 + .../upstream-codegen-079-9e7f3ee9e4.snap | 24 + .../upstream-codegen-080-f6233dd6a0.snap | 17 + .../upstream-codegen-081-ed3fa48802.snap | 5 + .../upstream-codegen-082-db0d8839e8.snap | 5 + .../upstream-codegen-083-1820110e8a.snap | 5 + .../upstream-codegen-084-3d01c94f87.snap | 5 + .../upstream-codegen-085-1f274ec7a6.snap | 5 + .../upstream-codegen-086-a44a580f30.snap | 5 + .../upstream-codegen-087-e95c0eccc2.snap | 5 + .../upstream-codegen-088-f9ca312d49.snap | 5 + .../upstream-codegen-089-1d28dfdd93.snap | 5 + .../upstream-codegen-090-e8878c5cbf.snap | 5 + .../upstream-codegen-091-dc61cb2277.snap | 5 + .../upstream-codegen-092-96adc16d0c.snap | 5 + .../upstream-codegen-093-4573f32903.snap | 5 + .../upstream-codegen-094-e0d0f3bfe1.snap | 5 + .../upstream-codegen-095-af3315e549.snap | 5 + .../upstream-codegen-096-f8978e56ee.snap | 5 + .../upstream-codegen-097-da58ebc1a5.snap | 5 + .../upstream-codegen-098-7c2267436f.snap | 5 + .../upstream-codegen-099-a2f954e973.snap | 5 + .../upstream-codegen-100-a546e9e784.snap | 5 + .../upstream-codegen-101-394e6d9bf6.snap | 5 + .../upstream-codegen-102-cbff7d3da9.snap | 5 + .../upstream-codegen-103-246809daea.snap | 5 + .../upstream-codegen-104-d68998542b.snap | 5 + .../upstream-codegen-105-0137b6735e.snap | 18 + .../upstream-codegen-106-6d687083cc.snap | 16 + .../upstream-codegen-107-f624c65fa8.snap | 17 + .../upstream-codegen-108-c6c4dabf49.snap | 17 + .../upstream-codegen-109-e2824ad5be.snap | 8 + .../upstream-codegen-110-f2505cce4b.snap | 5 + .../upstream-codegen-111-72c9d38832.snap | 5 + .../upstream-codegen-112-b5443c63a4.snap | 5 + .../upstream-codegen-113-702dadab11.snap | 5 + .../upstream-codegen-114-855686da78.snap | 5 + .../upstream-codegen-115-45d3f116b5.snap | 5 + .../upstream-codegen-116-23097e86ce.snap | 5 + .../upstream-codegen-117-fb967a9342.snap | 5 + .../upstream-codegen-118-b5cba733fa.snap | 5 + .../upstream-codegen-119-882c2abd91.snap | 5 + .../upstream-codegen-120-7634e1ee10.snap | 5 + .../upstream-codegen-121-0536a2e75b.snap | 5 + .../upstream-codegen-122-7ddad74cc1.snap | 9 + .../upstream-codegen-123-179129a02c.snap | 74 + .../upstream-codegen-124-bdedf14335.snap | 9 + .../upstream-codegen-125-4a4a93c4c9.snap | 65 + .../upstream-codegen-126-14073e1999.snap | 9 + .../upstream-codegen-127-1d5ead088d.snap | 89 + .../upstream-codegen-128-2222304a14.snap | 9 + .../upstream-codegen-129-7c97156f7f.snap | 95 + .../upstream-codegen-130-bbd4e9a97a.snap | 5 + .../upstream-codegen-131-c6ef80ad0c.snap | 98 + .../upstream-codegen-132-9a7b0243b6.snap | 9 + .../upstream-codegen-133-f425fa006c.snap | 60 + .../upstream-codegen-134-f80fffb8b4.snap | 5 + .../upstream-codegen-135-e00e826755.snap | 31 + .../upstream-codegen-136-b68bd43ea7.snap | 5 + .../upstream-codegen-137-83b2706e92.snap | 45 + .../upstream-codegen-138-9cccfcb552.snap | 30 + .../upstream-codegen-139-63f7b1f175.snap | 8 + .../upstream-codegen-140-e577df9ad5.snap | 30 + .../upstream-codegen-141-48307df49b.snap | 20 + .../upstream-codegen-142-ac82229282.snap | 8 + .../upstream-codegen-143-52b441f9f4.snap | 34 + .../upstream-codegen-144-042a6de403.snap | 8 + .../upstream-codegen-145-f7001b5648.snap | 8 + .../upstream-codegen-146-56be99e864.snap | 8 + .../upstream-codegen-147-bb7df0f2f1.snap | 8 + .../upstream-codegen-148-62e9137131.snap | 8 + .../upstream-codegen-149-2491f4c5a5.snap | 19 + .../upstream-codegen-150-ecb5bb4337.snap | 19 + .../upstream-codegen-151-7993d252dc.snap | 19 + .../upstream-codegen-152-a05026a9db.snap | 19 + .../upstream-codegen-153-fb5205fc52.snap | 19 + .../upstream-codegen-154-1409376769.snap | 19 + .../upstream-codegen-155-557eb84a98.snap | 19 + .../upstream-codegen-156-bec8be9b99.snap | 19 + .../upstream-codegen-157-4cb71f2863.snap | 20 + .../upstream-codegen-158-8e4821dcbc.snap | 19 + .../upstream-codegen-159-30962241b1.snap | 21 + .../upstream-codegen-160-db5d3ac9d8.snap | 21 + .../upstream-codegen-161-5b230821f2.snap | 22 + .../upstream-codegen-162-51e1254b4c.snap | 22 + .../upstream-codegen-163-2a9f9a056a.snap | 22 + .../upstream-codegen-164-33e4c6591c.snap | 37 + .../upstream-codegen-165-501ee1df12.snap | 37 + .../upstream-codegen-166-cda14f0b08.snap | 68 + .../upstream-codegen-167-114a88771f.snap | 44 + .../upstream-codegen-168-4211bd8279.snap | 8 + .../upstream-codegen-169-796132e0cf.snap | 8 + .../upstream-codegen-170-eab2ed7d4c.snap | 8 + .../upstream-codegen-171-7e33e2b6a9.snap | 8 + .../upstream-codegen-172-99028c85ce.snap | 16 + .../upstream-codegen-173-64dbd7a102.snap | 8 + .../upstream-codegen-174-68dd47d3f8.snap | 16 + .../upstream-codegen-175-ec3fd45731.snap | 16 + .../upstream-codegen-176-653a030fdc.snap | 8 + .../upstream-codegen-177-c147e7dd39.snap | 8 + .../upstream-codegen-178-d69d60d688.snap | 16 + .../upstream-codegen-179-80620f6587.snap | 16 + .../upstream-codegen-180-ad1a31fd03.snap | 16 + .../upstream-codegen-181-5afa626d49.snap | 8 + .../upstream-codegen-182-c45d19171b.snap | 16 + .../upstream-codegen-183-7ede517e99.snap | 8 + .../upstream-codegen-184-0c09788bb7.snap | 25 + .../upstream-codegen-185-e79c2ae189.snap | 22 + .../upstream-codegen-186-0988e78887.snap | 27 + .../upstream-codegen-187-8b30b935a4.snap | 8 + .../upstream-codegen-188-ea2a1af6a1.snap | 8 + .../upstream-codegen-189-75736e48e0.snap | 8 + .../upstream-codegen-190-d5a9045231.snap | 8 + .../upstream-codegen-191-2021d398f8.snap | 86 + .../upstream-codegen-192-dd2c3f0c1c.snap | 17 + .../upstream-codegen-193-bd488a5710.snap | 16 + .../upstream-codegen-194-17922977f6.snap | 16 + .../upstream-codegen-195-1a6efe22a8.snap | 8 + .../upstream-codegen-196-d14f03afcd.snap | 8 + .../upstream-codegen-197-026402bf2e.snap | 30 + .../upstream-codegen-198-a9ea7ba9c3.snap | 30 + .../upstream-codegen-199-829a5c949d.snap | 36 + .../upstream-codegen-200-3313d92719.snap | 30 + .../upstream-codegen-201-8207a4008e.snap | 30 + .../upstream-codegen-202-2786eda075.snap | 31 + .../upstream-codegen-203-8af03217a3.snap | 31 + .../upstream-codegen-204-2b2967c8c4.snap | 31 + .../upstream-codegen-205-cc3ea5202a.snap | 32 + .../upstream-codegen-206-b5c5dc97eb.snap | 31 + .../upstream-codegen-207-b0e134acf4.snap | 37 + .../upstream-codegen-208-1a343e45db.snap | 33 + .../upstream-codegen-209-0514b0990f.snap | 37 + .../upstream-codegen-210-1b24060767.snap | 37 + .../upstream-codegen-211-2e15c55701.snap | 12 + .../upstream-codegen-212-2a8f7b4a99.snap | 12 + .../upstream-codegen-213-aa53408d2f.snap | 86 + .../upstream-codegen-214-6dc49544c0.snap | 15 + .../upstream-codegen-215-39e86f8f53.snap | 25 + .../upstream-codegen-216-465422d47b.snap | 12 + .../upstream-codegen-217-2d887b2a8b.snap | 18 + .../upstream-codegen-218-587666c709.snap | 8 + .../upstream-codegen-219-c6446b7b2e.snap | 8 + .../upstream-codegen-220-5980153f26.snap | 8 + .../upstream-codegen-221-d003bdb336.snap | 8 + .../upstream-codegen-222-f2d780c847.snap | 21 + .../upstream-codegen-223-4dc8092992.snap | 220 + .../upstream-codegen-224-075a41e65c.snap | 16 + .../upstream-codegen-225-00fb8a129e.snap | 16 + .../upstream-codegen-226-b2c28bcc8f.snap | 16 + .../upstream-codegen-227-bebc4e7262.snap | 8 + .../upstream-codegen-228-221bd0c553.snap | 8 + .../upstream-codegen-229-9f57002cd6.snap | 8 + .../upstream-codegen-230-2af59fd9fa.snap | 8 + .../upstream-codegen-231-117d816fb9.snap | 8 + .../upstream-codegen-232-8e875ce9e3.snap | 8 + .../upstream-codegen-233-0a60be5fbc.snap | 16 + .../upstream-codegen-234-01ad9a0db0.snap | 8 + .../upstream-codegen-235-8a3992468b.snap | 8 + .../upstream-codegen-236-621c6d6a9e.snap | 21 + .../upstream-codegen-237-01ee478666.snap | 20 + .../upstream-codegen-238-1a8cf8c870.snap | 12 + .../upstream-codegen-239-a6dada3682.snap | 20 + .../upstream-codegen-240-77d56a1585.snap | 12 + .../upstream-codegen-241-e171ef72ce.snap | 20 + .../upstream-codegen-242-5c198a8490.snap | 12 + .../upstream-codegen-243-14366a47ff.snap | 21 + .../upstream-codegen-244-4ccea91f13.snap | 23 + .../upstream-codegen-245-537356bcf4.snap | 23 + .../upstream-codegen-246-295f39e09b.snap | 22 + .../upstream-codegen-247-39d6959685.snap | 23 + .../upstream-codegen-248-d1bc18e068.snap | 34 + .../upstream-codegen-249-6b8a42981d.snap | 42 + .../upstream-codegen-250-935ccdb80f.snap | 65 + .../upstream-codegen-251-50acddfb96.snap | 132 + .../upstream-codegen-252-49e979239e.snap | 145 + .../upstream-codegen-253-347a2e5fb2.snap | 109 + .../upstream-codegen-254-9f340b6a10.snap | 80 + .../upstream-codegen-255-d01d8c7de6.snap | 16 + .../upstream-codegen-256-baf32cc08e.snap | 21 + .../codegen/upstream-root-257-f23261dd4f.snap | 56 + .../codegen/upstream-root-258-5cfe8baba5.snap | 17 + .../codegen/upstream-root-259-0ae0aa9528.snap | 5 + .../codegen/upstream-root-260-2dfc3ae054.snap | 66 + .../upstream-responsive-266-4cd888ffd0.snap | 5 + .../upstream-responsive-267-88b21cad2a.snap | 5 + .../upstream-responsive-268-7dd1d5c323.snap | 5 + .../upstream-viewport-261-928195cb2b.snap | 20 + .../upstream-viewport-262-0f19b3123e.snap | 23 + .../upstream-render-263-d2763f9b9f.snap | 23 + .../upstream-render-264-51e29ada52.snap | 18 + .../upstream-render-265-94e906e79b.snap | 19 + 540 files changed, 89092 insertions(+), 761 deletions(-) create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-001-4410624749.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-002-c1ac954cb6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-003-c855738695.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-004-8ec61c5bb5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-005-bcc6ca7dbf.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-006-86c21dc8ce.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-007-c1c1afa5d7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-008-8ea06a6c88.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-009-008aac1a2c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-010-8454d22acd.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-011-72709aab82.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-012-92c671c0e8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-013-351e69a13b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-014-828c466260.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-015-eaef178e47.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-016-3f1fb1569b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-017-44cff97cec.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-018-bc5eb21a9e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-019-4988f86e5e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-020-a9d569be7a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-021-6cae93b843.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-022-8dce1fe15f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-023-040bff1c77.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-024-eb534f354c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-025-74cf3c3463.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-026-e6df42a1c0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-027-2373d0fb1b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-028-0dcf04d5ca.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-029-dd01228f04.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-030-f4528f2a74.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-031-5d6f0a82e3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-032-be85ad69d0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-033-4f42f0cabb.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-034-e25e34d3de.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-035-1d66b429cf.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-036-6803ff59e6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-037-e576c2fba9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-038-280770f34d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-039-84e4037075.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-040-e2a36763a6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-041-7c9175487c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-042-246e72e17a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-043-50fac72de7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-044-a9f4c5ba13.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-045-958507518d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-046-82a07e3ec3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-047-d524fcd6c3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-048-fa3442e264.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-049-b3bbd32960.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-050-fda399bfe0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-051-53df7b9474.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-052-e6195ba5a2.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-053-5fbe283840.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-054-e536c17528.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-055-1539142ffd.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-056-834fa66895.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-057-595a483b50.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-058-a5bed8edb7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-059-0b07052901.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-060-b58a7535c7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-061-1c44313e59.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-062-4fdcb21c9d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-063-a8231002de.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-064-764419ad9b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-065-6c1be61067.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-066-6525a64377.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-067-3ffe06a1a9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-068-0d86452528.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-069-0fa1145f4c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-070-a01830c33f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-071-3a132a6b4d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-072-df70a74728.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-073-ef0cdd87cf.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-074-57a24a2690.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-075-fb8db22bb9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-076-3d2d4543bb.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-077-a65991a745.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-078-d6b1085274.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-079-9e7f3ee9e4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-080-f6233dd6a0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-081-ed3fa48802.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-082-db0d8839e8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-083-1820110e8a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-084-3d01c94f87.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-085-1f274ec7a6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-086-a44a580f30.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-087-e95c0eccc2.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-088-f9ca312d49.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-089-1d28dfdd93.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-090-e8878c5cbf.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-091-dc61cb2277.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-092-96adc16d0c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-093-4573f32903.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-094-e0d0f3bfe1.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-095-af3315e549.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-096-f8978e56ee.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-097-da58ebc1a5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-098-7c2267436f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-099-a2f954e973.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-100-a546e9e784.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-101-394e6d9bf6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-102-cbff7d3da9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-103-246809daea.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-104-d68998542b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-105-0137b6735e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-106-6d687083cc.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-107-f624c65fa8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-108-c6c4dabf49.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-109-e2824ad5be.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-110-f2505cce4b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-111-72c9d38832.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-112-b5443c63a4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-113-702dadab11.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-114-855686da78.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-115-45d3f116b5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-116-23097e86ce.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-117-fb967a9342.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-118-b5cba733fa.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-119-882c2abd91.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-120-7634e1ee10.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-121-0536a2e75b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-122-7ddad74cc1.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-123-179129a02c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-124-bdedf14335.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-125-4a4a93c4c9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-126-14073e1999.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-127-1d5ead088d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-128-2222304a14.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-129-7c97156f7f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-130-bbd4e9a97a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-131-c6ef80ad0c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-132-9a7b0243b6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-133-f425fa006c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-134-f80fffb8b4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-135-e00e826755.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-136-b68bd43ea7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-137-83b2706e92.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-138-9cccfcb552.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-139-63f7b1f175.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-140-e577df9ad5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-141-48307df49b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-142-ac82229282.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-143-52b441f9f4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-144-042a6de403.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-145-f7001b5648.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-146-56be99e864.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-147-bb7df0f2f1.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-148-62e9137131.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-149-2491f4c5a5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-150-ecb5bb4337.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-151-7993d252dc.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-152-a05026a9db.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-153-fb5205fc52.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-154-1409376769.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-155-557eb84a98.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-156-bec8be9b99.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-157-4cb71f2863.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-158-8e4821dcbc.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-159-30962241b1.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-160-db5d3ac9d8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-161-5b230821f2.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-162-51e1254b4c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-163-2a9f9a056a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-164-33e4c6591c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-165-501ee1df12.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-166-cda14f0b08.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-167-114a88771f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-168-4211bd8279.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-169-796132e0cf.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-170-eab2ed7d4c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-171-7e33e2b6a9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-172-99028c85ce.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-173-64dbd7a102.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-174-68dd47d3f8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-175-ec3fd45731.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-176-653a030fdc.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-177-c147e7dd39.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-178-d69d60d688.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-179-80620f6587.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-180-ad1a31fd03.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-181-5afa626d49.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-182-c45d19171b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-183-7ede517e99.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-184-0c09788bb7.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-185-e79c2ae189.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-186-0988e78887.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-187-8b30b935a4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-188-ea2a1af6a1.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-189-75736e48e0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-190-d5a9045231.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-191-2021d398f8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-192-dd2c3f0c1c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-193-bd488a5710.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-194-17922977f6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-195-1a6efe22a8.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-196-d14f03afcd.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-197-026402bf2e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-198-a9ea7ba9c3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-199-829a5c949d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-200-3313d92719.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-201-8207a4008e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-202-2786eda075.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-203-8af03217a3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-204-2b2967c8c4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-205-cc3ea5202a.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-206-b5c5dc97eb.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-207-b0e134acf4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-208-1a343e45db.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-209-0514b0990f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-210-1b24060767.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-211-2e15c55701.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-212-2a8f7b4a99.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-213-aa53408d2f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-214-6dc49544c0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-215-39e86f8f53.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-216-465422d47b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-217-2d887b2a8b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-218-587666c709.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-219-c6446b7b2e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-220-5980153f26.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-221-d003bdb336.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-222-f2d780c847.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-223-4dc8092992.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-224-075a41e65c.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-225-00fb8a129e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-226-b2c28bcc8f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-227-bebc4e7262.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-228-221bd0c553.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-229-9f57002cd6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-230-2af59fd9fa.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-231-117d816fb9.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-232-8e875ce9e3.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-233-0a60be5fbc.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-234-01ad9a0db0.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-235-8a3992468b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-236-621c6d6a9e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-237-01ee478666.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-238-1a8cf8c870.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-239-a6dada3682.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-240-77d56a1585.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-241-e171ef72ce.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-242-5c198a8490.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-243-14366a47ff.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-244-4ccea91f13.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-245-537356bcf4.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-246-295f39e09b.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-247-39d6959685.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-248-d1bc18e068.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-249-6b8a42981d.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-250-935ccdb80f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-251-50acddfb96.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-252-49e979239e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-253-347a2e5fb2.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-254-9f340b6a10.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-255-d01d8c7de6.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-256-baf32cc08e.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-root-257-f23261dd4f.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-root-258-5cfe8baba5.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-root-259-0ae0aa9528.json create mode 100644 fixtures/devup-figma-plugin/cases/codegen/upstream-root-260-2dfc3ae054.json create mode 100644 fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-266-4cd888ffd0.json create mode 100644 fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-267-88b21cad2a.json create mode 100644 fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-268-7dd1d5c323.json create mode 100644 fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-261-928195cb2b.json create mode 100644 fixtures/devup-figma-plugin/cases/responsive/upstream-viewport-262-0f19b3123e.json create mode 100644 fixtures/devup-figma-plugin/cases/snapshot/upstream-render-263-d2763f9b9f.json create mode 100644 fixtures/devup-figma-plugin/cases/snapshot/upstream-render-264-51e29ada52.json create mode 100644 fixtures/devup-figma-plugin/cases/snapshot/upstream-render-265-94e906e79b.json create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-001-4410624749.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-002-c1ac954cb6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-003-c855738695.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-004-8ec61c5bb5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-005-bcc6ca7dbf.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-006-86c21dc8ce.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-007-c1c1afa5d7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-008-8ea06a6c88.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-009-008aac1a2c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-010-8454d22acd.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-011-72709aab82.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-012-92c671c0e8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-013-351e69a13b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-014-828c466260.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-015-eaef178e47.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-016-3f1fb1569b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-017-44cff97cec.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-018-bc5eb21a9e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-019-4988f86e5e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-020-a9d569be7a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-021-6cae93b843.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-022-8dce1fe15f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-023-040bff1c77.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-024-eb534f354c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-025-74cf3c3463.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-026-e6df42a1c0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-027-2373d0fb1b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-028-0dcf04d5ca.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-029-dd01228f04.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-030-f4528f2a74.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-031-5d6f0a82e3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-032-be85ad69d0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-033-4f42f0cabb.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-034-e25e34d3de.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-035-1d66b429cf.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-036-6803ff59e6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-037-e576c2fba9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-038-280770f34d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-039-84e4037075.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-040-e2a36763a6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-041-7c9175487c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-042-246e72e17a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-043-50fac72de7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-044-a9f4c5ba13.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-045-958507518d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-046-82a07e3ec3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-047-d524fcd6c3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-048-fa3442e264.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-049-b3bbd32960.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-050-fda399bfe0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-051-53df7b9474.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-052-e6195ba5a2.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-053-5fbe283840.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-054-e536c17528.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-055-1539142ffd.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-056-834fa66895.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-057-595a483b50.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-058-a5bed8edb7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-059-0b07052901.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-060-b58a7535c7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-061-1c44313e59.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-062-4fdcb21c9d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-063-a8231002de.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-064-764419ad9b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-065-6c1be61067.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-066-6525a64377.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-067-3ffe06a1a9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-068-0d86452528.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-069-0fa1145f4c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-070-a01830c33f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-071-3a132a6b4d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-072-df70a74728.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-073-ef0cdd87cf.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-074-57a24a2690.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-075-fb8db22bb9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-076-3d2d4543bb.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-077-a65991a745.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-078-d6b1085274.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-079-9e7f3ee9e4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-080-f6233dd6a0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-081-ed3fa48802.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-082-db0d8839e8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-083-1820110e8a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-084-3d01c94f87.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-085-1f274ec7a6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-086-a44a580f30.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-087-e95c0eccc2.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-088-f9ca312d49.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-089-1d28dfdd93.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-090-e8878c5cbf.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-091-dc61cb2277.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-092-96adc16d0c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-093-4573f32903.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-094-e0d0f3bfe1.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-095-af3315e549.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-096-f8978e56ee.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-097-da58ebc1a5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-098-7c2267436f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-099-a2f954e973.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-100-a546e9e784.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-101-394e6d9bf6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-102-cbff7d3da9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-103-246809daea.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-104-d68998542b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-105-0137b6735e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-106-6d687083cc.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-107-f624c65fa8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-108-c6c4dabf49.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-109-e2824ad5be.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-110-f2505cce4b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-111-72c9d38832.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-112-b5443c63a4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-113-702dadab11.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-114-855686da78.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-115-45d3f116b5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-116-23097e86ce.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-117-fb967a9342.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-118-b5cba733fa.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-119-882c2abd91.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-120-7634e1ee10.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-121-0536a2e75b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-122-7ddad74cc1.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-123-179129a02c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-124-bdedf14335.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-125-4a4a93c4c9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-126-14073e1999.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-127-1d5ead088d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-128-2222304a14.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-129-7c97156f7f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-130-bbd4e9a97a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-131-c6ef80ad0c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-132-9a7b0243b6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-133-f425fa006c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-134-f80fffb8b4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-135-e00e826755.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-136-b68bd43ea7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-137-83b2706e92.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-138-9cccfcb552.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-139-63f7b1f175.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-140-e577df9ad5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-141-48307df49b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-142-ac82229282.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-143-52b441f9f4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-144-042a6de403.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-145-f7001b5648.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-146-56be99e864.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-147-bb7df0f2f1.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-148-62e9137131.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-149-2491f4c5a5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-150-ecb5bb4337.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-151-7993d252dc.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-152-a05026a9db.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-153-fb5205fc52.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-154-1409376769.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-155-557eb84a98.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-156-bec8be9b99.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-157-4cb71f2863.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-158-8e4821dcbc.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-159-30962241b1.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-160-db5d3ac9d8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-161-5b230821f2.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-162-51e1254b4c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-164-33e4c6591c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-165-501ee1df12.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-166-cda14f0b08.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-167-114a88771f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-168-4211bd8279.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-169-796132e0cf.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-172-99028c85ce.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-173-64dbd7a102.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-175-ec3fd45731.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-176-653a030fdc.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-177-c147e7dd39.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-178-d69d60d688.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-179-80620f6587.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-180-ad1a31fd03.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-181-5afa626d49.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-182-c45d19171b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-183-7ede517e99.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-184-0c09788bb7.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-185-e79c2ae189.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-186-0988e78887.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-187-8b30b935a4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-188-ea2a1af6a1.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-189-75736e48e0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-190-d5a9045231.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-191-2021d398f8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-192-dd2c3f0c1c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-193-bd488a5710.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-194-17922977f6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-195-1a6efe22a8.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-196-d14f03afcd.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-197-026402bf2e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-198-a9ea7ba9c3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-199-829a5c949d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-200-3313d92719.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-201-8207a4008e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-202-2786eda075.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-203-8af03217a3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-204-2b2967c8c4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-205-cc3ea5202a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-206-b5c5dc97eb.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-207-b0e134acf4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-208-1a343e45db.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-209-0514b0990f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-210-1b24060767.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-211-2e15c55701.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-212-2a8f7b4a99.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-213-aa53408d2f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-214-6dc49544c0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-215-39e86f8f53.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-216-465422d47b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-217-2d887b2a8b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-218-587666c709.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-219-c6446b7b2e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-220-5980153f26.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-221-d003bdb336.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-222-f2d780c847.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-223-4dc8092992.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-224-075a41e65c.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-225-00fb8a129e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-226-b2c28bcc8f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-227-bebc4e7262.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-228-221bd0c553.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-229-9f57002cd6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-230-2af59fd9fa.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-231-117d816fb9.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-232-8e875ce9e3.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-233-0a60be5fbc.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-234-01ad9a0db0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-235-8a3992468b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-236-621c6d6a9e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-237-01ee478666.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-238-1a8cf8c870.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-239-a6dada3682.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-240-77d56a1585.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-241-e171ef72ce.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-242-5c198a8490.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-243-14366a47ff.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-244-4ccea91f13.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-245-537356bcf4.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-246-295f39e09b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-247-39d6959685.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-248-d1bc18e068.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-249-6b8a42981d.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-250-935ccdb80f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-251-50acddfb96.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-252-49e979239e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-253-347a2e5fb2.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-254-9f340b6a10.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-255-d01d8c7de6.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-codegen-256-baf32cc08e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-root-257-f23261dd4f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-root-258-5cfe8baba5.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-root-259-0ae0aa9528.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/codegen/upstream-root-260-2dfc3ae054.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/responsive/upstream-responsive-266-4cd888ffd0.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/responsive/upstream-responsive-267-88b21cad2a.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/responsive/upstream-responsive-268-7dd1d5c323.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/responsive/upstream-viewport-261-928195cb2b.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/responsive/upstream-viewport-262-0f19b3123e.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/snapshot/upstream-render-263-d2763f9b9f.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/snapshot/upstream-render-264-51e29ada52.snap create mode 100644 fixtures/devup-figma-plugin/snapshots/snapshot/upstream-render-265-94e906e79b.snap diff --git a/crates/devup-mcp-devup-ui/tests/compat_manifest.rs b/crates/devup-mcp-devup-ui/tests/compat_manifest.rs index 03f78fa..16bc777 100644 --- a/crates/devup-mcp-devup-ui/tests/compat_manifest.rs +++ b/crates/devup-mcp-devup-ui/tests/compat_manifest.rs @@ -9,6 +9,7 @@ fn pinned_plugin_corpus_is_complete_and_self_consistent() { .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, 1); - assert_eq!(summary.snapshots, 1); + // 268 pinned upstream snapshots plus one production-shape smoke case. + assert_eq!(summary.cases, 269); + assert_eq!(summary.snapshots, 269); } diff --git a/crates/devup-mcp-devup-ui/tests/support/mod.rs b/crates/devup-mcp-devup-ui/tests/support/mod.rs index 6ff1be6..673d6f2 100644 --- a/crates/devup-mcp-devup-ui/tests/support/mod.rs +++ b/crates/devup-mcp-devup-ui/tests/support/mod.rs @@ -52,6 +52,11 @@ pub struct FixtureRequest { 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)] 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..c010544 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-109-e2824ad5be.json @@ -0,0 +1,96 @@ +{ + "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": null, + "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..78da6ae --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-115-45d3f116b5.json @@ -0,0 +1,72 @@ +{ + "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": {} + } + }, + "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..7ec84e6 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-116-23097e86ce.json @@ -0,0 +1,72 @@ +{ + "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": {} + } + }, + "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..ace4513 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-117-fb967a9342.json @@ -0,0 +1,73 @@ +{ + "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": {} + } + }, + "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..b33f1b2 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-123-179129a02c.json @@ -0,0 +1,115 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-123-179129a02c", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with variants: component: Default 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-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..87fbe91 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-125-4a4a93c4c9.json @@ -0,0 +1,108 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-125-4a4a93c4c9", + "operation": "snapshot", + "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" + }, + "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..902c0aa --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-127-1d5ead088d.json @@ -0,0 +1,148 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-127-1d5ead088d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders component set with transition: component: Default 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-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..e55dc71 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-129-7c97156f7f.json @@ -0,0 +1,149 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-129-7c97156f7f", + "operation": "snapshot", + "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" + }, + "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..5278369 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-131-c6ef80ad0c.json @@ -0,0 +1,138 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-131-c6ef80ad0c", + "operation": "snapshot", + "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" + }, + "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..572487c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-133-f425fa006c.json @@ -0,0 +1,101 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-133-f425fa006c", + "operation": "snapshot", + "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" + }, + "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..44f1f58 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-135-e00e826755.json @@ -0,0 +1,55 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-135-e00e826755", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "Codegen renders simple component without variants: component: Icon 1" + }, + "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-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..cdd76d3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-137-83b2706e92.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-137-83b2706e92", + "operation": "snapshot", + "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" + }, + "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..ef3fd1d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-138-9cccfcb552.json @@ -0,0 +1,182 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-138-9cccfcb552", + "operation": "snapshot", + "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" + }, + "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..35e5437 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-139-63f7b1f175.json @@ -0,0 +1,182 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-139-63f7b1f175", + "operation": "snapshot", + "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" + }, + "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..faa7dec --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-140-e577df9ad5.json @@ -0,0 +1,199 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-140-e577df9ad5", + "operation": "snapshot", + "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" + }, + "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..7080b89 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-141-48307df49b.json @@ -0,0 +1,162 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-141-48307df49b", + "operation": "snapshot", + "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" + }, + "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..7d65f02 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-142-ac82229282.json @@ -0,0 +1,162 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-142-ac82229282", + "operation": "snapshot", + "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" + }, + "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..ab6898f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-143-52b441f9f4.json @@ -0,0 +1,226 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-143-52b441f9f4", + "operation": "snapshot", + "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" + }, + "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..10bbda7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-144-042a6de403.json @@ -0,0 +1,226 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-144-042a6de403", + "operation": "snapshot", + "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" + }, + "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..b6b39cb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-145-f7001b5648.json @@ -0,0 +1,226 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-145-f7001b5648", + "operation": "snapshot", + "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" + }, + "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..c25f891 --- /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": "snapshot", + "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..45e87f1 --- /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": "snapshot", + "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..eadc3d6 --- /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": "snapshot", + "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..6085e82 --- /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": "snapshot", + "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..d1f57a3 --- /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": "snapshot", + "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..f77a594 --- /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": "snapshot", + "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..131375e --- /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": "snapshot", + "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..62e7fff --- /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": "snapshot", + "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..f460bf4 --- /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": "snapshot", + "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..b8853fe --- /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": "snapshot", + "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..6706b7e --- /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": "snapshot", + "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..4350536 --- /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": "snapshot", + "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..2af690f --- /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": "snapshot", + "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..d490d20 --- /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": "snapshot", + "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..e7dea24 --- /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": "snapshot", + "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..0d0237c --- /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": "snapshot", + "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..ab68854 --- /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": "snapshot", + "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..c3c0aed --- /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": "snapshot", + "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..9f78176 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-164-33e4c6591c.json @@ -0,0 +1,341 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-164-33e4c6591c", + "operation": "snapshot", + "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": null, + "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..bd49103 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-165-501ee1df12.json @@ -0,0 +1,636 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-165-501ee1df12", + "operation": "snapshot", + "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": null, + "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..8903f62 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-166-cda14f0b08.json @@ -0,0 +1,670 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-166-cda14f0b08", + "operation": "snapshot", + "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": null, + "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..cb98ab4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-167-114a88771f.json @@ -0,0 +1,428 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-167-114a88771f", + "operation": "snapshot", + "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": null, + "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..e22b5d1 --- /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": "snapshot", + "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..3c43b21 --- /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": "snapshot", + "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..5ade0b5 --- /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": "snapshot", + "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..f694756 --- /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": "snapshot", + "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..9908da5 --- /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": "snapshot", + "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..e8903ae --- /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": "snapshot", + "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..538925d --- /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": "snapshot", + "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..0dd1d0e --- /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": "snapshot", + "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..7c68a6f --- /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": "snapshot", + "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..a5021d6 --- /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": "snapshot", + "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..8df8380 --- /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": "snapshot", + "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..c464266 --- /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": "snapshot", + "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..e1471f7 --- /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": "snapshot", + "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..e75c150 --- /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": "snapshot", + "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..cbb7949 --- /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": "snapshot", + "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..0b30f3e --- /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": "snapshot", + "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..cc00794 --- /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": "snapshot", + "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..3923b29 --- /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": "snapshot", + "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..962dbd9 --- /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": "snapshot", + "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..248809c --- /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": "snapshot", + "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..25977ad --- /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": "snapshot", + "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..4897988 --- /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": "snapshot", + "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..f1018de --- /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": "snapshot", + "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..85adea4 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-191-2021d398f8.json @@ -0,0 +1,1241 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-191-2021d398f8", + "operation": "snapshot", + "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": null, + "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..d208e07 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-192-dd2c3f0c1c.json @@ -0,0 +1,195 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-192-dd2c3f0c1c", + "operation": "snapshot", + "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": null, + "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..3a157c8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-193-bd488a5710.json @@ -0,0 +1,244 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-193-bd488a5710", + "operation": "snapshot", + "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": null, + "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..a0fae65 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-194-17922977f6.json @@ -0,0 +1,290 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-194-17922977f6", + "operation": "snapshot", + "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": null, + "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..e540ad3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-195-1a6efe22a8.json @@ -0,0 +1,286 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-195-1a6efe22a8", + "operation": "snapshot", + "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": null, + "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..ee250a3 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-196-d14f03afcd.json @@ -0,0 +1,310 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-196-d14f03afcd", + "operation": "snapshot", + "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": null, + "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..0b41d9b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-197-026402bf2e.json @@ -0,0 +1,393 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-197-026402bf2e", + "operation": "snapshot", + "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": null, + "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..07d9e8d --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-198-a9ea7ba9c3.json @@ -0,0 +1,397 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-198-a9ea7ba9c3", + "operation": "snapshot", + "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": null, + "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..bf8c21e --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-199-829a5c949d.json @@ -0,0 +1,393 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-199-829a5c949d", + "operation": "snapshot", + "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": null, + "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..e8fc174 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-200-3313d92719.json @@ -0,0 +1,393 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-200-3313d92719", + "operation": "snapshot", + "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": null, + "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..4cfd0cc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-201-8207a4008e.json @@ -0,0 +1,393 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-201-8207a4008e", + "operation": "snapshot", + "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": null, + "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..9633785 --- /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": "snapshot", + "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..2e06084 --- /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": "snapshot", + "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..4e0e4bd --- /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": "snapshot", + "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..8cd59fd --- /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": "snapshot", + "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..60f054e --- /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": "snapshot", + "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..abc98d3 --- /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": "snapshot", + "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..5db3eb5 --- /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": "snapshot", + "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..b213a19 --- /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": "snapshot", + "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..084688a --- /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": "snapshot", + "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..e82099b --- /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": "snapshot", + "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..10f4b42 --- /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": "snapshot", + "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..c7f04cd --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-213-aa53408d2f.json @@ -0,0 +1,1024 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-213-aa53408d2f", + "operation": "snapshot", + "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": null, + "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..1735e46 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-214-6dc49544c0.json @@ -0,0 +1,411 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-214-6dc49544c0", + "operation": "snapshot", + "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": null, + "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..2354fb7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-215-39e86f8f53.json @@ -0,0 +1,271 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-215-39e86f8f53", + "operation": "snapshot", + "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": null, + "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..37b7454 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-216-465422d47b.json @@ -0,0 +1,201 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-216-465422d47b", + "operation": "snapshot", + "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": null, + "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..d4b9001 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-217-2d887b2a8b.json @@ -0,0 +1,201 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-217-2d887b2a8b", + "operation": "snapshot", + "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": null, + "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..256af88 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-218-587666c709.json @@ -0,0 +1,137 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-218-587666c709", + "operation": "snapshot", + "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": null, + "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..1d77a24 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-219-c6446b7b2e.json @@ -0,0 +1,137 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-219-c6446b7b2e", + "operation": "snapshot", + "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": null, + "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..d1b7d7d --- /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": "snapshot", + "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..bc4b247 --- /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": "snapshot", + "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..702588b --- /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": "snapshot", + "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..55794ab --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-223-4dc8092992.json @@ -0,0 +1,2483 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-223-4dc8092992", + "operation": "snapshot", + "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": null, + "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..aa5fd2d --- /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": "snapshot", + "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..ae588b6 --- /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": "snapshot", + "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..1414665 --- /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": "snapshot", + "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..70c76fb --- /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": "snapshot", + "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..fe4e46e --- /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": "snapshot", + "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..f4043d9 --- /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": "snapshot", + "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..704fa6f --- /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": "snapshot", + "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..34ff07a --- /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": "snapshot", + "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..f66f7bd --- /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": "snapshot", + "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..219c3e1 --- /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": "snapshot", + "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..a33795c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-234-01ad9a0db0.json @@ -0,0 +1,876 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-234-01ad9a0db0", + "operation": "snapshot", + "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": null, + "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..dcdbff7 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-235-8a3992468b.json @@ -0,0 +1,880 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-235-8a3992468b", + "operation": "snapshot", + "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": null, + "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..4b05dae --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-236-621c6d6a9e.json @@ -0,0 +1,294 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-236-621c6d6a9e", + "operation": "snapshot", + "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": null, + "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..df10c6c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-237-01ee478666.json @@ -0,0 +1,281 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-237-01ee478666", + "operation": "snapshot", + "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": null, + "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..6293b4a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-238-1a8cf8c870.json @@ -0,0 +1,317 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-238-1a8cf8c870", + "operation": "snapshot", + "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": null, + "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..8add0bb --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-239-a6dada3682.json @@ -0,0 +1,256 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-239-a6dada3682", + "operation": "snapshot", + "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": null, + "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..e1ba9d9 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-240-77d56a1585.json @@ -0,0 +1,317 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-240-77d56a1585", + "operation": "snapshot", + "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": null, + "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..d3d2de0 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-241-e171ef72ce.json @@ -0,0 +1,256 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-241-e171ef72ce", + "operation": "snapshot", + "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": null, + "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..41ba86f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-242-5c198a8490.json @@ -0,0 +1,292 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-242-5c198a8490", + "operation": "snapshot", + "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": null, + "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..4441790 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-243-14366a47ff.json @@ -0,0 +1,224 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-243-14366a47ff", + "operation": "snapshot", + "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": null, + "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..dfaf585 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-244-4ccea91f13.json @@ -0,0 +1,199 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-244-4ccea91f13", + "operation": "snapshot", + "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": null, + "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..0ac80fc --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-245-537356bcf4.json @@ -0,0 +1,194 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-245-537356bcf4", + "operation": "snapshot", + "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": null, + "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..f65a83a --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-246-295f39e09b.json @@ -0,0 +1,206 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-246-295f39e09b", + "operation": "snapshot", + "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": null, + "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..1316bce --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-247-39d6959685.json @@ -0,0 +1,220 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-247-39d6959685", + "operation": "snapshot", + "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": null, + "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..ea77db8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-248-d1bc18e068.json @@ -0,0 +1,176 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-248-d1bc18e068", + "operation": "snapshot", + "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": null, + "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..69a8c35 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-249-6b8a42981d.json @@ -0,0 +1,1367 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-249-6b8a42981d", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 104" + }, + "request": { + "rootId": "351:1546" + }, + "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": null, + "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..8b507b8 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-250-935ccdb80f.json @@ -0,0 +1,5063 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-250-935ccdb80f", + "operation": "snapshot", + "source": { + "repository": "dev-five-git/devup-figma-plugin", + "commit": "243db650f1d635ab5385546a2a297eae4ea93515", + "testId": "render real world component real world $ 105" + }, + "request": { + "rootId": "536:2019" + }, + "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": null, + "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..f6e9f60 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-251-50acddfb96.json @@ -0,0 +1,2877 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-251-50acddfb96", + "operation": "snapshot", + "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": null, + "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..eaebb75 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-252-49e979239e.json @@ -0,0 +1,2866 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-252-49e979239e", + "operation": "snapshot", + "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": null, + "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..21e1964 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-253-347a2e5fb2.json @@ -0,0 +1,8206 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-253-347a2e5fb2", + "operation": "snapshot", + "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": null, + "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..3508474 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-254-9f340b6a10.json @@ -0,0 +1,16513 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-254-9f340b6a10", + "operation": "snapshot", + "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": null, + "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..05d109f --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-255-d01d8c7de6.json @@ -0,0 +1,232 @@ +{ + "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" + }, + "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..ed2381b --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/codegen/upstream-codegen-256-baf32cc08e.json @@ -0,0 +1,232 @@ +{ + "schemaVersion": 1, + "id": "upstream-codegen-256-baf32cc08e", + "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 extracted Status declaration 1" + }, + "request": { + "rootId": "captured:169" + }, + "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..ac66017 --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/responsive/upstream-responsive-267-88b21cad2a.json @@ -0,0 +1,769 @@ +{ + "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": { + "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..48b139c --- /dev/null +++ b/fixtures/devup-figma-plugin/cases/snapshot/upstream-render-263-d2763f9b9f.json @@ -0,0 +1,65 @@ +{ + "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", + "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/ledger.json b/fixtures/devup-figma-plugin/ledger.json index fde1125..4d78114 100644 --- a/fixtures/devup-figma-plugin/ledger.json +++ b/fixtures/devup-figma-plugin/ledger.json @@ -83,9 +83,13 @@ { "testId": "src/__tests__/code.test.ts > registerCodegen > should register codegen [case 1]", "sourceFile": "src/__tests__/code.test.ts", - "classification": "upstream_runtime_only", - "fixtureIds": [], - "rustTest": "upstream_contract::built_in_scripts_only_use_read_operations", + "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 계약에서 검증한다." }, { @@ -107,9 +111,11 @@ { "testId": "src/__tests__/code.test.ts > registerCodegen > should generate responsive code when root node is SECTION", "sourceFile": "src/__tests__/code.test.ts", - "classification": "contract", - "fixtureIds": [], - "rustTest": "compat_manifest::pinned_plugin_corpus_is_complete_and_self_consistent" + "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", @@ -620,16 +626,20 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", @@ -662,891 +672,1153 @@ { "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders simple component without variants [case 1]", "sourceFile": "src/codegen/__tests__/codegen.test.ts", - "classification": "rust_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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]", @@ -1558,9 +1830,12 @@ { "testId": "src/codegen/__tests__/codegen.test.ts > Codegen > renders component with parent component set name", "sourceFile": "src/codegen/__tests__/codegen.test.ts", - "classification": "rust_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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%", @@ -1649,9 +1924,12 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", @@ -1880,30 +2158,42 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", @@ -1922,765 +2212,983 @@ { "testId": "src/codegen/__tests__/codegen.test.ts > render real world component > real world $ [case 1]", "sourceFile": "src/codegen/__tests__/codegen.test.ts", - "classification": "rust_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", @@ -2818,23 +3326,29 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", @@ -4745,9 +5259,11 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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)", @@ -4878,9 +5394,11 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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)", @@ -5060,9 +5578,11 @@ { "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_assertion", - "fixtureIds": [], - "rustTest": "compat_fixtures::upstream_ledger_mapping" + "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", diff --git a/fixtures/devup-figma-plugin/manifest.json b/fixtures/devup-figma-plugin/manifest.json index d62e9a8..0ba6be7 100644 --- a/fixtures/devup-figma-plugin/manifest.json +++ b/fixtures/devup-figma-plugin/manifest.json @@ -12,8 +12,8 @@ "assertions": 1974 }, "counts": { - "cases": 1, - "snapshots": 1, + "cases": 269, + "snapshots": 269, "ledgerEntries": 978 }, "sourceTestFiles": [ @@ -77,9 +77,2153 @@ "path": "cases/codegen/live-shape-smoke.json", "sha256": "9497dfe8dd396bd5680c39cc04c526b6993d2d244136491f5593258c0e71faa7" }, + { + "path": "cases/codegen/upstream-codegen-001-4410624749.json", + "sha256": "c6bbb621650a9d42e44119bce727ec432694bfcd2a20cf1df91d33e9d5c5620b" + }, + { + "path": "cases/codegen/upstream-codegen-002-c1ac954cb6.json", + "sha256": "539e4db6d8fa2702e5ab8e1f2c877a68613b1cf28cfa6c4aec0b5fc69bf3f594" + }, + { + "path": "cases/codegen/upstream-codegen-003-c855738695.json", + "sha256": "6c97841c5e52df3782c5cd53b387804636b43e411c21074d4880ec4a7112c335" + }, + { + "path": "cases/codegen/upstream-codegen-004-8ec61c5bb5.json", + "sha256": "78788054aa12b3f63cf4a873a256ba8ebbacf0bf5a08777ffdef8f256a4419cc" + }, + { + "path": "cases/codegen/upstream-codegen-005-bcc6ca7dbf.json", + "sha256": "12619d6200b5124b5ec308dc9e88a520281bf072009e581487433f82eaaf7f7f" + }, + { + "path": "cases/codegen/upstream-codegen-006-86c21dc8ce.json", + "sha256": "28ea91df1e0012a9fee31dab64773579a4d482c5188eab38c98c962cb8154055" + }, + { + "path": "cases/codegen/upstream-codegen-007-c1c1afa5d7.json", + "sha256": "ef009e346e0bee14c2c8c7b04c2ec48084f286a6b44d31c893395c421978c069" + }, + { + "path": "cases/codegen/upstream-codegen-008-8ea06a6c88.json", + "sha256": "dd5fcc8527e51178cdee9efaeeaf37f82d3e5311518ebfc0568c5e6303f42f08" + }, + { + "path": "cases/codegen/upstream-codegen-009-008aac1a2c.json", + "sha256": "5a677e967455ea6589607054074338fe0731da8fff7703d4b203211cf7900825" + }, + { + "path": "cases/codegen/upstream-codegen-010-8454d22acd.json", + "sha256": "3486d8f937b9d9cffc734f85c4e9d7d3817b47e8015f32dcb5422e6af15133eb" + }, + { + "path": "cases/codegen/upstream-codegen-011-72709aab82.json", + "sha256": "075fd46e89cc533ccc6f386590ae35c6a590aa451357709710ae9198cbc8baa8" + }, + { + "path": "cases/codegen/upstream-codegen-012-92c671c0e8.json", + "sha256": "f323112d0f3a37d0bf70879c2ca95c778839737e04c670b0cbd4d9fd117c2759" + }, + { + "path": "cases/codegen/upstream-codegen-013-351e69a13b.json", + "sha256": "e80af620263d16de3a664f9e6370d88b2b6e6a8b815b2743f962be43c9bfcfa0" + }, + { + "path": "cases/codegen/upstream-codegen-014-828c466260.json", + "sha256": "ee699ad83b22de7ee1f94beb71e5cba1a015182bc0034b11ca21f8d443334bad" + }, + { + "path": "cases/codegen/upstream-codegen-015-eaef178e47.json", + "sha256": "c5226dbc9af51b109300ffc531b66f88360bc4abaeb5a10fde2080964bd040f8" + }, + { + "path": "cases/codegen/upstream-codegen-016-3f1fb1569b.json", + "sha256": "69a84272b7a91ce6e3ff48c9cafc75ecaf555f9fad4eb777fdf8c772161779ac" + }, + { + "path": "cases/codegen/upstream-codegen-017-44cff97cec.json", + "sha256": "a3e4e409005789aea3bd468ec96b29e80a35aae0cd9ac756beb6666a83212281" + }, + { + "path": "cases/codegen/upstream-codegen-018-bc5eb21a9e.json", + "sha256": "6e50912bc2d1955eef876ec6472f3d7d57a071262cea827bcb82555d7a7712c2" + }, + { + "path": "cases/codegen/upstream-codegen-019-4988f86e5e.json", + "sha256": "9d39f88d2a573d27ecf897feb983b060a8fb518dcebc2a06e6ae94ab89dd213e" + }, + { + "path": "cases/codegen/upstream-codegen-020-a9d569be7a.json", + "sha256": "61946632dd98c7c5af24b4a3d1f4e5b0ba2842f9fb6c26db99958bda4e3eabb9" + }, + { + "path": "cases/codegen/upstream-codegen-021-6cae93b843.json", + "sha256": "81c3ae91f4bd9e69029a7c79017ddc9f2e1af701083ef10592fce4b4021c0917" + }, + { + "path": "cases/codegen/upstream-codegen-022-8dce1fe15f.json", + "sha256": "8979bb348895e268e3649ecf2f473bb22a8ca8c5445ba73b2c06e60600ea84f6" + }, + { + "path": "cases/codegen/upstream-codegen-023-040bff1c77.json", + "sha256": "8098650a1226f0818d47188df232aabab1d5df14e750bf11849f8e24507ce1af" + }, + { + "path": "cases/codegen/upstream-codegen-024-eb534f354c.json", + "sha256": "89ec34eed77943e5a8abddf1c08ddd486328297f74e3f2c96b5b95d9786e8ae5" + }, + { + "path": "cases/codegen/upstream-codegen-025-74cf3c3463.json", + "sha256": "9d73d43011603f8d95915a3c8cd61a333e982a290f10f0dd282c8573568e99df" + }, + { + "path": "cases/codegen/upstream-codegen-026-e6df42a1c0.json", + "sha256": "a1732a861a7c0995e5d115f2c6eb4a1a5dbe1fe96a2d6ec50d16823c66da6c5e" + }, + { + "path": "cases/codegen/upstream-codegen-027-2373d0fb1b.json", + "sha256": "bb6dee5fced842fbafeacd041339275cecd1ea46713b742c12faa04dc9bfe3c8" + }, + { + "path": "cases/codegen/upstream-codegen-028-0dcf04d5ca.json", + "sha256": "2bfda4456131a4789832552c9ac615e483d2566ebc321aa3eab2a6c08be66913" + }, + { + "path": "cases/codegen/upstream-codegen-029-dd01228f04.json", + "sha256": "4d461178b61b6ef270f7c79675049400fe08357fec564969e0170577d50e5ecb" + }, + { + "path": "cases/codegen/upstream-codegen-030-f4528f2a74.json", + "sha256": "f3af9bac2759db070671adad946b0db9c564ff760c5fddaf91e2bef7d7fade57" + }, + { + "path": "cases/codegen/upstream-codegen-031-5d6f0a82e3.json", + "sha256": "9a08460c4d225ec816801fb8a5565858b9b48635997d235f1b2197c94b3e17e6" + }, + { + "path": "cases/codegen/upstream-codegen-032-be85ad69d0.json", + "sha256": "df3eee4d23e9eee7019a995c81014ed1fdc2220254bfc9e62c134d12cd6ffc4f" + }, + { + "path": "cases/codegen/upstream-codegen-033-4f42f0cabb.json", + "sha256": "2402be9899299eaf6ca632b1a9df77958afa142ac725b7444f0b8b82028df2f9" + }, + { + "path": "cases/codegen/upstream-codegen-034-e25e34d3de.json", + "sha256": "da66bbb72f395636fb4b7919c2b29a585cdf2a783f47b187f33cd708001b4af3" + }, + { + "path": "cases/codegen/upstream-codegen-035-1d66b429cf.json", + "sha256": "0febd4aff0a08b6cedbf1f507982d18f1f7d559783381c3a161a4947d9d553ec" + }, + { + "path": "cases/codegen/upstream-codegen-036-6803ff59e6.json", + "sha256": "8c9a7fc7d11fc190c84e63cdff44dc5caa4d934949048705aea24d2829d5a545" + }, + { + "path": "cases/codegen/upstream-codegen-037-e576c2fba9.json", + "sha256": "ff35d4f13607115c0ebd9601e05158a21a013bf22ec66ba7550f397b6af554a8" + }, + { + "path": "cases/codegen/upstream-codegen-038-280770f34d.json", + "sha256": "cce822e7ab32a123c57ac21ce9a4c52949f758367e914c159ed91b9e18d5bebb" + }, + { + "path": "cases/codegen/upstream-codegen-039-84e4037075.json", + "sha256": "e7f584bfee6c60d85b6aca62bc58de2c3de4afb284cbd601c7ad8830a17b8446" + }, + { + "path": "cases/codegen/upstream-codegen-040-e2a36763a6.json", + "sha256": "93b3cba7a1598bb95698e4205061cc15b3ac67a75efdb74ce558a5fdc989433c" + }, + { + "path": "cases/codegen/upstream-codegen-041-7c9175487c.json", + "sha256": "3afedbba04637eed0098879e6dac98ff4d7c9bcef141e29e4d257113f16f00ef" + }, + { + "path": "cases/codegen/upstream-codegen-042-246e72e17a.json", + "sha256": "ee92ef69d03978673340acd9cce265de62c6748d8bfdc69a78300060946ba875" + }, + { + "path": "cases/codegen/upstream-codegen-043-50fac72de7.json", + "sha256": "da3eccde5654dc4227dbb832b6f45217bfcaa624c7f62ff920c96fbfd10d5dc1" + }, + { + "path": "cases/codegen/upstream-codegen-044-a9f4c5ba13.json", + "sha256": "30e52888a946add40d0b7aa34f8523a38ea3b61b2f3498b00b02579f07f15ab4" + }, + { + "path": "cases/codegen/upstream-codegen-045-958507518d.json", + "sha256": "5eca1cb9753acfbfa9b51f892c0791a595df92305589f9f7b0cedbb2adb36b48" + }, + { + "path": "cases/codegen/upstream-codegen-046-82a07e3ec3.json", + "sha256": "8e7158f3901ae1a3c9d8dced86a66df5561a16140607048561000b831c8f56f4" + }, + { + "path": "cases/codegen/upstream-codegen-047-d524fcd6c3.json", + "sha256": "15d4cc5862d8e49391b6a996372b218e11e720101d9841340c03b9a9c60e3b9d" + }, + { + "path": "cases/codegen/upstream-codegen-048-fa3442e264.json", + "sha256": "e38c997be7c5a05c0255c19cb501b04d0edbcc04d85e16bd18981f797ff7b89a" + }, + { + "path": "cases/codegen/upstream-codegen-049-b3bbd32960.json", + "sha256": "43478bab75e7d7170232bb166a5315bcc68e9b9324acb6f2faa965992c8bab58" + }, + { + "path": "cases/codegen/upstream-codegen-050-fda399bfe0.json", + "sha256": "a5cea21d2d9ca4b424e90d57396cc3c94f07d608f8081459cd4948e8947cd462" + }, + { + "path": "cases/codegen/upstream-codegen-051-53df7b9474.json", + "sha256": "c7e34c7fc8aa26330a63be7aeceff3f0b3d900dd63bbf8492388284208db0f2d" + }, + { + "path": "cases/codegen/upstream-codegen-052-e6195ba5a2.json", + "sha256": "cb514b52419527f2f37dc97a988fd5fa7f539dc1f4eab38d943bde85f1458ebd" + }, + { + "path": "cases/codegen/upstream-codegen-053-5fbe283840.json", + "sha256": "a172ba20810b7e9ac7e25e268ce1c859f45860c1dd9dd41d1c4891c54d2a8e8c" + }, + { + "path": "cases/codegen/upstream-codegen-054-e536c17528.json", + "sha256": "d94b36be9b451ba1acf02f7bad541de5fdceea6d0fb9a01245a0ced2f5e1916a" + }, + { + "path": "cases/codegen/upstream-codegen-055-1539142ffd.json", + "sha256": "4fdb0831d003c375dc2b4bb597224b26e0b3e799f86378ec276f42f9e765aaeb" + }, + { + "path": "cases/codegen/upstream-codegen-056-834fa66895.json", + "sha256": "ee1da80d666c83731e19f1d802f441f186463c54a893e37b7740093838014083" + }, + { + "path": "cases/codegen/upstream-codegen-057-595a483b50.json", + "sha256": "4770650ba77076448f80e9fe8809e1e138715868f5269feb801190acc1caf0f0" + }, + { + "path": "cases/codegen/upstream-codegen-058-a5bed8edb7.json", + "sha256": "58ec188adcfa08c67cf827ea12d3c6a49e18f586fbf25ece36656193435bbe52" + }, + { + "path": "cases/codegen/upstream-codegen-059-0b07052901.json", + "sha256": "34aeed18b30e0129b265ce95ced96cd5710fedfbefdbbfb7ee193c5555701ae0" + }, + { + "path": "cases/codegen/upstream-codegen-060-b58a7535c7.json", + "sha256": "314e13df1c896da6f0f4bdf56a716f7d18c712e7641e573023bfdd23ab59cbf8" + }, + { + "path": "cases/codegen/upstream-codegen-061-1c44313e59.json", + "sha256": "e1c45ff3209b6809af08f5c5904e68bdfc9f72954ba3d263fff17c9ebf75a8b5" + }, + { + "path": "cases/codegen/upstream-codegen-062-4fdcb21c9d.json", + "sha256": "a50fb3ab9f17c00dfc4821a69ef1eb5517428864f0f529296817e6d8602891ea" + }, + { + "path": "cases/codegen/upstream-codegen-063-a8231002de.json", + "sha256": "5b17e2b2de581b4d413014761d325d46b9ea05a3a312d410479d95f9c1b8a473" + }, + { + "path": "cases/codegen/upstream-codegen-064-764419ad9b.json", + "sha256": "db964a152f81c38b4645fd4a37846625cc330315542922dcaaa299e3fc883ed9" + }, + { + "path": "cases/codegen/upstream-codegen-065-6c1be61067.json", + "sha256": "3c8548e4a972247605b25f94b68c730bf578ee1c30d2c4b7a5c8ae0f233c69cd" + }, + { + "path": "cases/codegen/upstream-codegen-066-6525a64377.json", + "sha256": "520ff2aef87ab13ebb6751b65fe7294d728b56ce84033b56396c278105076cf8" + }, + { + "path": "cases/codegen/upstream-codegen-067-3ffe06a1a9.json", + "sha256": "10cb6c1edb0833c8f1dcbab238f03af2bab930880f9fd7c0aef8ea8f200cd618" + }, + { + "path": "cases/codegen/upstream-codegen-068-0d86452528.json", + "sha256": "a92f92f805897eb828ead1a04a671df5daf1a828a9891cf0bd7ce9a2735adeeb" + }, + { + "path": "cases/codegen/upstream-codegen-069-0fa1145f4c.json", + "sha256": "72d40621ab7f22a8097a234edabfea0c79374ca9898debab7b7ea5e8d9eb3695" + }, + { + "path": "cases/codegen/upstream-codegen-070-a01830c33f.json", + "sha256": "845356f70ac8917a20cc40d10fb19dfbefb741e6cb5c22945bc474019ffb92d8" + }, + { + "path": "cases/codegen/upstream-codegen-071-3a132a6b4d.json", + "sha256": "7ebb327955b50960d5a71442822f314a977f711f27f6e74c9be0ee8d2aa7c4bf" + }, + { + "path": "cases/codegen/upstream-codegen-072-df70a74728.json", + "sha256": "2ad6a6009a8dc6e3caa36b2b96359c8138a1095ec36b55b128a707c64ede35c2" + }, + { + "path": "cases/codegen/upstream-codegen-073-ef0cdd87cf.json", + "sha256": "ababcd2032e3569c1c793f2813cd9d4fbe8212c1badf21b2ddb0e6ca60b3f479" + }, + { + "path": "cases/codegen/upstream-codegen-074-57a24a2690.json", + "sha256": "24495faf0d43a1fdad1f9ea0023396b8d238c878ac0cc08b7ba090776a434cb2" + }, + { + "path": "cases/codegen/upstream-codegen-075-fb8db22bb9.json", + "sha256": "099da86461b8cb3ee07d64d277d37f6c7c068175dadb9f00d55c4e81be17751b" + }, + { + "path": "cases/codegen/upstream-codegen-076-3d2d4543bb.json", + "sha256": "eb6cb1e388c6b082fe8a9891edfd0958ae0c0a146733e9804e3d97c590996226" + }, + { + "path": "cases/codegen/upstream-codegen-077-a65991a745.json", + "sha256": "a2e05be372be569ad0418fcfe8ed8452d44a9f9fa5b7c121936e7f83b8dc86da" + }, + { + "path": "cases/codegen/upstream-codegen-078-d6b1085274.json", + "sha256": "acd6b4a3c89131e232ddfcd1f50d3d6f86953e3c5febb93f28e4b3b2729f08d0" + }, + { + "path": "cases/codegen/upstream-codegen-079-9e7f3ee9e4.json", + "sha256": "5c0abbc72792d5aca4bd736537d19a7679bc6ad58b7ec655130ff65bd0224fb7" + }, + { + "path": "cases/codegen/upstream-codegen-080-f6233dd6a0.json", + "sha256": "7166f4e693454261434b972baf9419fd45b9104fbe9b01330489d35a073ca7da" + }, + { + "path": "cases/codegen/upstream-codegen-081-ed3fa48802.json", + "sha256": "15b863981a383f70509c009f0f4b1182516851b04227a03085ac7236c7f92a67" + }, + { + "path": "cases/codegen/upstream-codegen-082-db0d8839e8.json", + "sha256": "27fd7558fc8c923d0aa204bc36b82d169ad1d09f2a1c2c9fe35fc0d3fd0b2bff" + }, + { + "path": "cases/codegen/upstream-codegen-083-1820110e8a.json", + "sha256": "5916899b3ffcabcc6ada1794e6df8af418cda67b37b4c77fbb93295e3a31496c" + }, + { + "path": "cases/codegen/upstream-codegen-084-3d01c94f87.json", + "sha256": "b56ed700786ae59631770e6f6b8da676aabafd10c368d0334a438af0c361ad94" + }, + { + "path": "cases/codegen/upstream-codegen-085-1f274ec7a6.json", + "sha256": "ad11cd3d14dff71e9073fb6cb345ca7ab9cfd91bc55da12d426c66f7d65b5ed4" + }, + { + "path": "cases/codegen/upstream-codegen-086-a44a580f30.json", + "sha256": "b747d9c377f615071558b33a29fc73f448ee94dd28af78a3f8470ef4527a4ed8" + }, + { + "path": "cases/codegen/upstream-codegen-087-e95c0eccc2.json", + "sha256": "9f60e935af51d0c54f6910ff248c1213f510a37acc16846a7558366261a99f05" + }, + { + "path": "cases/codegen/upstream-codegen-088-f9ca312d49.json", + "sha256": "c34cc2a78c8de423cfc4f415287ace0291bd2ead76f025640dbb9ae93120d3a4" + }, + { + "path": "cases/codegen/upstream-codegen-089-1d28dfdd93.json", + "sha256": "48b135d15889f9baf9fdc10ae6fa0c1020342ee2757db70f9ceb8fcad96db752" + }, + { + "path": "cases/codegen/upstream-codegen-090-e8878c5cbf.json", + "sha256": "8dbf9308e95cd4c6016ac752436c6f3265083f1846e8b3e3908ff45892e1d47d" + }, + { + "path": "cases/codegen/upstream-codegen-091-dc61cb2277.json", + "sha256": "3d4a7459c3c7b3a2274f2933f1411c3abc9ebf9637b36a67b4639082ca677795" + }, + { + "path": "cases/codegen/upstream-codegen-092-96adc16d0c.json", + "sha256": "ec6204e164f3e6ef8b3ae5d5929f33ff7b2af224a4394b171614cfbbeacd0f21" + }, + { + "path": "cases/codegen/upstream-codegen-093-4573f32903.json", + "sha256": "5a527cbb1e7d91d37651d701ea1c07053722001fe16994a63c7bbfb5b595255e" + }, + { + "path": "cases/codegen/upstream-codegen-094-e0d0f3bfe1.json", + "sha256": "ee32073795cb1d6cbfbd6ffb6c4e5090195c8439c42414044f926763811e8a8c" + }, + { + "path": "cases/codegen/upstream-codegen-095-af3315e549.json", + "sha256": "d9cae022a995e40c26636a06eedc137c77211f94433dd84e694283fc4ececf29" + }, + { + "path": "cases/codegen/upstream-codegen-096-f8978e56ee.json", + "sha256": "1196dd5d67e11cf9615ed937f1cfc36e247c599f555a274d37e999b9ea8361a3" + }, + { + "path": "cases/codegen/upstream-codegen-097-da58ebc1a5.json", + "sha256": "a7a1bcad2e372264e98adee8fad840468b32f4abf3f88c9c2bf972f0b3e0bb11" + }, + { + "path": "cases/codegen/upstream-codegen-098-7c2267436f.json", + "sha256": "6435318909de6f9bdf9864c1c236fb0efa758548901c08215d655c41cc9a9116" + }, + { + "path": "cases/codegen/upstream-codegen-099-a2f954e973.json", + "sha256": "7e495c17be788f2f88d0e1225fd49ed7901473864a398f0bbc9ef74149308bd3" + }, + { + "path": "cases/codegen/upstream-codegen-100-a546e9e784.json", + "sha256": "c104c5d107e9a8744f6ae19542125402cdd0f2cf87d5a70d69593cc675931321" + }, + { + "path": "cases/codegen/upstream-codegen-101-394e6d9bf6.json", + "sha256": "0d89a71ba8d6e38a39b9f3e2d34fdb17e4e291b2faebfc793e059941dfc09bcb" + }, + { + "path": "cases/codegen/upstream-codegen-102-cbff7d3da9.json", + "sha256": "3345e54c68de776b6dd2083829bc55ac6658a650b6ffc9d145756a90dfcf33da" + }, + { + "path": "cases/codegen/upstream-codegen-103-246809daea.json", + "sha256": "c6643c24a5eced14948ef45d26bb5d020e921782a951da0e3bea3372ea159173" + }, + { + "path": "cases/codegen/upstream-codegen-104-d68998542b.json", + "sha256": "83838201f0d87320b0650bea6c803c6bf80ff6f2a64733b9dcfabde583c20d06" + }, + { + "path": "cases/codegen/upstream-codegen-105-0137b6735e.json", + "sha256": "544a092865aae2c1e64b268dede161ed3fb90c6171a52aff278d386a4c50cfcc" + }, + { + "path": "cases/codegen/upstream-codegen-106-6d687083cc.json", + "sha256": "7e6ef30f093f490616fde2dd1af1607171d97d396910dd8c432ad9e2492aa8de" + }, + { + "path": "cases/codegen/upstream-codegen-107-f624c65fa8.json", + "sha256": "667784ab9cf3215d0e61626eaba34b6a42ee0de7ced21456f48f1a93d268d24e" + }, + { + "path": "cases/codegen/upstream-codegen-108-c6c4dabf49.json", + "sha256": "bb1353e40f3cc5673b3315f1e02eac6c4d3bba0e019840478d56514c2541f109" + }, + { + "path": "cases/codegen/upstream-codegen-109-e2824ad5be.json", + "sha256": "525195bb6545703ff22495ebe4c91c9cd2e95a83197ed05e0b810de1db7c69a7" + }, + { + "path": "cases/codegen/upstream-codegen-110-f2505cce4b.json", + "sha256": "8615684e27c35b690243f1cf7891a6b31f200a9dfe55fb0b0fdb36582570c7a3" + }, + { + "path": "cases/codegen/upstream-codegen-111-72c9d38832.json", + "sha256": "e481e31b2ebb5ee38d53c22c6e5d98998f982f53a1d1f8a3a558d3e6d6ceafb8" + }, + { + "path": "cases/codegen/upstream-codegen-112-b5443c63a4.json", + "sha256": "bcb2e029f47fe2bd978a59a503102fbb8d81a38adf947b360fed01afa2fba36b" + }, + { + "path": "cases/codegen/upstream-codegen-113-702dadab11.json", + "sha256": "fe053b98777fec224c382dd103dfadf1b7dbfa0440cb062ddb9c89c8f4da6de0" + }, + { + "path": "cases/codegen/upstream-codegen-114-855686da78.json", + "sha256": "845869899bf79f78ca48ea26437d94d7c003b9679c35587cd6ef78b2d7c2ac41" + }, + { + "path": "cases/codegen/upstream-codegen-115-45d3f116b5.json", + "sha256": "7c365161780f6de37933d7d92e5301b95ac70474b5f4b8ceb2b5c369aae1ac87" + }, + { + "path": "cases/codegen/upstream-codegen-116-23097e86ce.json", + "sha256": "986fd3110e3edf2d38bb51d3d275b2f1933ffe97f613ad265f6c21c3058b00c4" + }, + { + "path": "cases/codegen/upstream-codegen-117-fb967a9342.json", + "sha256": "567378dad763ffea9f5c40b34b33fb7ea60b6fc9311ffb120d462834fd782bae" + }, + { + "path": "cases/codegen/upstream-codegen-118-b5cba733fa.json", + "sha256": "3bbf1b46a44fbb105bc4dba0acbccfe203cc13dca7184175ac770e3e235bb7b8" + }, + { + "path": "cases/codegen/upstream-codegen-119-882c2abd91.json", + "sha256": "6d5f5a07762281414a22b8ccffa555ac449bd914d65eb64c71353ecad556edb5" + }, + { + "path": "cases/codegen/upstream-codegen-120-7634e1ee10.json", + "sha256": "47c40e5b1d8a6e4a92c34a6d94affc30a51503abdecbe8ac337d404cc77f0e79" + }, + { + "path": "cases/codegen/upstream-codegen-121-0536a2e75b.json", + "sha256": "6eb3b99356ed43f34307021527424422849407d1e3a2e4d8b68c062329cfd5a6" + }, + { + "path": "cases/codegen/upstream-codegen-122-7ddad74cc1.json", + "sha256": "e1969963e90b62ecd2f5f24decb909c3bb037fb698c868100e02a9d109dc41bc" + }, + { + "path": "cases/codegen/upstream-codegen-123-179129a02c.json", + "sha256": "959859c111ec35b7c327b327ee855a0f3e2237a8625fbf3c2aca07ca15df6534" + }, + { + "path": "cases/codegen/upstream-codegen-124-bdedf14335.json", + "sha256": "a4b78f1809d83538d4122d9e68d0b2d051ed197b93aee362f45732cac4708b51" + }, + { + "path": "cases/codegen/upstream-codegen-125-4a4a93c4c9.json", + "sha256": "1cbad44409c60c249abad88f5a2136b998b92eb693b4e2bca1a846546e73c99e" + }, + { + "path": "cases/codegen/upstream-codegen-126-14073e1999.json", + "sha256": "632f4c09a4917aa862dcfdf57e06ac8c340458d9eb5f91cb0eaba213f84269e3" + }, + { + "path": "cases/codegen/upstream-codegen-127-1d5ead088d.json", + "sha256": "a215e8c07c7abebd6fb8443d3c2116c2958d452873a7cba762003aeeca6f607d" + }, + { + "path": "cases/codegen/upstream-codegen-128-2222304a14.json", + "sha256": "1270122eb0944456891bdb2b03237d85dfcbb979726e192ffa2cbaf65cc6c5ea" + }, + { + "path": "cases/codegen/upstream-codegen-129-7c97156f7f.json", + "sha256": "50d1188893fe76b0fb59de0732bb9c03ef62d411b474846a0ec657e786e9e926" + }, + { + "path": "cases/codegen/upstream-codegen-130-bbd4e9a97a.json", + "sha256": "0b941b47f83c3f6828473f45b66b86c9806e3cd85a542fbe7ad68d3748cb993c" + }, + { + "path": "cases/codegen/upstream-codegen-131-c6ef80ad0c.json", + "sha256": "e0d27279cd09ee39eaf5b89b4323db2abcdcc15009510dd7c216e4f437bd1dd5" + }, + { + "path": "cases/codegen/upstream-codegen-132-9a7b0243b6.json", + "sha256": "6fa77a6c227460261c2944ec6fbd87d6fee8187aaf9950c56cc3c7a952e8be71" + }, + { + "path": "cases/codegen/upstream-codegen-133-f425fa006c.json", + "sha256": "8a6316223779bf64bd97dbe4ccf37d6ece03c28b0c70b8b01262fdd1b25c77a6" + }, + { + "path": "cases/codegen/upstream-codegen-134-f80fffb8b4.json", + "sha256": "e2cfd203e735d09a429ac2d2d509d4fdf3c7a5b7886c1a700da2890965869fb7" + }, + { + "path": "cases/codegen/upstream-codegen-135-e00e826755.json", + "sha256": "f8a7fb45fb9d76cd4946bf4accb419abec684acd40e5a936ee2e1c0770fef5a7" + }, + { + "path": "cases/codegen/upstream-codegen-136-b68bd43ea7.json", + "sha256": "b3047f8d47a72011412e08117ec8ba555f46728b3cb2f93452d99e413e3cfe37" + }, + { + "path": "cases/codegen/upstream-codegen-137-83b2706e92.json", + "sha256": "e2b2f04d92b6fe88524191614564953fbd5c0e5b8617969fde2477bb4f6dc7c6" + }, + { + "path": "cases/codegen/upstream-codegen-138-9cccfcb552.json", + "sha256": "17f6ca3bfde02057e6ebfe4dbde00f496373c3688486ecadd651d811c847af41" + }, + { + "path": "cases/codegen/upstream-codegen-139-63f7b1f175.json", + "sha256": "32154262fe188d2d3177069ad2e9affe872d6d996daa2f0d704b9b50c9c6a8f8" + }, + { + "path": "cases/codegen/upstream-codegen-140-e577df9ad5.json", + "sha256": "8deb55cd3ba6be5d3d01f99c0a660adfe1c7be821d9cacdd8e47fffe99dc121c" + }, + { + "path": "cases/codegen/upstream-codegen-141-48307df49b.json", + "sha256": "74f0297a3eb103009df7deef19f43f5249e9a2cce180bdc41b02e27cf3c4105e" + }, + { + "path": "cases/codegen/upstream-codegen-142-ac82229282.json", + "sha256": "c997bec87cfa2ca593cb9ae6fe82fe080b19a89523a55cd8ff51ae884085d1f4" + }, + { + "path": "cases/codegen/upstream-codegen-143-52b441f9f4.json", + "sha256": "9e7cdde43f9b2fb0fdd0afc723bb72fb5de69901325ab977024efd43c8d78e4e" + }, + { + "path": "cases/codegen/upstream-codegen-144-042a6de403.json", + "sha256": "566467061b2d347372355836a19f351a449f49da3743a6b90b373e88ef788e68" + }, + { + "path": "cases/codegen/upstream-codegen-145-f7001b5648.json", + "sha256": "9b5a8e14dd23590e546e429253159b5245dd55ec082d626ebd7dc2499276096e" + }, + { + "path": "cases/codegen/upstream-codegen-146-56be99e864.json", + "sha256": "d5790c9d1080063da38b41ad38ea07fbbe230fbbe8a0ff75720d7c3be8180be4" + }, + { + "path": "cases/codegen/upstream-codegen-147-bb7df0f2f1.json", + "sha256": "85807daebde27aab2ef54bd63727eb569971024b372ec9345162025173181cc8" + }, + { + "path": "cases/codegen/upstream-codegen-148-62e9137131.json", + "sha256": "7a7681ce6102a5aa3bee9148185cf303b3c691d5e08539ec8716e77180a3ee54" + }, + { + "path": "cases/codegen/upstream-codegen-149-2491f4c5a5.json", + "sha256": "5eeef5d0ab78bc84b45564b4008dc4830c22ba7255a5538cb1298e8bef163cce" + }, + { + "path": "cases/codegen/upstream-codegen-150-ecb5bb4337.json", + "sha256": "3fd33cc5f36fdc9a64031f5da62642a1908af5465e8c326aff53ac3aa64fa50f" + }, + { + "path": "cases/codegen/upstream-codegen-151-7993d252dc.json", + "sha256": "d5d003a9d30b8fd9fbccde599c3d208490b8e4d024828948c162a641f9e8ba7c" + }, + { + "path": "cases/codegen/upstream-codegen-152-a05026a9db.json", + "sha256": "0c998397c1460cf3b2746882962da98ea62284345a319e26378b5fe3a71eb66b" + }, + { + "path": "cases/codegen/upstream-codegen-153-fb5205fc52.json", + "sha256": "a40c9c8d6cc85b9d261a58036e9081004b15f3e078f4b8267788eb5cb5442378" + }, + { + "path": "cases/codegen/upstream-codegen-154-1409376769.json", + "sha256": "8e8bd4645fdc8c087d1a12e509a6f3e769cac3f5e69f63852b29fe02fcc0e2df" + }, + { + "path": "cases/codegen/upstream-codegen-155-557eb84a98.json", + "sha256": "4a4e4ccd8938e7188abf42f6d63e3f821077328516f6b100befee1ef83720afd" + }, + { + "path": "cases/codegen/upstream-codegen-156-bec8be9b99.json", + "sha256": "bcea42d89ce331e9b20ad3f49e7da641b44c4ebc2fc39586da36080f18e3a589" + }, + { + "path": "cases/codegen/upstream-codegen-157-4cb71f2863.json", + "sha256": "4b51bd79d0a8636157fb5e59be28e43d797a96a9d8d7bd087ff73fb6b39aa3cb" + }, + { + "path": "cases/codegen/upstream-codegen-158-8e4821dcbc.json", + "sha256": "bb6675822b1461b5e7cb1cbcce970142842a0967ff45e45722c82ba59b73ab1a" + }, + { + "path": "cases/codegen/upstream-codegen-159-30962241b1.json", + "sha256": "8e623a13e15a392f11e4b35987e590fa772f8c090b692192c516257218f92825" + }, + { + "path": "cases/codegen/upstream-codegen-160-db5d3ac9d8.json", + "sha256": "ec9a6ce10e308f4bc82c961ee1fef0abaa270caca014bbc3e22256b248889efe" + }, + { + "path": "cases/codegen/upstream-codegen-161-5b230821f2.json", + "sha256": "026881c10d870bd4c4bc636ccba6b46cc601f7fcdec51475d023b97f240d1bff" + }, + { + "path": "cases/codegen/upstream-codegen-162-51e1254b4c.json", + "sha256": "0918703387381bfa6c8da2274377662d84da5b9f6378cd586b204b27192d33a5" + }, + { + "path": "cases/codegen/upstream-codegen-163-2a9f9a056a.json", + "sha256": "b40147421cee16f5985e9124a132065bdc2778e8f078eb9202ee5b2065c9e82c" + }, + { + "path": "cases/codegen/upstream-codegen-164-33e4c6591c.json", + "sha256": "18c05e6b9bb03e8f1d6a7e4617f1eaf8825449eafbbff998549aa5ec87206563" + }, + { + "path": "cases/codegen/upstream-codegen-165-501ee1df12.json", + "sha256": "4862624a593f905f1d3e3c91c07c57aed8174ac4928d57e3644c561f878fca8a" + }, + { + "path": "cases/codegen/upstream-codegen-166-cda14f0b08.json", + "sha256": "e532e868d2fd5e8e594df10c15ebdb75fdafb1bc979df0c9b77e887c750b0c2f" + }, + { + "path": "cases/codegen/upstream-codegen-167-114a88771f.json", + "sha256": "efb7db295df55d4ed5119f0b5d44334be2a1cea12d78a5cd88b4c49444ce57e3" + }, + { + "path": "cases/codegen/upstream-codegen-168-4211bd8279.json", + "sha256": "8f6d985e9cc9d11429e776987a17e0cba0f41c7a2ca0bdd9dbf5f34b3eb9f928" + }, + { + "path": "cases/codegen/upstream-codegen-169-796132e0cf.json", + "sha256": "b3ac4f96bd4271d4fecc03734d817ff838d8035fc6ea383981cabccac065e4b0" + }, + { + "path": "cases/codegen/upstream-codegen-170-eab2ed7d4c.json", + "sha256": "47066b983a14091cdd94c27375234041c0d12254d6e67a26d88b874082745290" + }, + { + "path": "cases/codegen/upstream-codegen-171-7e33e2b6a9.json", + "sha256": "f0ed87af0a6289a707bcc0639d65b17582b686eab07c91bbc85ede7b6b482c67" + }, + { + "path": "cases/codegen/upstream-codegen-172-99028c85ce.json", + "sha256": "c3836de5274ca5ee96c794977c6ef7da44644723979c34f755f010bc9adb0a1a" + }, + { + "path": "cases/codegen/upstream-codegen-173-64dbd7a102.json", + "sha256": "1346d7d45175a4d3e7490c5ea3ffd9d24ca84ac730748f2cc61d0d7cb5cae773" + }, + { + "path": "cases/codegen/upstream-codegen-174-68dd47d3f8.json", + "sha256": "0d9466c73d6e075a269536305fb7a15855cee0e385239dbbeae79f83ec30ff95" + }, + { + "path": "cases/codegen/upstream-codegen-175-ec3fd45731.json", + "sha256": "044fbfc4b53d7187dd67b71af052a9083e7ac6072d016c5548939247cd3bb07e" + }, + { + "path": "cases/codegen/upstream-codegen-176-653a030fdc.json", + "sha256": "fdd4c8e04321c0ab1fc3d3f7abd468b78d224d9c0945f43abbf8e3b34eca4773" + }, + { + "path": "cases/codegen/upstream-codegen-177-c147e7dd39.json", + "sha256": "73f5cd5c3a28dc69972cb6bfc3343dd8c3c05c8361fb25075bb2c08d6d36f52d" + }, + { + "path": "cases/codegen/upstream-codegen-178-d69d60d688.json", + "sha256": "ef3cffee57cd67c63f674d3e129fa63e14583882c170026bc2058a806a063402" + }, + { + "path": "cases/codegen/upstream-codegen-179-80620f6587.json", + "sha256": "6c0ab8d253ba4597e34788a91f0549043f51ef791ebba84756a91b687c145aad" + }, + { + "path": "cases/codegen/upstream-codegen-180-ad1a31fd03.json", + "sha256": "8e4ce5a7c03a3ddee0f2d13230eb03a3a92909c07d88fb0b93584b3cf10cdec6" + }, + { + "path": "cases/codegen/upstream-codegen-181-5afa626d49.json", + "sha256": "8c7f30c598a9191a8e0b1455fc2a7f309490a3e0670e5a51c542a42c2f78b377" + }, + { + "path": "cases/codegen/upstream-codegen-182-c45d19171b.json", + "sha256": "34ceb76ef2193fce3b3c6a0ce43c12e0a00ed324303c2648fb5cdb40f97b04f6" + }, + { + "path": "cases/codegen/upstream-codegen-183-7ede517e99.json", + "sha256": "870f4b37c019cf15a425c73e19f818bd973a8a7d1ce6a7fc95d67533c4fd2719" + }, + { + "path": "cases/codegen/upstream-codegen-184-0c09788bb7.json", + "sha256": "572ef8c7e456f89fd3fe641d6c221586f873617d76b1f8ec7d17aa1b274a1012" + }, + { + "path": "cases/codegen/upstream-codegen-185-e79c2ae189.json", + "sha256": "5762667ca280698fd19951866a1542998c4aee2ea4f7a464ee3e010916153b64" + }, + { + "path": "cases/codegen/upstream-codegen-186-0988e78887.json", + "sha256": "2b64f2b61e4581a0e5f2a1677799b4d5874b95c51663f9313385a343f877fac2" + }, + { + "path": "cases/codegen/upstream-codegen-187-8b30b935a4.json", + "sha256": "93f0bd22914619f04488b642f6aca77b9fddfd4269dc265efc0c9a791ea547d4" + }, + { + "path": "cases/codegen/upstream-codegen-188-ea2a1af6a1.json", + "sha256": "f2db6e7b2c0bf3c5c69a5016e9618350acf318510aa5c61492f0a8bc70f25e0d" + }, + { + "path": "cases/codegen/upstream-codegen-189-75736e48e0.json", + "sha256": "df73eef74f13069acaa76b3fdb147d7c3e78e78c816e8dd02f5f26dd486105b4" + }, + { + "path": "cases/codegen/upstream-codegen-190-d5a9045231.json", + "sha256": "706b0bb9218847fd5058c98f9993953fcfc3943641bc08e0a6bef0712fdbebe0" + }, + { + "path": "cases/codegen/upstream-codegen-191-2021d398f8.json", + "sha256": "fb0a28235688265a1991474f8631c11c250f668cf1cc85ceae8d26fbf516b415" + }, + { + "path": "cases/codegen/upstream-codegen-192-dd2c3f0c1c.json", + "sha256": "3f6351d1ffe6fea7ec156961e78777e7b9ff8b451b554f60c6cb3de6ba4c4337" + }, + { + "path": "cases/codegen/upstream-codegen-193-bd488a5710.json", + "sha256": "fdab289238ba4c9dfa50dd96bb7b0cd5bfe5c880311185f0a71ddfce483485eb" + }, + { + "path": "cases/codegen/upstream-codegen-194-17922977f6.json", + "sha256": "8dd3de644cb951f797c1a05ae830504184741d27858b229f33d255e10bab36ed" + }, + { + "path": "cases/codegen/upstream-codegen-195-1a6efe22a8.json", + "sha256": "8c40f6144377a6215c876ede8f1a9a8e87d927342644882db6eaf934d0c3d048" + }, + { + "path": "cases/codegen/upstream-codegen-196-d14f03afcd.json", + "sha256": "823be07fcc03413e5043531cb9b20298526b26d85c6a369b9c94a0eb587ac3b7" + }, + { + "path": "cases/codegen/upstream-codegen-197-026402bf2e.json", + "sha256": "70245b699427c73b1890e9538063b1dda5050a585ce3d0c9ef80b135a9fd0ff0" + }, + { + "path": "cases/codegen/upstream-codegen-198-a9ea7ba9c3.json", + "sha256": "9061afa40facfc4f7d50c659224dcf90f02a7ef24624b89d602eb76352399c99" + }, + { + "path": "cases/codegen/upstream-codegen-199-829a5c949d.json", + "sha256": "0689cb5c9c240585cdfbad236147f336951eba3cf0d24bd59f3e98a7798e82f7" + }, + { + "path": "cases/codegen/upstream-codegen-200-3313d92719.json", + "sha256": "a3c7903a58734f1f47bbb350e39f1a1dd4ab62596327fc9e2492639ef481cb96" + }, + { + "path": "cases/codegen/upstream-codegen-201-8207a4008e.json", + "sha256": "c18ce83f1c9ecc67d241115b3f4591bfaa55cb35b79a44cc62a0c63e6013e809" + }, + { + "path": "cases/codegen/upstream-codegen-202-2786eda075.json", + "sha256": "cc0cfd368050c6a7d622c0549c523cd9f26fc00ed271e4cc4d1b6526b1ac3857" + }, + { + "path": "cases/codegen/upstream-codegen-203-8af03217a3.json", + "sha256": "a60837271b079222211fec5271e1da3b241d9d8c762c595306bb561bfb274da1" + }, + { + "path": "cases/codegen/upstream-codegen-204-2b2967c8c4.json", + "sha256": "d47a8b8a9b5557de7987d67345aff17a415f8fb5111dad5fd4e71a2794468e2a" + }, + { + "path": "cases/codegen/upstream-codegen-205-cc3ea5202a.json", + "sha256": "cb49056db92dfc66f5be453f86785b119bf4c34217509a385d899482ac6e01bd" + }, + { + "path": "cases/codegen/upstream-codegen-206-b5c5dc97eb.json", + "sha256": "61b2055af3904d6aa68f053e1f78b3487f1ab8c992959334f09732b2bd24f838" + }, + { + "path": "cases/codegen/upstream-codegen-207-b0e134acf4.json", + "sha256": "7d27a388ad8542a62d1666d6a756f09b74b1c672a544f554faebd1729577be5b" + }, + { + "path": "cases/codegen/upstream-codegen-208-1a343e45db.json", + "sha256": "dbdbf3ac3cf37420c70d276b091dc7556b90b011bee23ffc705a19ba4f7cb15d" + }, + { + "path": "cases/codegen/upstream-codegen-209-0514b0990f.json", + "sha256": "b88bcbba0702b760f5ac5dfa3d97e31eec96e74ed473cf861a3fe4347836041b" + }, + { + "path": "cases/codegen/upstream-codegen-210-1b24060767.json", + "sha256": "2a5bb42c3a3d68aac4077edd4e387e13a15e6a3ad8226237bbb52c53a85e9a8d" + }, + { + "path": "cases/codegen/upstream-codegen-211-2e15c55701.json", + "sha256": "2b60d0cde6c7b6a39ffbca671807f2b893bc7ef39447799d628e7335e4316e71" + }, + { + "path": "cases/codegen/upstream-codegen-212-2a8f7b4a99.json", + "sha256": "6537ac34185fab21618d11fd24f24f49f7b93b64dbf79e44d0b646dfc61bd25f" + }, + { + "path": "cases/codegen/upstream-codegen-213-aa53408d2f.json", + "sha256": "20e6596e8609b553bb4212de1107c37f7d532f948c5fdb6ba6af712934af85e9" + }, + { + "path": "cases/codegen/upstream-codegen-214-6dc49544c0.json", + "sha256": "f629a0ab803f11c1e4ed712763cc9273b04d0822bbb6c1437fa09e9d1eda8ec2" + }, + { + "path": "cases/codegen/upstream-codegen-215-39e86f8f53.json", + "sha256": "930ec41cc1fd1b257fcf5abc148b478ff4de300bd1e50067ecfd398db6513413" + }, + { + "path": "cases/codegen/upstream-codegen-216-465422d47b.json", + "sha256": "145fb22e930712a8f49b10fd30eb249e290186f5e0f05e5146646896c1402c75" + }, + { + "path": "cases/codegen/upstream-codegen-217-2d887b2a8b.json", + "sha256": "6fb688a17b3e510e0474c74c8e84971f2e94050ec35abefb5bf7c18dc74e54a7" + }, + { + "path": "cases/codegen/upstream-codegen-218-587666c709.json", + "sha256": "7153c963ffa9c281f15d837bc59dc8b68d0b62b2855957440919c59bd6cbf0a2" + }, + { + "path": "cases/codegen/upstream-codegen-219-c6446b7b2e.json", + "sha256": "db76f4e1473f732450266a8dfc69515935d7113814096160efc41b26dee3c1a8" + }, + { + "path": "cases/codegen/upstream-codegen-220-5980153f26.json", + "sha256": "f9a9da2b9a0d1cc77c0fb2a3de3075e4d677fbb6553d29f6d9c872f804e2a38a" + }, + { + "path": "cases/codegen/upstream-codegen-221-d003bdb336.json", + "sha256": "436247f61613b96657b3636d738e9235f756677b27c0674f757b253e509e3e3a" + }, + { + "path": "cases/codegen/upstream-codegen-222-f2d780c847.json", + "sha256": "ca5fad300dd16beb879af468ded1ce670c7843d707cafc82b6ebb172c3665f46" + }, + { + "path": "cases/codegen/upstream-codegen-223-4dc8092992.json", + "sha256": "a1a879ab4455c49a8ce864f1f15925f95bd979ebd3b3775b8b4d916663c4c73f" + }, + { + "path": "cases/codegen/upstream-codegen-224-075a41e65c.json", + "sha256": "aa4030cb17fb7b65ad25b3ef2a8bcf47f3ea4316a49949f1dd73d5edfe14ba26" + }, + { + "path": "cases/codegen/upstream-codegen-225-00fb8a129e.json", + "sha256": "7e56bed86b0eafa0bf18930e3d911f61da50622de9acc8167cb07b771c94bddf" + }, + { + "path": "cases/codegen/upstream-codegen-226-b2c28bcc8f.json", + "sha256": "c73e3f0b6db458037378bb7670aed69481573c53b90b87c3ffbf7ea26c1c457e" + }, + { + "path": "cases/codegen/upstream-codegen-227-bebc4e7262.json", + "sha256": "0d246a500161d36a53ca13d9e26dfa83435f94ba85802bd54e11702286fe5e58" + }, + { + "path": "cases/codegen/upstream-codegen-228-221bd0c553.json", + "sha256": "0e956682cf438b9372c5f30b7e0f866682a4dedea4edb50347a54c1f47fa9397" + }, + { + "path": "cases/codegen/upstream-codegen-229-9f57002cd6.json", + "sha256": "cd9a44b1e9976b5e67a3a042f607c5a0e985338eac4e363c0b2a269b5b8b13ca" + }, + { + "path": "cases/codegen/upstream-codegen-230-2af59fd9fa.json", + "sha256": "3913db89b1ed13528a9b9e5d56bfc4dba8ce09f2d6bb03ba57cfff3a80da58e4" + }, + { + "path": "cases/codegen/upstream-codegen-231-117d816fb9.json", + "sha256": "eae4aa07bb606894426692d499eed58e9690fba7d36b8a8c011899d20467d867" + }, + { + "path": "cases/codegen/upstream-codegen-232-8e875ce9e3.json", + "sha256": "582e1d50ea34b4c8218a77e4bcf79f4a468ebbd585361ee6a8ced22e31a747e4" + }, + { + "path": "cases/codegen/upstream-codegen-233-0a60be5fbc.json", + "sha256": "8ab9ad53acd1e02f43e8837935114c44a365d2afc546de902d19a5c3d42d1e13" + }, + { + "path": "cases/codegen/upstream-codegen-234-01ad9a0db0.json", + "sha256": "17aeae8bb90bcd18e92a5b7a6a5561df04d2be8a91887a79bebad4b57a6c86dc" + }, + { + "path": "cases/codegen/upstream-codegen-235-8a3992468b.json", + "sha256": "d6d40d5da70619051a41f2510b5d617d4ce5e6c40ebd3c52ecd00de5d77cc57e" + }, + { + "path": "cases/codegen/upstream-codegen-236-621c6d6a9e.json", + "sha256": "932b19a11263dbf4cc6549f3fde7ea8838f3e8921536705e26d091077165c7c4" + }, + { + "path": "cases/codegen/upstream-codegen-237-01ee478666.json", + "sha256": "5469c4d762948f25df6e5c65883fd8c63bf71344c25d98823313095be1bc05b5" + }, + { + "path": "cases/codegen/upstream-codegen-238-1a8cf8c870.json", + "sha256": "f959da1dcc45e7f55dd033c93a07915554856a5ce803dfcecdbb3843c1d9121f" + }, + { + "path": "cases/codegen/upstream-codegen-239-a6dada3682.json", + "sha256": "310ae0e44b475aea39a949ebef4fb40fc2ec1f52137ae5ef4c33abee64aeda5f" + }, + { + "path": "cases/codegen/upstream-codegen-240-77d56a1585.json", + "sha256": "3b5e5376207df9eb7b313f610420afd94c245fa0f76c60e8b77e1b19c0743e30" + }, + { + "path": "cases/codegen/upstream-codegen-241-e171ef72ce.json", + "sha256": "ddb95f8c058e6c8f5dfd06f493532d8ed8d3f7a27138f9530ea583d9b17a3614" + }, + { + "path": "cases/codegen/upstream-codegen-242-5c198a8490.json", + "sha256": "72fe0e9d2d4d957111648d1b73ce7b6baf27c2381bb3d7f95347c519aab8a65f" + }, + { + "path": "cases/codegen/upstream-codegen-243-14366a47ff.json", + "sha256": "31139d7e59fb14c21b55c4a857558007a8553d5c018f1ed8e90cb43974ffa2b0" + }, + { + "path": "cases/codegen/upstream-codegen-244-4ccea91f13.json", + "sha256": "8d2502e26a204b611e8225e660008f623184687e95718375d0abfcb77d9b7d2e" + }, + { + "path": "cases/codegen/upstream-codegen-245-537356bcf4.json", + "sha256": "2d6f79391f04a503c41cb499199ef07e639938e6733d55b56e9386bb61424baf" + }, + { + "path": "cases/codegen/upstream-codegen-246-295f39e09b.json", + "sha256": "0f8f80999bbb2377240e3f6949e6b64182d392927fb321f9f3440f26566ac74f" + }, + { + "path": "cases/codegen/upstream-codegen-247-39d6959685.json", + "sha256": "93b1f1fb2b6cb0844634294493535c1db64efcef3e765724d1aa80f53cf629e0" + }, + { + "path": "cases/codegen/upstream-codegen-248-d1bc18e068.json", + "sha256": "641bedc4867c1340401dc58d90ec27862b46e4d4f5d3e8c1001d76b96ef80403" + }, + { + "path": "cases/codegen/upstream-codegen-249-6b8a42981d.json", + "sha256": "b02ce09d4fac2a9fcaeda311a9d9f796844686e5c216c83a5704a77cb58d9fb0" + }, + { + "path": "cases/codegen/upstream-codegen-250-935ccdb80f.json", + "sha256": "7e942646aabf55c9c86bfeef4a30e2e3308b6573856d82c4634710c5b14dc85e" + }, + { + "path": "cases/codegen/upstream-codegen-251-50acddfb96.json", + "sha256": "4c0868815b332fd7a54a705c48ffe9133c445f23086b1d02e5c66b80dc022a9b" + }, + { + "path": "cases/codegen/upstream-codegen-252-49e979239e.json", + "sha256": "8dcb36f8c569afee0915ccd4d6f08357791c73e2967df6f6b3d177175404c9fa" + }, + { + "path": "cases/codegen/upstream-codegen-253-347a2e5fb2.json", + "sha256": "2b5007f14aa1cc88cbc62b951b63034d162925f74c87876f1f4c48745ea11273" + }, + { + "path": "cases/codegen/upstream-codegen-254-9f340b6a10.json", + "sha256": "97c8b1ca626458d34f841922e5e2ee74296b63fa67a283ee4e9b91be77c55e5a" + }, + { + "path": "cases/codegen/upstream-codegen-255-d01d8c7de6.json", + "sha256": "3cfa1d8871d93797d46d41d5a14c3e274fac81d3b5e76f30d7d72576c74ae8f6" + }, + { + "path": "cases/codegen/upstream-codegen-256-baf32cc08e.json", + "sha256": "9891213526cab813af8ff74e819a73b4aa05b52695b491b3d325a6f113657faa" + }, + { + "path": "cases/codegen/upstream-root-257-f23261dd4f.json", + "sha256": "d923ca588d8be7e4f3d36ae1f7e43773048c481b3c0225de736b6b06b8a8641a" + }, + { + "path": "cases/codegen/upstream-root-258-5cfe8baba5.json", + "sha256": "4709cd2fd32f7a96a350a85b4768409072ed81cd780711eae1e63d6b360e7a22" + }, + { + "path": "cases/codegen/upstream-root-259-0ae0aa9528.json", + "sha256": "2ca9571ba800e3967cb1b09fe1de9fbb422f8d03a7bd6412aa99d34fbe3b2993" + }, + { + "path": "cases/codegen/upstream-root-260-2dfc3ae054.json", + "sha256": "fd0e85e3835c2c10f3beb49a5f290ca251ae0b8132aa283e5064032ce0ec6e63" + }, + { + "path": "cases/responsive/upstream-responsive-266-4cd888ffd0.json", + "sha256": "29d9a5ad30cb32e612962e77eb5264b74ee53a377657fef0f87c0651a6747163" + }, + { + "path": "cases/responsive/upstream-responsive-267-88b21cad2a.json", + "sha256": "7a9c09c7e13aec2168ca66c665bb228a8892cb541d18f1410fba75fb92534f43" + }, + { + "path": "cases/responsive/upstream-responsive-268-7dd1d5c323.json", + "sha256": "6dced55e43301607c0d9f271b9a28cd079ed5aad5e9eeee54392bd99ed96d721" + }, + { + "path": "cases/responsive/upstream-viewport-261-928195cb2b.json", + "sha256": "6bced002795c43a08cf9c05fffe2ac12ec7245cb6d70ba7315297402e51325a4" + }, + { + "path": "cases/responsive/upstream-viewport-262-0f19b3123e.json", + "sha256": "cc51fee200b9694b97eda84c5224f20160d17b9715eb2f271ae560580629005c" + }, + { + "path": "cases/snapshot/upstream-render-263-d2763f9b9f.json", + "sha256": "08ea3042b9bab004e8ac530f0ecbc7c992aa69a2ec563e2dfa17bfbd8996c1cc" + }, + { + "path": "cases/snapshot/upstream-render-264-51e29ada52.json", + "sha256": "443a1014343f4fbc1dfea9cf4f31a660ba755e73ac86d0fef86b8c00bc86728b" + }, + { + "path": "cases/snapshot/upstream-render-265-94e906e79b.json", + "sha256": "f71072a5cfae0b987bc69143ba828dc87d6a64e7c4a1e06aa567488be5bb5272" + }, { "path": "snapshots/codegen/live-shape-smoke.snap", "sha256": "e02a4e2bec9f689a134befb2cb19ddb896fbc90ac0cab8227a91f1584ffbdc81" + }, + { + "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": "9344d749daa59e28c5ec3d557420043d66c405740c282f313d7ed2e6a5fc591e" + }, + { + "path": "snapshots/codegen/upstream-codegen-162-51e1254b4c.snap", + "sha256": "cbaa483f29bfba57bbe160adca5cfe2300b5f710cd3cc6bff01c9bab42153930" + }, + { + "path": "snapshots/codegen/upstream-codegen-163-2a9f9a056a.snap", + "sha256": "c681f325e8fd046d1f443c9e645b08c94df5ef32371941e7044bdcd80bef6462" + }, + { + "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": "5ec32156a94e063c3e21aeb5ddb10a75e45e6ae0baeb44ee0d693bf1e2de86bb" + }, + { + "path": "snapshots/codegen/upstream-codegen-169-796132e0cf.snap", + "sha256": "8294b74a53b34eaf768e8b1931fba1d42864fa471ae1e50b07102a0f93c02f2f" + }, + { + "path": "snapshots/codegen/upstream-codegen-170-eab2ed7d4c.snap", + "sha256": "fb780eb09e4d000f919f19aa234ea3f0df27ee4ec9ff967fd60ad668ac71ca76" + }, + { + "path": "snapshots/codegen/upstream-codegen-171-7e33e2b6a9.snap", + "sha256": "052ffd43f73206feac030cda9a03e75d48893e1061c215e22d58503ea10edf5e" + }, + { + "path": "snapshots/codegen/upstream-codegen-172-99028c85ce.snap", + "sha256": "d0beeabf019f8f93ec833b1f85ca0414bb5d766d43550ecd881dd447cebbe9a1" + }, + { + "path": "snapshots/codegen/upstream-codegen-173-64dbd7a102.snap", + "sha256": "cef2b9439cae9539b51f3140bed30fb952448d0710f7709a726d5d3dee51d798" + }, + { + "path": "snapshots/codegen/upstream-codegen-174-68dd47d3f8.snap", + "sha256": "ed040ba6aa0998924899e17d4f0f8dca2cc61f779a08832cf2a1b947b1cfc7ba" + }, + { + "path": "snapshots/codegen/upstream-codegen-175-ec3fd45731.snap", + "sha256": "8341ac2f8ee80ca082fac5c8096968f9ce5195e8b1bfdc52c04fbca3b103322b" + }, + { + "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": "00a331115ecce1eb755415d993095d69f65cf09c0371272b27260190be405303" + }, + { + "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..4368030 --- /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 AutoLayout&Box() { + 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..4a602f5 --- /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 AutoLayout&Box() { + 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..5125564 --- /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 AutoLayout&Box() { + 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..04f943a --- /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 Outline,Border() { + 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..5aa978c --- /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 Outline,Border() { + 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..96d4099 --- /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 Outline,Border() { + 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..d3888a5 --- /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 Outline,Border() { + 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..3b656d0 --- /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 Outline,Border() { + 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..eb8d5b9 --- /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 Outline,Border() { + 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..586063c --- /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 Outline,Border() { + 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..1668868 --- /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 Outline,Border() { + 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..7d30011 --- /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주년을 맞게 되었습니다.

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

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