diff --git a/.changepacks/changepack_log_eRTXLDvy0yMJ3YwboDGWu.json b/.changepacks/changepack_log_eRTXLDvy0yMJ3YwboDGWu.json new file mode 100644 index 00000000..1531f126 --- /dev/null +++ b/.changepacks/changepack_log_eRTXLDvy0yMJ3YwboDGWu.json @@ -0,0 +1,7 @@ +{ + "changes": { + "Cargo.toml": "Patch" + }, + "note": "componentTsx: fix button set panic, expose component text as unique props even when declared names normalize alike, drop set-canvas placement, emit undefined for absent variant values, preserve scalar typography and image sources across responsive variants including one-sided sources with explicit responsive visibility, prevent leaf variant image sources from leaking onto containers, declare referenced boolean props, emit valid interaction selectors, fix defect G by resolving variant values with original Figma property keys to preserve icon sources and state styles and keeping boolean-controlled hidden layers out of flattened assets, and account explicitly for unrepresented variant children without claiming emitted property provenance", + "date": "2026-10-24T00:21:08.585604600Z" +} diff --git a/.changepacks/changepack_log_jojyOPeLAlr8D8DSurB-c.json b/.changepacks/changepack_log_jojyOPeLAlr8D8DSurB-c.json new file mode 100644 index 00000000..52e8b4f8 --- /dev/null +++ b/.changepacks/changepack_log_jojyOPeLAlr8D8DSurB-c.json @@ -0,0 +1,7 @@ +{ + "changes": { + "Cargo.toml": "Patch" + }, + "note": "screen plan follows the final design page: state-variant frames fold into their route, remap moves routes to a newer frame; runtime audit treats overflow:auto scrollers as reachable when headless Chromium hides scrollbars", + "date": "2026-10-22T08:15:22.677086Z" +} \ No newline at end of file diff --git a/.changepacks/changepack_log_vh0-IGr9a1CbP3nVaXSf2.json b/.changepacks/changepack_log_vh0-IGr9a1CbP3nVaXSf2.json new file mode 100644 index 00000000..942808ae --- /dev/null +++ b/.changepacks/changepack_log_vh0-IGr9a1CbP3nVaXSf2.json @@ -0,0 +1,7 @@ +{ + "changes": { + "Cargo.toml": "Patch" + }, + "note": "feedback batch 2-66: componentTsx exports component sets/variants/instances, data-figma-node-id opt-in (figmaNodeIds), search lists by type across pages, bridge referencePng frameIds, project-plan never drops on-disk columns and recovers existing plans, screen-plan condensed proposals and monorepo auditPlan lookup, runtime-audit emits all runner modules and isolates probe errors, figma-bridge-setup skill and component-first workflow", + "date": "2026-10-23T17:54:27.176404300Z" +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0ddde4cc..86aa2848 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -764,6 +764,7 @@ dependencies = [ "syn 2.0.119", "tokio", "tokio-tungstenite", + "toml_edit", "tracing-subscriber", "url", ] diff --git a/README.md b/README.md index 8733c2a7..c6caf0ed 100644 --- a/README.md +++ b/README.md @@ -471,7 +471,7 @@ devup-mcp가 Figma에 붙는 경로는 **둘**이고, 대등하지 않습니다. **1. Figma 데스크톱 앱에서 불러옵니다** -Figma의 플러그인 등록은 데스크톱 앱의 메뉴 동작이라 스크립트로 대신할 수 없습니다. 이 세 단계만 직접 하시면 됩니다. +에이전트는 `devup_skills install`로 배포되는 `figma-bridge-setup` 스킬을 읽고 computer use로 아래 메뉴를 직접 조작합니다. 먼저 status에서 host/server commit·buildId를 비교하고, `inView:false`이면 Figma 창을 앞으로 가져와 해당 파일 탭을 누릅니다. Figma가 없으면 question 도구로 데스크톱 설치와 metered direct OAuth 중에서 묻습니다. 오래된 host는 PID·경로·소유 클라이언트를 확인한 뒤 그 연결만 재시작하며, 다른 세션을 중단하기 전에는 승인을 받습니다. 마지막에 status와 작은 노드 읽기로 연결을 확인합니다. 1. **Figma 데스크톱 앱**을 엽니다 (브라우저판은 로컬 플러그인을 못 불러옵니다) 2. 메뉴에서 **Plugins → Development → Import plugin from manifest...** @@ -1078,7 +1078,7 @@ snapshot에 없는 목적지(legacy 경로, 다중 루트 요청)는 조용히 규칙은 셋입니다: **모든 화면·섹션·에셋을 그려진 모든 폭에서 시각으로 검증한다**, **기다리느라 멈추지 않고 작업 순서를 바꾼다**, **완료 = 실패 0, 아니면 증거와 함께 unresolved로 남긴다**. - `devup_screen_plan` `action: "auditPlan"`(확정 뒤)은 확정된 URL마다 runtime audit 계획을 `.devup/runtime-audit//plan.json`에 쓰고 실행기를 `.devup/runtime-audit/runner/`에 한 번 씁니다. `artifacts`에 그 계획 프레임들의 `devup_figma_export` artifactId를 모두 넘깁니다. 폭은 그려진 폭(뷰포트 높이 = 프레임 높이) + 1440/1100/858/390입니다. 모든 폭에서 page health(페이지 오류·콘솔 오류·"This page couldn't load"/"Application error" 텍스트 없음), 가로 넘침, 잘린 텍스트, 내비 잘림을 보고, 그려진 폭에서는 페이지 전체를 referencePng와, 프레임의 최상위 자식(섹션)과 에셋을 각자의 native-node 렌더와 비교하고, 섹션·카드·에셋의 크기와 **위치**(`bounds` 검사; 카드 순서가 틀리면 실패)를 봅니다. 링크·버튼 전체의 hover/focus와 다음 URL로의 view-transition 검사도 들어가며, view-transition은 코드가 맨 뒤로 보내고 실행기가 끝나면 원래 URL로 돌아옵니다. 빠진 referencePng·렌더·프레임은 `missingReferences`에 만드는 export 호출과 함께 나옵니다 — 조용히 건너뛰지 않습니다. -- 섹션·카드·에셋은 `data-figma-node-id`로 찾습니다. `projectRoot`가 있는 export는 페이지 루트, 섹션, 그 자식, 에셋에 이 속성을 씁니다(projectRoot 없는 export는 플러그인과 같은 출력 그대로). 끄려면 설정 `figmaNodeIds: false`, 프로덕션에서 빼려면 Next의 `compiler.reactRemoveProperties: { properties: ["^data-figma-node-id$"] }`. +- Figma 노드 속성은 기본으로 끕니다. export 스키마가 지원할 때만 `figmaNodeIds: true`로 켜고, 속성이 없는 검사를 통과로 간주하지 않습니다. - `status`에 `auditPlanPath`·`auditReportPath`를 주면 모든 실패를 분류합니다: `runtime-error`, `overflow`, `layout-position`, `layout-size`, `asset-mismatch`(멀티컬러 SVG에 mask, 잘못된 파일, crop/objectFit 순으로 원인 제시), `section-visual`, `page-visual`, `interaction`, `view-transition` — 각각 Figma 노드, 코드 파일, 구체적인 수정 힌트를 담습니다. 반환된 `visualComparisons` 호출(`threshold`·`diffPath` 포함)을 돌리고 결과를 `visualResults`로 넘깁니다. 안티앨리어싱은 실패가 아닙니다: 바뀐 픽셀 비율 허용치가 페이지·섹션 3%, 에셋 5%이고, 설정 `visualThresholds`(`page`, `section`, `asset`, 노드별 `nodes`)로 조정합니다. - 같은 finding은 새 실행마다 한 번만 시도로 셉니다. `maxFixAttempts`(설정, 기본 3)번 고치고도 실패하면 스크린샷·diff 경로와 함께 `unresolved`로 기록하고 작업 큐에서 뺍니다. `workQueue`는 URL마다 build → audit → fix → compare 순이고 막힌 일은 뒤로 갑니다. - 확정 뒤 생긴 결정은 `action: "defer"`(`decision: {id, about, question, options, recommended, destructive}`)로 남기고 계속 일합니다. 마지막에 `assume`(`about`: 결정 id)으로 추천안을 택하고, 파괴적인 결정은 만들지 않은 채 보고서에 남습니다. 실행기를 설치할 수 없으면 `toolingUnavailable`로 그 URL의 audit를 inconclusive로 두고 계속합니다. @@ -1097,7 +1097,7 @@ Figma 프레임은 정적으로 변환되므로, 그려진 폭에서 크기·위 동적 라우트(`[slug]`, `[id]`, catch-all)는 `notAudited`로 넘기지 않고 실제 URL로 검사합니다: 라우트의 `generateStaticParams`(리터럴, 또는 읽는 로컬 데이터 파일) → 이미 검사한 페이지의 `a[href]`(실행기가 페이지마다 모으고 다음 `auditPlan`이 사용) → 매핑된 Figma 상세 프레임의 제목으로 만든 샘플(가정으로 기록) 순서이며, 10개 이하면 전부 검사합니다. 셋 다 없을 때만 이유와 함께 `notAudited`입니다. -`data-figma-node-id(s)`는 프로덕션에 남지 않습니다. vinext와 devup-ui Vite 플러그인에는 속성을 지우는 옵션이 없어서, `auditPlan`이 각 앱의 vite.config 옆에 작은 Vite 플러그인(`vite-plugin-strip-figma-node-ids.mjs`)을 둡니다. `enforce: 'pre'`, `apply`가 `vite build`일 때만이며 `DEVUP_AUDIT=1`이면 남깁니다. Rolldown은 transform 훅 뒤에 TSX/JSX를 변환하므로 이 단계에서는 속성이 그대로 JSX 텍스트입니다. `plugins: [stripFigmaNodeIds(), vinext()]`로 연결하고, audit는 dev 서버나 `DEVUP_AUDIT=1 bun run build`로 돌리며, 제출 체크리스트는 빌드 출력에서 `grep -rl data-figma-node-id dist`가 아무것도 찾지 않아야 통과합니다. `next` CLI에서는 `compiler.reactRemoveProperties`를 씁니다. +DevupUI가 audit 속성을 기본으로 제거하며 `DEVUP_AUDIT=1`이면 유지합니다. audit를 위해 앱의 빌드 설정을 바꾸거나 별도 strip 플러그인을 등록하지 않습니다. 일반 프로덕션 빌드 산출물에 `data-figma-node-id(s)`가 없는지 확인합니다. 이전 서버가 별도 플러그인 파일을 반환해도 앱 설정에 연결하지 않습니다. 최신 스택이 기본입니다: Next App Router를 vinext(Vite)로 실행하고, bun workspaces(`apps/*`), devup-ui, oxlint(eslint-plugin-devup), 최신 버전. `vinext` 의존성·`vinext` 스크립트·vinext를 import하는 `vite.config`가 있으면 `next` 의존성이 없어도 App Router 앱으로 보고, `devup_project_context`의 ui/routes가 앱별 `frameworks`를 알려 줍니다. 구현 전에는 묻지 않고 저장소 루트에서 `bunx @dependency-check-updates/cli -d -u --rm`(-d: 루트 아래 모든 manifest, -u: 복구 가능한 일괄 적용, --rm: 각 manifest 옆의 lockfile·설치 디렉터리 삭제 — Cargo.lock·target/ 포함) → `bun install` → build·lint·typecheck를 하고, 라이브러리 API는 기억이 아니라 현재 문서를 봅니다. 결과는 `assume`의 `dependencyUpdate`로 남기고 `status`에 dependencies 줄로 나옵니다. 앱이 없으면 `dev-five-git/service-template`에서 시작하고(이름·구성만 질문), `next` CLI 프로젝트에는 "Migrate to vinext (Recommended) / Keep next"를 한 번 묻습니다. 설정 파일의 `framework`·`updateDependencies: false`로 미리 답할 수 있습니다. diff --git a/crates/devup-mcp-devup-ui/src/codegen/component/component_generation.rs b/crates/devup-mcp-devup-ui/src/codegen/component/component_generation.rs index c15adac0..dc35dc5a 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/component/component_generation.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/component/component_generation.rs @@ -173,6 +173,17 @@ pub fn generate_component( root_id: &str, options: &CodegenOptions, ) -> Result { + if let Some(root) = snapshot.nodes.get(root_id) + && root.node_type == "COMPONENT_SET" + { + return match variant::generate_variant_component_set(snapshot, root_id, options, true)? { + Some(mut output) => { + output.tsx.insert_str(0, &format!("import {{ {} }} from \"@devup-ui/react\";\n\n", output.imports.join(", "))); + finalize_codegen_output(output, snapshot, options, root_id) + }, + None => generate_component_set_target(snapshot, root_id, root.typed_view().name().unwrap_or("Component"), options), + }; + } let generated = generate_node_marked(snapshot, root_id, options)?; let root = snapshot.nodes.get(root_id).ok_or_else(|| { DevupError::new( @@ -324,7 +335,7 @@ pub fn generate_component_set_target( let root_view = component_set.unwrap_or(root).typed_view(); let main = component_set.is_some(); if let Some(set) = component_set - && let Some(output) = variant::generate_variant_component_set(snapshot, &set.id, options)? + && let Some(output) = variant::generate_variant_component_set(snapshot, &set.id, options, false)? { return finalize_codegen_output(output, snapshot, options, &set.id); } @@ -919,4 +930,4 @@ fn js_value(value: &serde_json::Value, depth: usize) -> String { fn json_string(value: &str) -> String { serde_json::to_string(value).expect("string JSON serialization") -} \ No newline at end of file +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/component/component_variants.rs b/crates/devup-mcp-devup-ui/src/codegen/component/component_variants.rs index ed506132..126ea2d5 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/component/component_variants.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/component/component_variants.rs @@ -269,6 +269,19 @@ fn finalize_codegen_output( .extend(unresolved_token_bindings(snapshot, root_id, options)); output.projection_trace = build_projection_trace(snapshot, root_id, &output.tsx, &output.source_map); + for diagnostic in &output.diagnostics { + if diagnostic.code == "DEVUP_CODEGEN_VARIANT_CHILD_FALLBACK" + && let Some(node_id) = &diagnostic.node_id + && !output.projection_trace.entries.iter().any(|entry| &entry.node_id == node_id) + { + output.projection_trace.entries.push(crate::provenance::ProjectionTraceEntry { + node_id: node_id.clone(), + disposition: crate::provenance::ProjectionDisposition::Ignored, + reason: "unrepresented-variant-child".into(), + generated_range: None, + }); + } + } output.fidelity_report = validate_fidelity(snapshot, root_id, &output)?; output .diagnostics @@ -555,4 +568,4 @@ pub(super) enum PropValue { String(String), } -pub(super) type Prop = (String, PropValue); \ No newline at end of file +pub(super) type Prop = (String, PropValue); diff --git a/crates/devup-mcp-devup-ui/src/codegen/component/render_node.rs b/crates/devup-mcp-devup-ui/src/codegen/component/render_node.rs index b33c7146..3cbc7485 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/component/render_node.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/component/render_node.rs @@ -69,7 +69,18 @@ fn render_node( .and_then(|references| references.get("visible")) .and_then(serde_json::Value::as_str) .map(component_property_name); - let component = snapshot + let master = view.string("mainComponentId") + .or_else(|| view.string("componentId")) + .and_then(|id| snapshot.nodes.get(id)); + let set = view.string("mainComponentSetId") + .or_else(|| master.and_then(|node| node.typed_view().string("parentId"))) + .and_then(|id| snapshot.nodes.get(id)) + .filter(|node| node.node_type == "COMPONENT_SET"); + let component = set + .and_then(|node| node.typed_view().name()) + .map(normalize_component_name) + .or_else(|| master.and_then(|node| node.typed_view().name()).map(normalize_component_name)) + .unwrap_or_else(|| snapshot .nodes .values() .filter(|candidate| candidate.typed_view().node_type() == "COMPONENT") @@ -80,8 +91,19 @@ fn render_node( }) .max_by_key(|name| name.len()) .map(legacy_component_name) - .unwrap_or_else(|| legacy_component_name(view.name().unwrap_or("Component"))); - let content = main_property.unwrap_or_else(|| format!("<{component} />")); + .unwrap_or_else(|| legacy_component_name(view.name().unwrap_or("Component")))); + let mut properties = super::variant::instance_variant_props(&view); + for (name, value) in view.value("variantProperties").and_then(serde_json::Value::as_object).into_iter().flatten() { + if !["effect", "viewport"].iter().any(|reserved| name.eq_ignore_ascii_case(reserved)) + && let Some(value) = value.as_str() + { + properties.entry(super::variant::instance_property_name(name)).or_insert_with(|| value.to_owned()); + } + } + let attributes = properties.iter().map(|(name, value)| { + format!(" {name}={{{}}}", serde_json::to_string(value).unwrap()) + }).collect::(); + let content = main_property.unwrap_or_else(|| format!("<{component}{attributes} />")); let expression = if let Some(visible) = visible_property { format!("{{{visible} && {content}}}") } else if references.is_some_and(|references| references.contains_key("mainComponent")) { diff --git a/crates/devup-mcp-devup-ui/src/codegen/evidence.rs b/crates/devup-mcp-devup-ui/src/codegen/evidence.rs index 19fbe981..ee4561f4 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/evidence.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/evidence.rs @@ -525,6 +525,32 @@ pub(super) fn placement_evidence(snapshot: &Snapshot, node_id: &str) -> Value { original } +fn stable_diagnostic_colors(value: &mut Value) { + match value { + Value::Object(object) => { + if ["r", "g", "b"] + .iter() + .all(|key| object.get(*key).is_some_and(Value::is_number)) + { + for key in ["r", "g", "b", "a"] { + if let Some(channel) = object.get_mut(key) + && channel.as_number().is_some_and(serde_json::Number::is_f64) + && let Some(number) = channel.as_f64() + { + *channel = json!((number * 1e12).round() / 1e12); + } + } + } else { + for child in object.values_mut() { + stable_diagnostic_colors(child); + } + } + } + Value::Array(array) => array.iter_mut().for_each(stable_diagnostic_colors), + _ => {} + } +} + fn geometry(node: &devup_mcp_figma::RawNode) -> Value { let view = node.typed_view(); let mut value = json!({"nodeId":node.id,"nodeType":node.node_type}); @@ -567,6 +593,9 @@ fn geometry(node: &devup_mcp_figma::RawNode) -> Value { "fills", ] { value[field] = view.value(field).cloned().unwrap_or(Value::Null); + if matches!(field, "fills" | "effects") { + stable_diagnostic_colors(&mut value[field]); + } } let missing: Vec<_> = [ "x", @@ -597,3 +626,24 @@ pub(super) fn fallback_original(snapshot: &Snapshot, node_id: &str, property: &s .unwrap_or(Value::Null), } } + +#[cfg(test)] +mod diagnostic_color_tests { + use super::*; + + #[test] + fn geometry_color_diagnostics_ignore_last_bit_parse_differences() { + let diagnostic = |blue| { + let node = serde_json::from_value(json!({"id":"icon","type":"VECTOR","fields":{ + "width":24.000000000001,"fills":[{"type":"SOLID","color":{"r":1,"g":0,"b":blue}}] + }})) + .unwrap(); + geometry(&node) + }; + let first = diagnostic(0.9244915843009948); + let second = diagnostic(0.9244915843009949); + assert_eq!(first, second); + assert_eq!(first["fills"][0]["color"]["b"], json!(0.924491584301)); + assert_eq!(first["width"], json!(24.000000000001)); + } +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/image/project_tree.rs b/crates/devup-mcp-devup-ui/src/codegen/image/project_tree.rs index 9f5d4c9c..cd65ad44 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/image/project_tree.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/image/project_tree.rs @@ -27,6 +27,7 @@ pub(super) fn project_tree( drawn_when: Vec::new(), leading_comment: None, slots: Vec::new(), + scalar_sources: Vec::new(), }; let visible = node.typed_view().value("fills").and_then(Value::as_array); if tree.component == "Image" { diff --git a/crates/devup-mcp-devup-ui/src/codegen/layout/layout_properties.rs b/crates/devup-mcp-devup-ui/src/codegen/layout/layout_properties.rs index 4a15ceca..618116d6 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/layout/layout_properties.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/layout/layout_properties.rs @@ -104,7 +104,7 @@ pub(super) fn push_layout_props( let is_page_root = parent .map(|parent| parent.typed_view().node_type()) .or_else(|| view.string("parentType")) - .is_some_and(|kind| matches!(kind, "SECTION" | "PAGE" | "COMPONENT_SET")); + .is_some_and(|kind| matches!(kind, "SECTION" | "PAGE")); let fixed_w = view.string("layoutSizingHorizontal") == Some("FIXED"); let fixed_h = view.string("layoutSizingVertical") == Some("FIXED"); let fill_w = view.string("layoutSizingHorizontal") == Some("FILL"); @@ -227,8 +227,7 @@ pub(super) fn push_layout_props( (own_height, parent_height), (Some(height), Some(parent_height)) if parent_height > height ); - let in_a_group = - parent.is_some_and(|parent| parent.typed_view().node_type() == "GROUP"); + let in_a_group = parent.is_some_and(|parent| parent.node_type == "GROUP"); let leaf_shape = !has_children && !holds_children && !is_asset && in_a_group; if leaf_shape && parent_wider { width = own_width.map(px); @@ -965,4 +964,4 @@ fn child_shrinker(parent: &RawNode, dimension: &str) -> bool { pub(super) struct GridTemplate { pub css: Option, pub unverified: Vec<&'static str>, -} \ No newline at end of file +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/responsive.rs b/crates/devup-mcp-devup-ui/src/codegen/responsive.rs index 14e3f86b..97332bba 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/responsive.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/responsive.rs @@ -24,5 +24,6 @@ // Source sections share this module to preserve privacy and test names. include!("responsive/breakpoint_merge.rs"); +include!("responsive/width_label.rs"); include!("responsive/merge_content.rs"); include!("responsive/impl.rs"); diff --git a/crates/devup-mcp-devup-ui/src/codegen/responsive/breakpoint_merge.rs b/crates/devup-mcp-devup-ui/src/codegen/responsive/breakpoint_merge.rs index 555f0703..8d65cca8 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/responsive/breakpoint_merge.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/responsive/breakpoint_merge.rs @@ -281,7 +281,7 @@ pub fn is_breakpoint_name(name: &str) -> bool { /// Explicit width suffixes can describe one named screen. No fuzzy matching. pub fn family_name(name: &str) -> String { - let name = name.trim().to_ascii_lowercase(); + let name = strip_width_label(name.trim().to_ascii_lowercase()); if is_breakpoint_name(&name) { return "@breakpoint-labels".into(); } diff --git a/crates/devup-mcp-devup-ui/src/codegen/responsive/merge_content.rs b/crates/devup-mcp-devup-ui/src/codegen/responsive/merge_content.rs index 64c47c82..fbd0c47e 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/responsive/merge_content.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/responsive/merge_content.rs @@ -400,6 +400,30 @@ pub fn merge_breakpoints( options: &CodegenOptions, ) -> Result, DevupError> { let found = breakpoints(snapshot); + merge_discovered_breakpoints(snapshot, options, &found) +} + +pub fn merge_confirmed_breakpoints( + snapshot: &Snapshot, + options: &CodegenOptions, +) -> Result, DevupError> { + let widths = snapshot.roots.iter().filter_map(|id| { + Some(("confirmed", snapshot.nodes.get(id)?.typed_view().number("width")?)) + }).collect::>(); + if widths.len() != snapshot.roots.len() || !breakpoint_family_is_possible(&widths) { + return Ok(None); + } + let found = snapshot.roots.iter().enumerate().map(|(rank, id)| Breakpoint { + rank, node_id: id.clone(), + }).collect::>(); + merge_discovered_breakpoints(snapshot, options, &found) +} + +fn merge_discovered_breakpoints( + snapshot: &Snapshot, + options: &CodegenOptions, + found: &[Breakpoint], +) -> Result, DevupError> { if found.len() < 2 { return Ok(None); } @@ -801,4 +825,4 @@ struct WidthCheck<'a> { tags: &'a [String], attributes: &'a [GeneratedAttribute], by_element: &'a [Vec], -} \ No newline at end of file +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/responsive/width_label.rs b/crates/devup-mcp-devup-ui/src/codegen/responsive/width_label.rs new file mode 100644 index 00000000..0c6100e9 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/responsive/width_label.rs @@ -0,0 +1,19 @@ +/// Drops a trailing width label after a device word: `desktop 1440`, +/// `mobile (360px)`. Names without a device word keep their trailing number. +fn strip_width_label(name: String) -> String { + let trimmed = name.trim_end_matches([')', ' ']); + let trimmed = trimmed.strip_suffix("px").unwrap_or(trimmed); + let without_digits = trimmed.trim_end_matches(|c: char| c.is_ascii_digit()); + if without_digits.len() == trimmed.len() { + return name; + } + let base = without_digits.trim_end_matches([' ', '-', '/', '(', '_']); + if ["desktop", "tablet", "mobile"] + .iter() + .any(|device| base.ends_with(device)) + { + base.to_owned() + } else { + name + } +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/style/image_fill_source.rs b/crates/devup-mcp-devup-ui/src/codegen/style/image_fill_source.rs index 158b9014..a4511bb4 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/style/image_fill_source.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/style/image_fill_source.rs @@ -91,56 +91,121 @@ pub fn image_fill_path( }) } -/// The file name an asset node gets, without folder or extension. -/// -/// The layer name, unless another asset in the snapshot has the same name -/// and is a different thing. Three cards each hold an `Icons` instance at a -/// different variant - chart, clock, lightning - and all three were -/// `/icons/Icons.svg`, one file overwriting the next, and every card drew the -/// chart. An instance whose name is shared then carries its variant, `Icons=chart`; -/// a node that is not an instance carries its id. Instances of one variant -/// share a name and a file, as the same icon at three widths should. +/// The file name an asset node gets, without folder or extension: readable +/// kebab-case; distinct things sharing a name get -2, -3 in node-id order. pub(crate) fn asset_stem(snapshot: &Snapshot, node: &RawNode, per_node: bool) -> String { - let view = node.typed_view(); - let name = view.name().unwrap_or("Asset"); - let identity = asset_identity(node); - let raster_instance = - view.node_type() == "INSTANCE" && asset_kind(snapshot, node) == Some(AssetKind::Png); - let shared = per_node - || snapshot.nodes.values().any(|other| { - other.id != node.id - && other.typed_view().name() == Some(name) - && (asset_identity(other) != identity - || raster_instance - || (fills(node).is_some_and(|fs| fs.iter().any(|p| p["type"] == "IMAGE")) - && fills(other) != fills(node))) - && asset_kind(snapshot, other).is_some() - }); - if !shared { - return name.to_owned(); + let canonical = image_hash(node).and_then(|hash| { + snapshot.nodes.values().filter(|other| image_hash(other) == Some(hash)).min_by_key(|other| &other.id) + }).unwrap_or(node); + let base = readable_stem(snapshot, canonical); + let own = asset_group_key(snapshot, node, per_node); + let mut firsts = std::collections::BTreeMap::::new(); + for other in snapshot.nodes.values() { + let is_asset = asset_kind(snapshot, other).is_some() || image_hash(other).is_some(); + let same_image = image_hash(node).is_some_and(|hash| image_hash(other) == Some(hash)); + if other.id != node.id && (!is_asset || (!same_image && readable_stem(snapshot, other) != base)) { + continue; + } + let first = firsts + .entry(asset_group_key(snapshot, other, per_node)) + .or_insert(other.id.as_str()); + if other.id.as_str() < *first { + *first = other.id.as_str(); + } + } + let mut ids = firsts.values().copied().collect::>(); + ids.sort_unstable(); + let own_first = firsts.get(&own).copied().unwrap_or(node.id.as_str()); + match ids.iter().position(|id| *id == own_first) { + Some(index) if index > 0 => format!("{base}-{}", index + 1), + _ => base, } - match identity { - // Raster instances can override the image, crop, size and effects while - // retaining the same component variant. Only verified exported bytes - // establish reuse; a shared variant name cannot establish identity. - Some(variant) if raster_instance => { - format!("{name}={variant}-{}", node.id.replace([':', ';'], "-")) +} + +/// Lowercase `[a-z0-9-]` only, hyphens collapsed, at most 48 characters. +fn kebab_name(name: &str) -> String { + let mut slug = String::new(); + for c in name.chars() { + if c.is_ascii_alphanumeric() { + slug.push(c.to_ascii_lowercase()); + } else if !slug.is_empty() && !slug.ends_with('-') { + slug.push('-'); } - Some(variant) => format!("{name}={variant}"), - None => format!("{name}-{}", node.id.replace([':', ';'], "-")), } + slug.truncate(48); + slug.trim_end_matches('-').to_owned() } -/// What makes an instance the thing it is: its variant, as `chart` or -/// `lg,primary`. `None` for a node that is not an instance of a variant. -fn asset_identity(node: &RawNode) -> Option { - let view = node.typed_view(); - let properties = view.value("variantProperties")?.as_object()?; - let values = properties - .values() - .filter_map(Value::as_str) - .collect::>(); - (!values.is_empty()).then(|| values.join(",")) +fn generic_role(role: &str) -> bool { + let word = role.trim_end_matches(|c: char| c.is_ascii_digit() || c == '-'); + word.is_empty() + || matches!( + word, + "rectangle" | "image" | "frame" | "vector" | "group" | "ellipse" | "picture" | "layer" + ) +} + +/// The layer name as a role, prefixed by the nearest meaningful ancestor when +/// the layer name is generic, and by its variant when it is a variant instance. +fn readable_stem(snapshot: &Snapshot, node: &RawNode) -> String { + let role = kebab_name(&layer_name(node)); + if !generic_role(&role) { + return role; + } + let mut current = node.typed_view().string("parentId").map(str::to_owned); + let mut hops = 0; + while let Some(id) = current { + hops += 1; + let Some(parent) = snapshot.nodes.get(&id).filter(|_| hops <= 32) else { + break; + }; + let section = kebab_name(&layer_name(parent)); + if !generic_role(§ion) { + let word = if role.is_empty() { "image" } else { &role }; + return format!("{section}-{word}"); + } + current = parent.typed_view().string("parentId").map(str::to_owned); + } + if role.is_empty() { "asset".to_owned() } else { role } +} + +fn image_hash(node: &RawNode) -> Option<&str> { + fills(node)? + .iter() + .find(|p| p["type"] == "IMAGE" && p["visible"].as_bool() != Some(false))?["imageHash"] + .as_str() +} + +/// What makes two assets the same file: identical image bytes, else the same +/// variant; raster instances (which may override image/crop) and per-node +/// naming stay one file per node. +fn asset_group_key(snapshot: &Snapshot, node: &RawNode, per_node: bool) -> String { + if let Some(hash) = image_hash(node) { + return format!("hash:{hash}"); + } + let raster_instance = node.typed_view().node_type() == "INSTANCE" + && asset_kind(snapshot, node) == Some(AssetKind::Png); + if per_node || raster_instance { + return format!("node:{}", node.id); + } + if let Some(properties) = node.typed_view().value("variantProperties").and_then(Value::as_object) { + return format!("variant:{}", serde_json::to_string(properties).unwrap_or_default()); + } + "plain".to_owned() +} + +/// The layer name with HTML entities decoded: Figma text may arrive as +/// `R&D`, which must not leak `amp` into a file name. +fn layer_name(node: &RawNode) -> String { + node.typed_view() + .name() + .unwrap_or("Asset") + .replace("<", "<") + .replace(">", ">") + .replace(""", "\"") + .replace("'", "'") + .replace("&", "&") + .replace(['(', ')'], "") } pub(super) fn paint_css( @@ -196,9 +261,7 @@ pub(super) fn paint_css( "PATTERN" => { let source_id = paint.get("sourceNodeId").and_then(Value::as_str)?; let source = snapshot.nodes.get(source_id); - let name = source - .and_then(|node| node.typed_view().name()) - .unwrap_or("pattern"); + let name = source.map_or_else(|| "pattern".to_owned(), |node| asset_stem(snapshot, node, per_node)); // A raster belongs with the images and a vector with the icons, // which is the split every other asset reference follows. This one // sent a png to the icon folder. @@ -925,4 +988,4 @@ fn push_strokes( string_prop(props, "outlineOffset", px(-weight / 2.0)); } } -} \ No newline at end of file +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/style/style_properties.rs b/crates/devup-mcp-devup-ui/src/codegen/style/style_properties.rs index 832f8e1f..c5e61df2 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/style/style_properties.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/style/style_properties.rs @@ -1,8 +1,6 @@ use std::collections::{BTreeMap, BTreeSet}; - use devup_mcp_figma::{RawNode, Snapshot, TypedNode}; use serde_json::Value; - use super::{ component::{LengthToken, Prop, PropValue}, layout::{format_number, px, string_prop}, @@ -14,11 +12,9 @@ pub(crate) enum AssetKind { SvgMask, Png, } - pub(crate) fn asset_kind(snapshot: &Snapshot, node: &RawNode) -> Option { asset_kind_nested(snapshot, node, false) } - fn asset_kind_nested(snapshot: &Snapshot, node: &RawNode, nested: bool) -> Option { let view = node.typed_view(); if matches!(view.node_type(), "TEXT" | "COMPONENT_SET") @@ -87,7 +83,12 @@ fn asset_kind_nested(snapshot: &Snapshot, node: &RawNode, nested: bool) -> Optio let mut visible_children = Vec::new(); for child_id in child_ids { let child = snapshot.nodes.get(child_id)?; - if child.typed_view().bool("visible") != Some(false) { + if child.typed_view().bool("visible") != Some(false) + || child.typed_view().value("componentPropertyReferences") + .and_then(|references| references.get("visible")) + .and_then(Value::as_str) + .is_some() + { visible_children.push(child); } } diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant.rs b/crates/devup-mcp-devup-ui/src/codegen/variant.rs index d59663cf..9c3d26ea 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/variant.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/variant.rs @@ -1,3 +1,5 @@ // Source sections share this module to preserve privacy and test names. include!("variant/variant_projection.rs"); include!("variant/drawn_when.rs"); +include!("variant/text_properties.rs"); +include!("variant/scalar_properties.rs"); diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant/drawn_when.rs b/crates/devup-mcp-devup-ui/src/codegen/variant/drawn_when.rs index dcc95879..31f16558 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/variant/drawn_when.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/variant/drawn_when.rs @@ -104,6 +104,9 @@ fn merge_child_props( Some(&child_path), &child.props, ); + if child.component == "Image" { + child.scalar_sources = scalar_sources(records, definitions, dimensions, viewport, effect_value, &child_path); + } merge_child_props( child, records, @@ -126,8 +129,8 @@ fn changed_effect_props( ) -> BTreeMap { let effect_name = definitions .iter() - .find(|definition| definition.name.eq_ignore_ascii_case("effect")) - .map(|definition| definition.name.clone()); + .find(|definition| definition.name.eq_ignore_ascii_case("effect") && !dimensions.iter().any(|dimension| dimension.name == definition.name)) + .map(|definition| definition.source.clone()); let keys = records .iter() .filter(|record| { @@ -183,8 +186,8 @@ fn expression_for_prop( ) -> Option { let effect_name = definitions .iter() - .find(|definition| definition.name.eq_ignore_ascii_case("effect")) - .map(|definition| definition.name.as_str()); + .find(|definition| definition.name.eq_ignore_ascii_case("effect") && !dimensions.iter().any(|dimension| dimension.name == definition.name)) + .map(|definition| definition.source.as_str()); let dependencies = dimensions .iter() .filter(|dimension| !dimension.boolean) @@ -278,7 +281,7 @@ fn dimension_depends( let set = records .iter() .filter(|record| { - record.values.get(&dimension.name) == Some(option) + record.values.get(&dimension.source) == Some(option) && effect_name.is_none_or(|name| { record.values.get(name).map(String::as_str) == Some(effect_value) }) @@ -359,14 +362,14 @@ fn nested_expression( .iter() .filter(|definition| !definition.boolean) .map(|definition| { - let value = if Some(definition.name.as_str()) == effect_name { + let value = if Some(definition.source.as_str()) == effect_name { effect_value } else if let Some(value) = pinned.get(&definition.name) { value.as_str() } else { &definition.default }; - (definition.name.clone(), value.to_owned()) + (definition.source.clone(), value.to_owned()) }) .collect::>(); find_record(records, &filters).is_some() @@ -395,13 +398,13 @@ fn nested_expression( ), ) }) - .filter_map(|(option, value)| Some((option, value?))) + .map(|(option, value)| (option, value.unwrap_or(Expression::Undefined))) .collect::>() }; if rest.is_empty() { let values = branch(first, Vec::new()); - if values.is_empty() { + if values.iter().all(|(_, value)| matches!(value, Expression::Undefined)) { return None; } // Every option that was drawn saying the same thing is not a choice at @@ -426,12 +429,13 @@ fn nested_expression( } // One option carrying the only value reads better as the condition it // is than as a map with a single entry and a hole where the rest were. - if values.len() == 1 - && let Expression::Literal(value) = &values[0].1 + let present = values.iter().filter(|(_, value)| !matches!(value, Expression::Undefined)).collect::>(); + if present.len() == 1 + && let Expression::Literal(value) = &present[0].1 { return Some(Expression::Conditional( first.name.clone(), - values[0].0.clone(), + present[0].0.clone(), value.clone(), )); } @@ -482,7 +486,7 @@ fn viewport_expression( .iter() .filter(|definition| !definition.boolean) .map(|definition| { - let value = if Some(definition.name.as_str()) == effect_name { + let value = if Some(definition.source.as_str()) == effect_name { effect_value } else if definition.name.eq_ignore_ascii_case("viewport") { viewport_value.unwrap_or(&definition.default) @@ -491,7 +495,7 @@ fn viewport_expression( } else { &definition.default }; - (definition.name.clone(), value.to_owned()) + (definition.source.clone(), value.to_owned()) }) .collect::>(); find_record(records, &filters) @@ -577,11 +581,12 @@ fn render_component( tree: &Tree, selectors: &BTreeMap>, transition: Option<&(String, String)>, + text_properties: &BTreeMap, ) -> String { - let interface = if dimensions.is_empty() { + let interface = if dimensions.is_empty() && text_properties.is_empty() { String::new() } else { - let fields = dimensions + let mut fields = dimensions .iter() .map(|definition| { if definition.boolean { @@ -602,14 +607,21 @@ fn render_component( }) .collect::>() .join("\n"); + for name in text_properties.keys() { + if !fields.is_empty() { + fields.push('\n'); + } + fields.push_str(&format!(" {name}?: string")); + } format!("export interface {name}Props {{\n{fields}\n}}\n\n") }; - let signature = if dimensions.is_empty() { + let signature = if dimensions.is_empty() && text_properties.is_empty() { format!("export function {name}()") } else { let props = dimensions .iter() - .map(|definition| definition.name.as_str()) + .map(|definition| if definition.boolean { format!("{} = {}", definition.name, definition.default) } else { definition.name.clone() }) + .chain(text_properties.iter().map(|(name, default)| format!("{name} = {default}"))) .collect::>() .join(", "); format!("export function {name}({{ {props} }}: {name}Props)") @@ -624,6 +636,17 @@ fn render_tree( transition: Option<&(String, String)>, depth: usize, ) -> String { + if !tree.scalar_sources.is_empty() { + let rendered = tree.scalar_sources.iter().map(|(source, display)| { + let mut image = tree.clone(); + image.scalar_sources.clear(); + image.props.insert("src".into(), source.clone()); + image.props.insert("display".into(), display.clone()); + render_tree(&image, selectors, transition, depth) + }).collect::>().join("\n"); + let indent = " ".repeat(depth); + return format!("{indent}<>\n{rendered}\n{indent}"); + } let indent = " ".repeat(depth); let child_indent = " ".repeat(depth + 1); let mut rendered_props = Vec::new(); @@ -639,9 +662,14 @@ fn render_tree( }) .collect::>() .join(",\n"); - rendered_props.push(format!( - "{child_indent}{selector}={{{{\n{values}\n{child_indent}}}}}" - )); + if selector.starts_with('&') { + let selector = serde_json::to_string(selector).unwrap_or_default(); + rendered_props.push(format!("{child_indent}selectors={{{{ {selector}: {{\n{values}\n{child_indent}}} }}}}")); + } else { + rendered_props.push(format!( + "{child_indent}{selector}={{{{\n{values}\n{child_indent}}}}}" + )); + } } for (name, expression) in &tree.props { rendered_props.push(format!( @@ -733,10 +761,8 @@ fn needs_const(prop: &str) -> bool { fn render_expression_attr(prop: &str, expression: &Expression) -> String { match expression { + Expression::Undefined => "={undefined}".into(), Expression::Literal(value) => format!("=\"{value}\""), - Expression::Conditional(name, option, value) => { - format!("={{{name} === '{option}' && \"{value}\"}}") - } Expression::Variant(name, _) if needs_const(prop) => { let rendered = render_expression_value(expression, 0); let object = rendered @@ -772,23 +798,38 @@ fn indent_attribute_expression(expression: &str, depth: usize) -> String { fn render_expression_value(expression: &Expression, depth: usize) -> String { match expression { - Expression::Literal(value) => format!("\"{value}\""), - Expression::Responsive(slots) => format!( + Expression::Undefined => "undefined".into(), + Expression::Literal(value) => serde_json::to_string(value).unwrap_or_default(), + Expression::Responsive(slots) => { + let end = slots.iter().rposition(Option::is_some).map_or(0, |index| index + 1); + if end == 1 { + return serde_json::to_string(&slots[0]).unwrap_or_default(); + } + format!( "[{}]", - slots + slots[..end] .iter() .map(|slot| slot .as_ref() - .map_or("null".to_owned(), |value| format!("\"{value}\""))) + .map_or("null".to_owned(), |value| serde_json::to_string(value).unwrap_or_default())) .collect::>() .join(", ") - ), + ) + }, Expression::Variant(prop, values) => { let indent = " ".repeat(depth); let child_indent = " ".repeat(depth + 1); let lines = values .iter() .map(|(key, value)| { + let key = if key.chars().enumerate().all(|(index, character)| { + character.is_ascii_alphabetic() || character == '_' || character == '$' + || (index > 0 && character.is_ascii_digit()) + }) && !key.is_empty() { + key.clone() + } else { + serde_json::to_string(key).unwrap_or_default() + }; format!( "{child_indent}{key}: {}", render_expression_value(value, depth + 1) @@ -799,7 +840,9 @@ fn render_expression_value(expression: &Expression, depth: usize) -> String { format!("{{\n{lines}\n{indent}}}[{prop}]") } Expression::Conditional(prop, option, value) => { - format!("{prop} === '{option}' && \"{value}\"") + let option = serde_json::to_string(option).unwrap_or_default(); + let value = serde_json::to_string(value).unwrap_or_default(); + format!("{prop} === {option} ? {value} : undefined") } } } diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant/scalar_properties.rs b/crates/devup-mcp-devup-ui/src/codegen/variant/scalar_properties.rs new file mode 100644 index 00000000..dd046c1c --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/variant/scalar_properties.rs @@ -0,0 +1,103 @@ +fn bind_referenced_properties(tree: &mut Tree, dimensions: &mut Vec) { + if let Some(name) = &tree.visible_when + && !dimensions.iter().any(|definition| definition.name == *name) + { + dimensions.push(Definition { + name: name.clone(), + source: name.clone(), + default: "true".into(), + options: Vec::new(), + boolean: true, + }); + } + for child in &mut tree.children { + bind_referenced_properties(child, dimensions); + } +} + +fn scalar_sources( + records: &[Record], + definitions: &[Definition], + dimensions: &[Definition], + viewport: Option<&Definition>, + effect: &str, + path: &NodePath, +) -> Vec<(String, String)> { + if viewport.is_none() { return Vec::new(); } + let sources = records.iter().filter_map(|record| { + let tree = tree_at(&record.tree, path)?; + (tree.component == "Image").then(|| tree.props.get("src").cloned()).flatten() + }).collect::>(); + if sources.is_empty() { + return Vec::new(); + } + if sources.len() == 1 && expression_for_prop(records, definitions, dimensions, viewport, effect, None, path, "src").is_none_or(|expression| !has_responsive_value(&expression)) { + return Vec::new(); + } + sources.into_iter().filter_map(|source| { + let visibility = records.iter().cloned().map(|mut record| { + fn set(tree: &mut Tree, source: &str) { + if tree.component == "Image" { + let display = if tree.props.get("src").is_some_and(|value| value == source) { "inline" } else { "none" }; + tree.props.insert("src".into(), display.into()); + } + for child in &mut tree.children { set(child, source); } + } + set(&mut record.tree, &source); + record + }).collect::>(); + let mut display = expression_for_prop(&visibility, definitions, dimensions, viewport, effect, None, path, "src")?; + fill_absent_display(&mut display); + Some((render_expression_attr("src", &Expression::Literal(source)), render_expression_attr("display", &display))) + }).collect() +} + +fn has_responsive_value(expression: &Expression) -> bool { + match expression { + Expression::Responsive(_) => true, + Expression::Variant(_, values) => values.iter().any(|(_, value)| has_responsive_value(value)), + Expression::Undefined | Expression::Literal(_) | Expression::Conditional(_, _, _) => false, + } +} + +fn fill_absent_display(expression: &mut Expression) { + match expression { + Expression::Responsive(slots) => { + for index in [0, slots.len().saturating_sub(1)] { + if let Some(slot) = slots.get_mut(index) { + slot.get_or_insert_with(|| "none".into()); + } + } + } + Expression::Variant(_, values) => { + for (_, value) in values { fill_absent_display(value); } + } + Expression::Undefined => *expression = Expression::Literal("none".into()), + Expression::Literal(_) | Expression::Conditional(_, _, _) => {} + } +} + +fn effect_selector(value: &str) -> Option<&str> { + match value.to_ascii_lowercase().as_str() { + "default" => Some("&"), + "hover" | "hoevr" => Some("_hover"), + "active" => Some("_active"), + "focus" => Some("_focus"), + "disabled" => Some("_disabled"), + "selected" => Some("&[aria-selected=\"true\"]"), + _ => None, + } +} + +fn typography_attribute(expression: &Expression) -> (String, String) { + if let Expression::Responsive(slots) = expression { + let values = slots.iter().flatten().collect::>(); + if values.len() == 1 + && let Some(value) = values.first() { + return ("typography".into(), render_expression_attr("typography", &Expression::Literal((*value).clone()))); + } + let slots = slots.iter().map(|slot| slot.as_ref().map_or("null".into(), |token| format!("{{ typography: {} }}", serde_json::to_string(token).unwrap_or_default()))).collect::>().join(", "); + return ("selectors".into(), format!("={{{{ \"&\": [{slots}] }}}}")); + } + ("typography".into(), render_expression_attr("typography", expression)) +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant/text_properties.rs b/crates/devup-mcp-devup-ui/src/codegen/variant/text_properties.rs new file mode 100644 index 00000000..ad4c65f1 --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/codegen/variant/text_properties.rs @@ -0,0 +1,91 @@ +fn bind_text_properties( + snapshot: &Snapshot, + set: &RawNode, + tree: &mut Tree, + dimensions: &[Definition], +) -> BTreeMap { + let mut used = dimensions.iter().map(|definition| definition.name.clone()) + .collect::>(); + let mut properties = BTreeMap::new(); + for (name, definition) in set.typed_view() + .value("componentPropertyDefinitions") + .and_then(Value::as_object) + .into_iter() + .flatten() + .filter(|(_, definition)| definition["type"] == "TEXT") + { + let base = instance_property_name(name.split('#').next().unwrap_or(name)); + let mut property = base.clone(); + let mut suffix = 2; + while used.contains(&property) { + property = format!("{base}{suffix}"); + suffix += 1; + } + used.insert(property.clone()); + properties.insert(name.clone(), (property, definition["defaultValue"].to_string())); + } + let mut defaults = properties.values().cloned().collect::>(); + let mut fallback_index = 0; + let mut pending = vec![tree]; + while let Some(node) = pending.pop() { + if let Some((name, _)) = snapshot.nodes.get(&node.node_id) + .and_then(|raw| raw.typed_view().value("componentPropertyReferences")) + .and_then(|references| references.get("characters")) + .and_then(Value::as_str) + .and_then(|reference| properties.get(reference)) + { + node.content = Some(format!("{{{name}}}")); + } else if let Some(raw) = snapshot.nodes.get(&node.node_id) + && raw.node_type == "TEXT" + { + let layer = raw.typed_view().name().unwrap_or_default(); + let base = if layer.is_ascii() && layer.chars().any(|character| character.is_ascii_alphabetic()) { + let mut parts = layer.split(|character: char| !character.is_ascii_alphanumeric()) + .filter(|part| !part.is_empty()); + let mut name = parts.next().unwrap_or_default().to_owned(); + if name.chars().all(|character| !character.is_ascii_lowercase()) { + name.make_ascii_lowercase(); + } else if let Some(first) = name.get_mut(..1) { + first.make_ascii_lowercase(); + } + for part in parts { + let mut part = part.to_ascii_lowercase(); + if let Some(first) = part.get_mut(..1) { + first.make_ascii_uppercase(); + } + name.push_str(&part); + } + if name.starts_with(|character: char| character.is_ascii_digit()) { + name.insert(0, '_'); + } + name + } else { + fallback_index += 1; + format!("text{fallback_index}") + }; + let mut name = base.clone(); + let mut suffix = 2; + while used.contains(&name) || matches!(name.as_str(), + "break" | "case" | "catch" | "class" | "const" | "continue" | "debugger" | + "default" | "delete" | "do" | "else" | "enum" | "export" | "extends" | + "false" | "finally" | "for" | "function" | "if" | "import" | "in" | + "instanceof" | "new" | "null" | "return" | "super" | "switch" | "this" | + "throw" | "true" | "try" | "typeof" | "var" | "void" | "while" | "with" | + "let" | "yield" | "await" | "implements" | "interface" | "package" | + "private" | "protected" | "public" | "static" | "eval" | "arguments") { + name = format!("{base}{suffix}"); + suffix += 1; + } + used.insert(name.clone()); + let characters = raw.typed_view().string("characters").unwrap_or_default(); + let default = match node.content.as_deref() { + Some(content) if content.starts_with("{{") && content.ends_with('}') => content[1..content.len()-1].to_owned(), + _ => serde_json::to_string(characters).unwrap_or_default(), + }; + defaults.insert(name.clone(), default); + node.content = Some(format!("{{{name}}}")); + } + pending.extend(node.children.iter_mut().rev()); + } + defaults +} diff --git a/crates/devup-mcp-devup-ui/src/codegen/variant/variant_projection.rs b/crates/devup-mcp-devup-ui/src/codegen/variant/variant_projection.rs index 2b3e099b..8974546f 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/variant/variant_projection.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/variant/variant_projection.rs @@ -4,13 +4,11 @@ use devup_mcp_figma::{ DevupError, Diagnostic, DiagnosticSeverity, ErrorCode, FidelityImpact, RawNode, Snapshot, }; use serde_json::Value; - use super::{ component::{CodegenOptions, CodegenOutput, PropValue, legacy_component_name}, layout, style, text, }; use crate::provenance::mark_node; - #[derive(Clone, Debug)] pub(super) struct Tree { pub node_id: String, @@ -37,15 +35,14 @@ pub(super) struct Tree { /// In a responsive merge, the node each slot's width drew this element /// from and that node's text; empty everywhere else. pub slots: Vec)>>, + pub scalar_sources: Vec<(String, String)>, } - #[derive(Clone, Debug)] struct Record { values: BTreeMap, tree: Tree, node_id: String, } - #[derive(Clone, Debug)] struct Definition { /// The name as it is written in code. @@ -59,9 +56,9 @@ struct Definition { /// which may carry a `#id` suffix that `name` has dropped. source: String, } - #[derive(Clone, Debug)] enum Expression { + Undefined, Literal(String), /// A devup-ui responsive array, written out slot by slot, narrowest first. /// `None` is the literal `null`, which is not "no value" but "whatever the @@ -71,11 +68,11 @@ enum Expression { Variant(String, Vec<(String, Expression)>), Conditional(String, String, String), } - pub(super) fn generate_variant_component_set( snapshot: &Snapshot, set_id: &str, options: &CodegenOptions, + merge_all: bool, ) -> Result, DevupError> { let set = snapshot.nodes.get(set_id).ok_or_else(|| { DevupError::new( @@ -84,37 +81,72 @@ pub(super) fn generate_variant_component_set( false, ) })?; - let definitions = definitions(set); - if !definitions.iter().any(|definition| { - matches!( - definition.name.to_ascii_lowercase().as_str(), - "effect" | "viewport" - ) - }) { + let mut definitions = definitions(set); + let state_axis = merge_all.then(|| definitions.iter().find(|definition| { + definition.name.eq_ignore_ascii_case("state") && definition.options.iter().all(|value| { + matches!(value.to_ascii_lowercase().as_str(), "default" | "hover" | "active" | "disabled" | "focus") + }) + }).map(|definition| definition.source.clone())).flatten(); + if let Some(state_axis) = &state_axis { + for definition in &mut definitions { + if &definition.source == state_axis { + definition.name = "effect".into(); + definition.source = "effect".into(); + definition.default.make_ascii_lowercase(); + definition.options.iter_mut().for_each(|value| value.make_ascii_lowercase()); + } + } + } + if !merge_all && !definitions.iter().any(|definition| matches!(definition.name.to_ascii_lowercase().as_str(), "effect" | "viewport")) { return Ok(None); } - let records = set + let mut records = set .typed_view() .child_ids() .filter_map(|id| snapshot.nodes.get(id)) .filter_map(|node| { - let values = node + let mut values = node .typed_view() .value("variantProperties")? .as_object()? .iter() .filter_map(|(key, value)| Some((key.clone(), value.as_str()?.to_owned()))) .collect::>(); + if let Some(state_axis) = &state_axis + && let Some(value) = values.remove(state_axis) + { + values.insert("effect".into(), value.to_ascii_lowercase()); + } Some((node, values)) }) .map(|(node, values)| { + let mut tree = project_tree(snapshot, node, options, true)?; + tree.props.retain(|name, _| !POSITION_PROPS.contains(&name.as_str())); + if layout::holds_positioned_children(snapshot, node) { + tree.props.insert("pos".into(), "relative".into()); + } Ok(Record { values, - tree: project_tree(snapshot, node, options, true)?, + tree, node_id: node.id.clone(), }) }) .collect::, DevupError>>()?; + if records.is_empty() { + return Ok(None); + } + if records.iter().any(|record| record.tree.component == "Image") + && records.iter().all(|record| is_asset_leaf(&record.tree)) + { + for record in &mut records { + if let Some(mask) = record.tree.props.remove("maskImage") { + let source = mask.trim_start_matches("url(").trim_end_matches(')').to_owned(); + record.tree.component = "Image".into(); + record.tree.props.retain(|name, _| !matches!(name.as_str(), "bg" | "maskPos" | "maskRepeat" | "maskSize")); + record.tree.props.insert("src".into(), source); + } + } + } // A boolean property is not part of a variant's identity — it never appears // in `variantProperties` — so filtering records by it matches nothing. let default_filters = definitions @@ -131,7 +163,7 @@ pub(super) fn generate_variant_component_set( false, ) })?; - let dimensions = definitions + let mut dimensions = definitions .iter() .filter(|definition| { !matches!( @@ -143,7 +175,12 @@ pub(super) fn generate_variant_component_set( .collect::>(); let effect = definitions .iter() - .find(|definition| definition.name.eq_ignore_ascii_case("effect")); + .find(|definition| definition.name.eq_ignore_ascii_case("effect") && !records.iter().any(|record| record.tree.props.contains_key("src")) && definition.options.iter().all(|value| value.eq_ignore_ascii_case(&definition.default) || effect_selector(value).is_some())); + if effect.is_none() + && let Some(definition) = definitions.iter().find(|definition| definition.name.eq_ignore_ascii_case("effect")) + { + dimensions.push(definition.clone()); + } let viewport = definitions .iter() .find(|definition| definition.name.eq_ignore_ascii_case("viewport")); @@ -155,7 +192,7 @@ pub(super) fn generate_variant_component_set( &records, &[], &mut unrepresented_variant_nodes, - effect.map(|definition| definition.name.as_str()), + effect.map(|definition| definition.source.as_str()), &default.values, ); root.props = merged_props( @@ -167,6 +204,9 @@ pub(super) fn generate_variant_component_set( None, &default.tree.props, ); + if root.component == "Image" { + root.scalar_sources = scalar_sources(&records, &definitions, &dimensions, viewport, effect.map_or("default", |definition| definition.default.as_str()), &[]); + } merge_child_props( &mut root, &records, @@ -176,6 +216,7 @@ pub(super) fn generate_variant_component_set( effect.map_or("default", |definition| definition.default.as_str()), &[], ); + bind_referenced_properties(&mut root, &mut dimensions); let mut selectors = BTreeMap::new(); let mut transition_props = BTreeSet::new(); @@ -194,11 +235,14 @@ pub(super) fn generate_variant_component_set( ); if !changed.is_empty() { transition_props.extend(changed.keys().cloned()); - selectors.insert(format!("_{effect_value}"), changed); + if let Some(selector) = effect_selector(effect_value) { + selectors.insert(selector.to_owned(), changed); + } } } } let transition = transition(snapshot, &default.node_id, &transition_props); + let text_properties = bind_text_properties(snapshot, set, &mut root, &dimensions); let component_name = legacy_component_name(set.typed_view().name().unwrap_or("Component")); let code = mark_node( &set.id, @@ -208,6 +252,7 @@ pub(super) fn generate_variant_component_set( &root, &selectors, transition.as_ref(), + &text_properties, ), ); let mut imports = BTreeSet::new(); @@ -359,7 +404,7 @@ pub(super) const POSITION_PROPS: [&str; 7] = [ /// is `Property1` and not `property1`; folding it turned `leftIcon` into /// `lefticon`. And only a trailing `#:` is stripped, since /// that is Figma's own suffix rather than a character a name may not contain. -fn instance_property_name(raw: &str) -> String { +pub(super) fn instance_property_name(raw: &str) -> String { let stripped = raw .rsplit_once('#') .filter(|(_, suffix)| { @@ -477,6 +522,7 @@ fn project_tree_inner( drawn_when: Vec::new(), leading_comment: None, slots: Vec::new(), + scalar_sources: Vec::new(), }); } let asset = super::image::asset_kind(snapshot, node, &options.asset_policies); @@ -562,6 +608,9 @@ fn project_tree_inner( &options.length_tokens, &mut used_tokens, ); + if visible_when(&view).is_some() && view.bool("visible") == Some(false) { + props.retain(|(name, _)| name != "display"); + } if asset.is_some() { props.retain(|(name, _)| { !matches!( @@ -620,6 +669,7 @@ fn project_tree_inner( drawn_when: Vec::new(), leading_comment: None, slots: Vec::new(), + scalar_sources: Vec::new(), }; Ok(super::image::project_tree(tree, snapshot, node, options)) } @@ -780,6 +830,7 @@ fn merged_props( } } keys.into_iter() + .filter(|prop| prop != "src" || defaults.contains_key("src")) .filter_map(|prop| { let expression = expression_for_prop( records, @@ -793,6 +844,9 @@ fn merged_props( path.unwrap_or_default(), &prop, )?; + if prop == "typography" { + return Some(typography_attribute(&expression)); + } Some((prop.clone(), render_expression_attr(&prop, &expression))) }) .collect() @@ -943,4 +997,4 @@ fn tree_field(tree: &Tree, field: &str) -> Option { return tree.content.clone(); } tree.props.get(field).cloned() -} \ No newline at end of file +} diff --git a/crates/devup-mcp-devup-ui/src/style_props/devup_primitive_elements.rs b/crates/devup-mcp-devup-ui/src/style_props/devup_primitive_elements.rs index af4732b8..d81b85f7 100644 --- a/crates/devup-mcp-devup-ui/src/style_props/devup_primitive_elements.rs +++ b/crates/devup-mcp-devup-ui/src/style_props/devup_primitive_elements.rs @@ -15,6 +15,7 @@ pub const DEVUP_PRIMITIVE_ELEMENTS: &[&str] = &["Box", "Flex", "Text", "Center", /// `is_known_non_style_prop`. const DEVUP_NON_STYLE_PROPS: &[&str] = &[ "as", + "props", "selectors", "children", "className", diff --git a/crates/devup-mcp-devup-ui/src/ui_structure.rs b/crates/devup-mcp-devup-ui/src/ui_structure.rs index 44920094..ca5f2c66 100644 --- a/crates/devup-mcp-devup-ui/src/ui_structure.rs +++ b/crates/devup-mcp-devup-ui/src/ui_structure.rs @@ -72,16 +72,20 @@ pub fn validate_bundle( facts.boundary }); let mut result = UiValidation { + next_action: None, ok: true, violations: vec![], theme_notes: vec![], checked_tokens: 0, available_token_count: theme.map_or(0, ProjectTheme::token_count), }; + let mut fixable = 0; for file in files.iter().filter(|f| is_source(&f.path)) { let mut report = validate_source(&file.content, theme, strict, source_type(&file.path)); + fixable += report.next_action.as_ref().and_then(|action| action["fixable"].as_u64()).unwrap_or(0) as usize; if !report.violations.iter().any(|v| v.rule == "invalid-syntax") { report.violations.extend(structural(file, boundary)); + report.violations.extend(super::wiring::fixture_findings(files, &file.path, &file.content)); report .violations .extend(super::site::interaction_findings(&file.path, &file.content)); @@ -99,6 +103,7 @@ pub fn validate_bundle( result.violations.extend(report.violations); } result.theme_notes.sort(); + result.next_action = super::lint_fix_action(fixable); result.theme_notes.dedup(); result.ok = result .violations diff --git a/crates/devup-mcp-devup-ui/src/ui_validate/site.rs b/crates/devup-mcp-devup-ui/src/ui_validate/site.rs index 828f5fe1..f54a8e60 100644 --- a/crates/devup-mcp-devup-ui/src/ui_validate/site.rs +++ b/crates/devup-mcp-devup-ui/src/ui_validate/site.rs @@ -98,6 +98,8 @@ struct Element { motion_reduce: bool, aria_label: bool, aria_current: bool, + child_focus: bool, + child_hover: bool, /// The opening tag as written, for the motion checks. text: String, } @@ -174,6 +176,23 @@ fn has_image(children: &[JSXChild<'_>]) -> bool { }) } +/// Whether any descendant element carries one of the named attributes. +fn descendant_has(children: &[JSXChild<'_>], wanted: &[&str]) -> bool { + children.iter().any(|child| match child { + JSXChild::Element(element) => { + element + .opening_element + .attributes + .iter() + .filter_map(attribute_name) + .any(|name| wanted.contains(&name)) + || descendant_has(&element.children, wanted) + } + JSXChild::Fragment(fragment) => descendant_has(&fragment.children, wanted), + _ => false, + }) +} + /// Whether the element shows text of its own: literal text, or an /// expression that may render text. An icon button shows neither. fn has_text(children: &[JSXChild<'_>]) -> bool { @@ -255,6 +274,9 @@ impl<'a> Visit<'a> for Collector<'_> { motion_reduce: has("_motionReduce"), aria_label: has("aria-label") || has("aria-labelledby"), aria_current: has("aria-current"), + child_focus: link + && descendant_has(&node.children, &["_focusVisible", "_focus"]), + child_hover: link && descendant_has(&node.children, &["_hover"]), text: self .source .get(span.start as usize..span.end as usize) @@ -453,7 +475,26 @@ pub fn interaction_findings(path: &str, source: &str) -> Vec { suggestion, )); }; - if !element.hover && !element.focus { + if element.child_focus && !element.focus { + push( + "focus-on-non-focusable", + Severity::Error, + format!( + "<{name}> is the focusable link, but _focusVisible is set on a child element; the child never receives focus, so a keyboard user sees no focus ring." + ), + "Render the stateful element itself as the link: . Do not wrap it in and put the states on the child, and do not move them into css().", + ); + } else if element.child_hover && !element.hover { + push( + "hover-on-child", + Severity::Warning, + format!( + "<{name}> is the link, but _hover is set only on a child element; the link's own computed style does not change." + ), + "Put _hover on the element rendered as the link: .", + ); + } + if !element.hover && !element.focus && !element.child_focus && !element.child_hover { push( "interactive-states", Severity::Warning, @@ -463,7 +504,7 @@ pub fn interaction_findings(path: &str, source: &str) -> Vec { ), include_str!("../text/site-interaction_findings-3f71ed85.md"), ); - } else if !element.focus { + } else if !element.focus && !element.child_focus { push( "focus-style", Severity::Warning, @@ -703,6 +744,23 @@ export function Cards() { return + A + B + C +; }"#; + let found = interaction_findings("Nav.tsx", source); + let rules = found.iter().map(|v| v.rule).collect::>(); + assert_eq!( + rules, + ["focus-on-non-focusable", "hover-on-child", "focus-style"] + ); + assert_eq!(found[0].severity, Severity::Error); + assert_eq!(found[1].severity, Severity::Warning); + } + #[test] fn a_page_or_layout_without_metadata_is_a_warning() { let bare = "export default function Page() { return
; }"; diff --git a/crates/devup-mcp-devup-ui/src/ui_validate/tests.rs b/crates/devup-mcp-devup-ui/src/ui_validate/tests.rs index 6e621e20..0ebb587d 100644 --- a/crates/devup-mcp-devup-ui/src/ui_validate/tests.rs +++ b/crates/devup-mcp-devup-ui/src/ui_validate/tests.rs @@ -5,6 +5,30 @@ mod tests { use super::*; use crate::theme::parse_project_theme; + #[test] + fn prop_sort_findings_are_one_lint_fix_action() { + let report = serde_json::to_value(validate_devup_ui_tsx( + r#"<>"#, + None, + false, + )).unwrap(); + assert_eq!(report["nextAction"]["command"], "bun run lint:fix"); + assert_eq!(report["nextAction"]["fixable"], 2); + assert_eq!(report["nextAction"]["label"], "bun run lint:fix (fixable 2)"); + } + + #[test] + fn prop_sort_respects_reserved_props_and_spread_boundaries() { + for tsx in [ + r#""#, + r#""#, + r#""#, + ] { + let report = serde_json::to_value(validate_devup_ui_tsx(tsx, None, false)).unwrap(); + assert!(report["nextAction"].is_null(), "{tsx}: {report}"); + } + } + fn fixture_theme() -> ProjectTheme { parse_project_theme( r##"{ "theme": { diff --git a/crates/devup-mcp-devup-ui/src/ui_validate/types_and_helpers.rs b/crates/devup-mcp-devup-ui/src/ui_validate/types_and_helpers.rs index 9ab1ffa7..38c6a6f0 100644 --- a/crates/devup-mcp-devup-ui/src/ui_validate/types_and_helpers.rs +++ b/crates/devup-mcp-devup-ui/src/ui_validate/types_and_helpers.rs @@ -4,6 +4,8 @@ use std::collections::BTreeSet; mod blur_layers; #[path = "site.rs"] pub mod site; +#[path = "wiring.rs"] +pub mod wiring; use oxc_allocator::Allocator; use oxc_ast::ast::{ @@ -57,6 +59,8 @@ pub struct Violation { #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] pub struct UiValidation { + #[serde(skip_serializing_if = "Option::is_none")] + pub next_action: Option, /// Whether this TSX may be used as it stands. /// /// `false` when any violation is [`Severity::Error`] — a syntax @@ -139,6 +143,7 @@ fn validate_source( let available_token_count = theme.map(ProjectTheme::token_count).unwrap_or(0); let mut visitor = TsxVisitor { + fixable: 0, theme, checked_tokens: 0, violations: Vec::new(), @@ -147,6 +152,7 @@ fn validate_source( }; visitor.visit_program(&parsed.program); violations.extend(visitor.violations); + violations.extend(wiring::findings(tsx)); let checked_tokens = visitor.checked_tokens; let attributes = crate::provenance::attributes::generated_attributes(tsx); violations.extend(blur_layers::check(tsx, &attributes)); @@ -234,6 +240,7 @@ fn validate_source( .unwrap_or_default(); UiValidation { + next_action: lint_fix_action(visitor.fixable), ok, violations, theme_notes, @@ -243,6 +250,7 @@ fn validate_source( } struct TsxVisitor<'t> { + fixable: usize, theme: Option<&'t ProjectTheme>, checked_tokens: usize, violations: Vec, @@ -518,6 +526,23 @@ impl<'t> TsxVisitor<'t> { impl<'a, 't> Visit<'a> for TsxVisitor<'t> { fn visit_jsx_opening_element(&mut self, element: &JSXOpeningElement<'a>) { + let mut previous = None; + for attribute in &element.attributes { + let JSXAttributeItem::Attribute(attribute) = attribute else { + previous = None; + continue; + }; + let JSXAttributeName::Identifier(name) = &attribute.name else { + previous = None; + continue; + }; + let name = name.name.as_str(); + let current = (!matches!(name, "key" | "ref"), name); + if previous.is_some_and(|previous| previous > current) { + self.fixable += 1; + } + previous = Some(current); + } let tag_name = jsx_element_name(&element.name); // Resolve before visiting attributes so maxLength before as works too. // A later spread/dynamic as can override a literal; do not assume its tag. @@ -693,4 +718,14 @@ pub fn rule_names() -> BTreeSet<&'static str> { ] .into_iter() .collect() -} \ No newline at end of file +} + +pub fn lint_fix_action(fixable: usize) -> Option { + (fixable > 0).then(|| serde_json::json!({ + "command": "bun run lint:fix", + "fixable": fixable, + "label": format!("bun run lint:fix (fixable {fixable})"), + "then": "bunx oxlint --deny-warnings", + "reason": "Detected adjacent JSX prop-order inversions under eslint-plugin-devup defaults. Run the project's fixer, never sort or format by hand. Custom lint configuration and other formatting rules are not checked here; fix only non-fixable leftovers after oxlint." + })) +} diff --git a/crates/devup-mcp-devup-ui/src/ui_validate/wiring.rs b/crates/devup-mcp-devup-ui/src/ui_validate/wiring.rs new file mode 100644 index 00000000..285d1a7a --- /dev/null +++ b/crates/devup-mcp-devup-ui/src/ui_validate/wiring.rs @@ -0,0 +1,213 @@ +use super::{Severity, Violation}; +use oxc_allocator::Allocator; +use oxc_ast::ast::*; +use oxc_ast_visit::{Visit, walk}; +use oxc_parser::Parser; +use oxc_span::{SourceType, Span}; + +fn error(span: Span, rule: &'static str, message: &str) -> Violation { + Violation { + rule, + severity: Severity::Error, + byte_range: [span.start as usize, span.end as usize], + context: Default::default(), + message: message.into(), + suggestion: Some("Wire the control and data to the real application contract before reporting completion.".into()), + } +} + +pub fn findings(source: &str) -> Vec { + let allocator = Allocator::default(); + let parsed = Parser::new(&allocator, source, SourceType::tsx()).parse(); + if !parsed.diagnostics.is_empty() { + return Vec::new(); + } + let mut found = Vec::new(); + for comment in &parsed.program.comments { + let text = &source[comment.span.start as usize..comment.span.end as usize]; + let lower = text.to_lowercase(); + if ["todo", "api 생기면", "replace when"].iter().any(|marker| lower.contains(marker)) { + found.push(error(comment.span, "deferred-wiring", "Deferred implementation comment leaves application wiring unfinished.")); + } + } + let mut collector = Collector { source, found, functions: std::collections::BTreeMap::new(), forms: Vec::new(), submit_depth: 0, link_depth: 0 }; + collector.visit_program(&parsed.program); + for (span, handler) in &collector.forms { + let body = collector.functions.get(handler).map(String::as_str).unwrap_or(handler); + if fake_success(body) { + collector.found.push(error(*span, "fake-submit", "Form submission only changes local success state without a request.")); + } + } + collector.found +} + +fn fake_success(body: &str) -> bool { + let lower = body.to_lowercase(); + let success = ["setsuccess(", "setsubmitted(", "setsent(", "setissuccess(", "setissubmitted(", "setissent("].iter().any(|name| lower.contains(name)); + success && !["fetch(", ".post(", ".mutate(", ".mutateasync(", "axios(", ".request("].iter().any(|call| lower.contains(call)) +} + +pub fn fixture_findings(files: &[crate::ui_validate::SourceFile], path: &str, source: &str) -> Vec { + struct Imports(Vec<(String, Span)>); + impl<'a> Visit<'a> for Imports { + fn visit_import_declaration(&mut self, node: &ImportDeclaration<'a>) { + self.0.push((node.source.value.to_string(), node.span)); + } + } + struct Records(bool); + impl<'a> Visit<'a> for Records { + fn visit_array_expression(&mut self, node: &ArrayExpression<'a>) { + if !node.elements.is_empty() && node.elements.iter().all(|item| matches!(item, ArrayExpressionElement::ObjectExpression(object) if object.properties.len() >= 2 && object.properties.iter().all(|property| matches!(property, ObjectPropertyKind::ObjectProperty(property) if matches!(property.value, Expression::StringLiteral(_) | Expression::NumericLiteral(_) | Expression::BooleanLiteral(_) | Expression::NullLiteral(_)))))) { + self.0 = true; + } + walk::walk_array_expression(self, node); + } + } + let allocator = Allocator::default(); + let parsed = Parser::new(&allocator, source, SourceType::tsx()).parse(); + let mut imports = Imports(Vec::new()); + imports.visit_program(&parsed.program); + imports.0.into_iter().filter_map(|(import, span)| { + let import = import.replace('\\', "/"); + let tail = import.split("utils/").nth(1)?; + let target = files.iter().find(|file| { + let normalized = file.path.replace('\\', "/"); + normalized.ends_with(&format!("utils/{tail}")) || normalized.ends_with(&format!("utils/{tail}.ts")) + })?; + if target.path == path { return None; } + let parsed = Parser::new(&allocator, &target.content, SourceType::ts()).parse(); + let mut records = Records(false); + records.visit_program(&parsed.program); + records.0.then(|| { + let mut finding = error(span, "fixture-instead-of-api", "UI imports a hardcoded record array from utils instead of an API data source."); + finding.context.insert("fixturePath".into(), serde_json::json!(target.path)); + finding.context.insert("confidence".into(), serde_json::json!("medium")); + finding + }) + }).collect() +} + +struct Collector<'s> { + source: &'s str, + found: Vec, + functions: std::collections::BTreeMap, + forms: Vec<(Span, String)>, + submit_depth: usize, + link_depth: usize, +} + +fn attr_name<'a>(item: &'a JSXAttributeItem<'a>) -> Option<&'a str> { + match item { + JSXAttributeItem::Attribute(attribute) => attribute.name.as_identifier().map(|name| name.name.as_str()), + _ => None, + } +} + +fn value_text(value: &JSXAttributeValue<'_>) -> Option { + match value { + JSXAttributeValue::StringLiteral(value) => Some(value.value.to_string()), + JSXAttributeValue::ExpressionContainer(value) => match &value.expression { + JSXExpression::Identifier(value) => Some(value.name.to_string()), + JSXExpression::StringLiteral(value) => Some(value.value.to_string()), + _ => None, + }, + _ => None, + } +} + +impl<'a> Visit<'a> for Collector<'_> { + fn visit_variable_declarator(&mut self, node: &VariableDeclarator<'a>) { + if let BindingPattern::BindingIdentifier(id) = &node.id + && let Some(Expression::ArrowFunctionExpression(function)) = &node.init + { + self.functions.insert(id.name.to_string(), self.source[function.span.start as usize..function.span.end as usize].into()); + } + walk::walk_variable_declarator(self, node); + } + + fn visit_statement(&mut self, node: &Statement<'a>) { + if let Statement::FunctionDeclaration(function) = node + && let Some(id) = &function.id + { + self.functions.insert(id.name.to_string(), self.source[function.span.start as usize..function.span.end as usize].into()); + } + walk::walk_statement(self, node); + } + + fn visit_jsx_element(&mut self, node: &JSXElement<'a>) { + let opening = &node.opening_element; + let tag = opening.name.get_identifier_name().map(|name| name.as_str()).unwrap_or_default(); + let attribute = |name: &str| opening.attributes.iter().find_map(|item| match item { + JSXAttributeItem::Attribute(value) if attr_name(item) == Some(name) => value.value.as_ref(), + _ => None, + }); + let has = |name: &str| opening.attributes.iter().any(|item| attr_name(item) == Some(name)); + let effective = attribute("as").and_then(value_text).unwrap_or_else(|| tag.into()); + let spread = opening.attributes.iter().any(|item| matches!(item, JSXAttributeItem::SpreadAttribute(_))); + let form = effective == "form"; + let submits = form && (has("onSubmit") || has("action")); + if let Some(handler) = attribute("onSubmit") { + let text = value_text(handler).unwrap_or_else(|| { + use oxc_span::GetSpan; + let span = handler.span(); + self.source[span.start as usize..span.end as usize].into() + }); + self.forms.push((opening.span, text)); + } + let links = matches!(effective.as_str(), "a" | "Link") || has("href"); + if !spread && !has("disabled") && !has("readOnly") && self.link_depth == 0 { + let input = matches!(effective.as_str(), "input" | "Input" | "select" | "Select" | "textarea" | "Textarea"); + let button = matches!(effective.as_str(), "button" | "Button"); + let submit = attribute("type").and_then(value_text).is_none_or(|kind| kind == "submit") && self.submit_depth > 0; + if (input && !["value", "onChange", "name", "defaultValue", "checked", "onInput", "props"].iter().any(|name| has(name))) + || (button && !submit && !["onClick", "href", "formAction", "form", "props"].iter().any(|name| has(name))) + { + self.found.push(error(opening.span, "dead-control", "Visible control has no value, form binding, handler or destination.")); + } + } + self.submit_depth += usize::from(submits); + self.link_depth += usize::from(links); + walk::walk_jsx_element(self, node); + self.link_depth -= usize::from(links); + self.submit_depth -= usize::from(submits); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn dead_controls_and_deferred_comments_are_errors_not_string_matches() { + let source = r#"// TODO wire API +const label = 'TODO'; +const view = <>;"#; + let rules = findings(source).into_iter().map(|item| item.rule).collect::>(); + assert_eq!(rules, ["deferred-wiring", "dead-control", "dead-control"]); + } + + #[test] + fn a_control_rendered_inside_a_link_takes_the_link_destination() { + let source = r#"const view = <>;"#; + assert!(findings(source).iter().any(|item| item.rule == "fake-submit")); + assert!(!findings(&source.replace("setSuccess(true)", "await fetch('/contact', { method: 'POST' }); setSuccess(true)").replace("(event) =>", "async (event) =>")).iter().any(|item| item.rule == "fake-submit")); + } +} diff --git a/crates/devup-mcp-devup-ui/src/validation.rs b/crates/devup-mcp-devup-ui/src/validation.rs index a1606c0c..0203ef14 100644 --- a/crates/devup-mcp-devup-ui/src/validation.rs +++ b/crates/devup-mcp-devup-ui/src/validation.rs @@ -18,7 +18,7 @@ pub fn validate_tsx(source: &str) -> Result { // `ParserReturn::diagnostics` (oxc_parser 0.148, was `errors` on 0.96) derefs to // `Vec`, so this keeps the original "any diagnostic fails validation" // behavior regardless of severity. - if parsed.diagnostics.is_empty() { + if !parsed.panicked && parsed.diagnostics.is_empty() { return Ok(TsxValidation { byte_len: source.len(), statement_count: parsed.program.body.len(), @@ -53,7 +53,7 @@ pub fn validate_tsx(source: &str) -> Result { false, json!({ "errorCount": errors.len(), - "panicked": parsed.panicked, + "parserAborted": parsed.panicked, "errors": errors }), )) diff --git a/crates/devup-mcp-devup-ui/tests/asset_boundaries.rs b/crates/devup-mcp-devup-ui/tests/asset_boundaries.rs index 209cfcd6..6b721bff 100644 --- a/crates/devup-mcp-devup-ui/tests/asset_boundaries.rs +++ b/crates/devup-mcp-devup-ui/tests/asset_boundaries.rs @@ -47,7 +47,7 @@ fn a_folded_asset_does_not_anchor_children_it_no_longer_has() { ); assert!( - tsx.contains("/icons/clear button.svg"), + tsx.contains("/icons/clear-button.svg"), "expected a folded asset: {tsx}" ); assert!( @@ -89,10 +89,10 @@ fn a_raster_pattern_is_referenced_from_the_image_folder() { ); assert!( - tsx.contains("/images/Tile.png"), + tsx.contains("/images/tile.png"), "a raster pattern is an image: {tsx}" ); - assert!(!tsx.contains("/icons/Tile"), "{tsx}"); + assert!(!tsx.contains("/icons/tile"), "{tsx}"); } #[test] @@ -116,8 +116,8 @@ fn separate_image_fills_do_not_claim_the_same_file() { }]), ); - assert!(tsx.contains("/images/Card.png"), "{tsx}"); - assert!(tsx.contains("/images/Card-1.png"), "{tsx}"); + assert!(tsx.contains("/images/card.png"), "{tsx}"); + assert!(tsx.contains("/images/card-1.png"), "{tsx}"); } #[test] @@ -147,7 +147,7 @@ fn image_filled_asset_container_preserves_text_children() { // The fill names the node it came from, so two different images cannot // claim the same file. An original-source paint is an image layer below // live text, rather than a flattened export of the entire container. - assert!(tsx.contains("src=\"/images/Book cover.png\"")); + assert!(tsx.contains("src=\"/images/book-cover.png\"")); assert!(tsx.contains("objectFit=\"cover\"")); assert!(tsx.contains("Preserved title")); assert!(tsx.contains(" Snapshot { + serde_json::from_str(raw).unwrap() +} + +fn button() -> Snapshot { + load(include_str!("fixtures/chondrogen_button_set.json")) +} + +fn section_title() -> Snapshot { + load(include_str!("fixtures/chondrogen_section_title_set.json")) +} + +#[test] +fn button_set_generates_without_panicking() { + let snapshot = button(); + let root = snapshot.roots[0].clone(); + let output = std::panic::catch_unwind(|| { + generate_component(&snapshot, &root, &CodegenOptions::default()) + }) + .expect("component codegen must not panic"); + let output = output.expect("button set must produce componentTsx"); + println!("{}", output.tsx); + assert!(output.tsx.contains("export function"), "{}", output.tsx); +} + +#[test] +fn section_title_texts_are_props_not_sample_copy() { + let snapshot = section_title(); + let root = snapshot.roots[0].clone(); + let output = generate_component(&snapshot, &root, &CodegenOptions::default()).unwrap(); + println!("{}", output.tsx); + let body = output.tsx.split("return (").nth(1).unwrap(); + assert!(!body.contains("CEO MESSEAGE"), "{}", output.tsx); + assert!(!body.contains("관절재생으로 새로운 삶을"), "{}", output.tsx); + assert!(body.contains("{ceoMesseage}"), "{}", output.tsx); + assert!(body.contains("{text1}"), "{}", output.tsx); + assert!(output.tsx.contains("ceoMesseage = \"CEO MESSEAGE\"")); + assert!(output.tsx.contains("text1 = \"관절재생으로 새로운 삶을\"")); +} + +#[test] +fn section_title_variant_roots_drop_set_canvas_placement() { + let snapshot = section_title(); + let root = snapshot.roots[0].clone(); + let output = generate_component(&snapshot, &root, &CodegenOptions::default()).unwrap(); + assert!(!output.tsx.contains("pos=\"absolute\""), "{}", output.tsx); + assert!(!output.tsx.contains("top={"), "{}", output.tsx); + assert!(!output.tsx.contains("left=\"20px\""), "{}", output.tsx); +} + +#[test] +fn conditional_variant_values_never_evaluate_to_false() { + for snapshot in [section_title(), button()] { + let root = snapshot.roots[0].clone(); + let Ok(output) = std::panic::catch_unwind(|| { + generate_component(&snapshot, &root, &CodegenOptions::default()) + }) else { + continue; + }; + let Ok(output) = output else { continue }; + assert!(!output.tsx.contains(" && \""), "{}", output.tsx); + assert!(!output.tsx.contains(" && '"), "{}", output.tsx); + } +} + +#[test] +fn named_text_props_are_unique_identifiers_with_escaped_defaults() { + for (first, second, expected) in [ + ("Title label", "Title-label", ["titleLabel", "titleLabel2"]), + ("align", "class", ["align2", "class2"]), + ("", "제목", ["text1", "text2"]), + ] { + let mut snapshot = section_title(); + for node in snapshot + .nodes + .values_mut() + .filter(|node| node.node_type == "TEXT") + { + let name = if node.fields["characters"] == "CEO MESSEAGE" { + first + } else { + second + }; + node.fields.insert("name".into(), serde_json::json!(name)); + node.fields.insert( + "characters".into(), + serde_json::json!("A \"quote\"\n{body}"), + ); + } + let output = + generate_component(&snapshot, &snapshot.roots[0], &CodegenOptions::default()).unwrap(); + for name in expected { + assert!( + output.tsx.contains(&format!("{name}?: string")), + "{}", + output.tsx + ); + assert!( + output.tsx.contains(&format!("{{{name}}}")), + "{}", + output.tsx + ); + } + assert!( + output.tsx.contains(r#"= "A \"quote\"\n{body}""#), + "{}", + output.tsx + ); + } +} + +#[test] +fn variant_root_remains_a_containing_block_for_absolute_descendants() { + let mut snapshot = section_title(); + for node in snapshot + .nodes + .values_mut() + .filter(|node| node.node_type == "TEXT") + { + node.fields + .insert("layoutPositioning".into(), serde_json::json!("ABSOLUTE")); + node.fields.insert("x".into(), serde_json::json!(3)); + node.fields.insert("y".into(), serde_json::json!(7)); + } + let output = + generate_component(&snapshot, &snapshot.roots[0], &CodegenOptions::default()).unwrap(); + let root = output.tsx.split(" String { + let snapshot: Snapshot = serde_json::from_str(raw).unwrap(); + let mut options = CodegenOptions { + asset_names_per_node: true, + ..CodegenOptions::default() + }; + for node in snapshot + .nodes + .values() + .filter(|node| node.node_type == "TEXT") + { + if let Some(style) = node + .typed_view() + .string("textStyleId") + .filter(|id| !id.is_empty()) + { + options + .text_style_tokens + .insert(style.into(), "bodySm".into()); + } + } + generate_component(&snapshot, &snapshot.roots[0], &options) + .unwrap() + .tsx +} + +#[test] +fn responsive_typography_remains_a_scalar_token() { + let tsx = generate(include_str!("fixtures/chondrogen_board_row_set.json")); + assert!(!tsx.contains("typography={["), "{tsx}"); + assert!(tsx.contains("typography=\"bodySm\""), "{tsx}"); +} + +#[test] +fn responsive_sources_remain_scalar_images() { + let tsx = generate(include_str!("fixtures/chondrogen_cta_banner_set.json")); + assert!(!tsx.contains("src={["), "{tsx}"); + assert!( + tsx.contains("caret-2.svg") && tsx.contains("caret.svg"), + "{tsx}" + ); +} + +#[test] +fn absent_responsive_variant_values_have_explicit_undefined_branches() { + let tsx = generate(include_str!("fixtures/chondrogen_page_title_set.json")); + assert!(tsx.contains("White: undefined"), "{tsx}"); +} + +#[test] +fn referenced_boolean_properties_are_declared_with_text_properties() { + let tsx = generate(include_str!("fixtures/chondrogen_page_title_set.json")); + assert!(tsx.contains("depth2?: boolean"), "{tsx}"); + assert!(tsx.contains("depth3?: boolean"), "{tsx}"); + assert!(tsx.contains("deapth2?: string"), "{tsx}"); +} + +#[test] +fn selected_effect_uses_a_valid_selector() { + let tsx = generate(include_str!( + "fixtures/chondrogen_list_type_button_set.json" + )); + assert!(!tsx.contains("_selected="), "{tsx}"); + assert!(tsx.contains("aria-selected"), "{tsx}"); +} + +#[test] +fn icon_effects_never_emit_attributes_inside_style_selectors() { + let tsx = generate(include_str!("fixtures/chondrogen_icon_button_set.json")); + assert!(!tsx.contains("_hoevr="), "{tsx}"); + assert!(!tsx.contains("\"src\":"), "{tsx}"); +} + +#[test] +fn desktop_only_footer_logo_has_scalar_source_and_explicit_visibility() { + let tsx = generate(include_str!("fixtures/chondrogen_footer_set.json")); + assert!(!tsx.contains("src={["), "{tsx}"); + let image = tsx + .split("") + .next() + .unwrap(); + assert!(image.contains("src=\"/icons/logo.svg\""), "{image}"); + assert!( + image.contains("display={[\"none\", null, null, null, \"inline\"]}"), + "{image}" + ); + assert!(!tsx.contains("typography={["), "{tsx}"); +} + +#[test] +fn header_container_does_not_inherit_a_leaf_variants_source() { + let tsx = generate(include_str!("fixtures/chondrogen_header_set.json")); + let root = tsx + .split("').next().unwrap_or_default(); + if attributes + .lines() + .any(|line| line.trim_start().starts_with("src=")) + { + assert_eq!(tag, "Image", "{name}: {attributes}"); + assert!(attributes.trim_end().ends_with('/'), "{name}: {attributes}"); + } + } + } +} + +#[test] +fn caret_variants_keep_mask_sources_and_dimensions() { + let tsx = generate(include_str!("fixtures/chondrogen_caret_set.json")); + assert!(tsx.contains("maskImage={{"), "{tsx}"); + for direction in ["caretdown", "caretleft", "caretright", "caretup"] { + assert!(tsx.contains(&format!("1-{direction}.svg")), "{tsx}"); + } + assert!(tsx.contains("boxSize=\"24px\""), "{tsx}"); + assert!(tsx.contains("}[property1]"), "{tsx}"); +} + +#[test] +fn logo_variants_keep_scalar_image_sources() { + let tsx = generate(include_str!("fixtures/chondrogen_logo_set.json")); + assert!(tsx.contains(">(); + for field in interface.lines() { + let property = field + .split(':') + .next() + .unwrap() + .trim() + .trim_end_matches('?'); + assert!( + identifiers.contains(&property), + "{name}: unused {property}\n{tsx}" + ); + } + } +} + +#[test] +fn responsive_values_omit_redundant_trailing_inheritance() { + let tsx = generate(include_str!("fixtures/chondrogen_board_row_set.json")); + assert!(!tsx.contains(", null]}"), "{tsx}"); + assert!(!tsx.contains("={[\"1\"]}"), "{tsx}"); +} diff --git a/crates/devup-mcp-devup-ui/tests/cropped_export_background.rs b/crates/devup-mcp-devup-ui/tests/cropped_export_background.rs index f171ac57..a1fbf867 100644 --- a/crates/devup-mcp-devup-ui/tests/cropped_export_background.rs +++ b/crates/devup-mcp-devup-ui/tests/cropped_export_background.rs @@ -93,7 +93,7 @@ fn cropped_export_background_maps_to_its_actual_fill_and_asset() { let mut wrong = output.clone(); wrong.tsx = wrong .tsx - .replace("/images/Portrait-1.png", "/images/unrelated.png"); + .replace("/images/portrait-1.png", "/images/unrelated.png"); let report = devup_mcp_devup_ui::provenance::validate_fidelity(&snapshot, "picture", &wrong).unwrap(); assert!(!report.assets.complete()); diff --git a/crates/devup-mcp-devup-ui/tests/feedback_component_set.rs b/crates/devup-mcp-devup-ui/tests/feedback_component_set.rs new file mode 100644 index 00000000..8a225818 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/feedback_component_set.rs @@ -0,0 +1,97 @@ +use devup_mcp_devup_ui::codegen::{CodegenOptions, generate_component}; +use devup_mcp_figma::Snapshot; +use serde_json::json; + +#[test] +fn component_set_exports_one_component_with_variant_and_text_props() { + let mut nodes = json!({ + "set": {"id":"set", "type":"COMPONENT_SET", "fields": { + "name":"Button", "width":900, "height":600, + "childrenIds":["small", "large"], + "componentPropertyDefinitions": { + "size":{"type":"VARIANT", "defaultValue":"sm", "variantOptions":["sm","md"]}, + "label#1":{"type":"TEXT", "defaultValue":"Submit"} + } + }, "extra":{}, "fieldErrors":{}} + }); + for (id, size, width) in [("small", "sm", 80), ("large", "md", 120)] { + let text = format!("{id}-text"); + nodes[id] = json!({"id":id,"type":"COMPONENT","fields":{ + "name":format!("size={size}"), "parentId":"set", "width":width,"height":40, + "layoutSizingHorizontal":"FIXED", "layoutSizingVertical":"FIXED", + "variantProperties":{"size":size},"childrenIds":[text] + },"extra":{},"fieldErrors":{}}); + nodes[&text] = json!({"id":text,"type":"TEXT","fields":{ + "parentId":id,"characters":"Submit","width":60,"height":20, + "componentPropertyReferences":{"characters":"label#1"} + },"extra":{},"fieldErrors":{}}); + } + let snapshot: Snapshot = serde_json::from_value(json!({ + "fileKey":"FileKey123","version":"v1","roots":["set"],"nodes":nodes,"diagnostics":[] + })) + .unwrap(); + let output = generate_component(&snapshot, "set", &CodegenOptions::default()).unwrap(); + assert_eq!( + output.tsx.matches("export function Button").count(), + 1, + "{}", + output.tsx + ); + assert!(output.tsx.contains("size:"), "{}", output.tsx); + assert!(output.tsx.contains("label?: string"), "{}", output.tsx); + assert!(output.tsx.contains("{label}"), "{}", output.tsx); + assert!(!output.tsx.contains("900px"), "{}", output.tsx); + assert!(output.tsx.contains("[size]"), "{}", output.tsx); +} + +#[test] +fn interaction_state_variants_become_pseudo_styles() { + let snapshot: Snapshot = serde_json::from_value(json!({ + "fileKey":"FileKey123","version":"v1","roots":["set"],"diagnostics":[], + "nodes":{ + "set":{"id":"set","type":"COMPONENT_SET","fields":{ + "name":"Button","childrenIds":["default","hover"], + "componentPropertyDefinitions":{"State":{"type":"VARIANT","defaultValue":"Default","variantOptions":["Default","Hover"]}} + },"extra":{},"fieldErrors":{}}, + "default":{"id":"default","type":"COMPONENT","fields":{ + "name":"State=Default","variantProperties":{"State":"Default"}, + "fills":[{"type":"SOLID","color":{"r":1,"g":0,"b":0}}] + },"extra":{},"fieldErrors":{}}, + "hover":{"id":"hover","type":"COMPONENT","fields":{ + "name":"State=Hover","variantProperties":{"State":"Hover"}, + "fills":[{"type":"SOLID","color":{"r":0,"g":0,"b":1}}] + },"extra":{},"fieldErrors":{}} + } + })).unwrap(); + let output = generate_component(&snapshot, "set", &CodegenOptions::default()).unwrap(); + assert!(output.tsx.contains("_hover="), "{}", output.tsx); + assert!(!output.tsx.contains("State:"), "{}", output.tsx); +} + +#[test] +fn component_set_preserves_fixed_leaf_bar_height() { + let snapshot: Snapshot = serde_json::from_value(json!({ + "fileKey":"FileKey123","version":"v1","roots":["set"],"diagnostics":[], + "nodes":{ + "set":{"id":"set","type":"COMPONENT_SET","fields":{ + "name":"TechStep","childrenIds":["step"], + "componentPropertyDefinitions":{"step":{"type":"VARIANT","defaultValue":"one","variantOptions":["one"]}} + },"extra":{},"fieldErrors":{}}, + "step":{"id":"step","type":"COMPONENT","fields":{ + "name":"step=one","variantProperties":{"step":"one"}, + "layoutMode":"VERTICAL","width":200,"height":100,"childrenIds":["label","bar"] + },"extra":{},"fieldErrors":{}}, + "label":{"id":"label","type":"TEXT","fields":{ + "parentId":"step","characters":"Step one","width":80,"height":20 + },"extra":{},"fieldErrors":{}}, + "bar":{"id":"bar","type":"RECTANGLE","fields":{ + "parentId":"step","width":160,"height":4, + "layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED", + "fills":[{"type":"SOLID","color":{"r":1,"g":0,"b":0}}] + },"extra":{},"fieldErrors":{}} + } + })).unwrap(); + let output = generate_component(&snapshot, "set", &CodegenOptions::default()).unwrap(); + assert!(output.tsx.contains("h=\"4px\""), "{}", output.tsx); + assert!(output.tsx.contains("w=\"160px\""), "{}", output.tsx); +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_applications_card_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_applications_card_set.json new file mode 100644 index 00000000..e85241d2 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_applications_card_set.json @@ -0,0 +1,2120 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "81:12380" + ], + "nodes": { + "81:12375": { + "id": "81:12375", + "type": "TEXT", + "fields": { + "parentId": "81:12379", + "absoluteBoundingBox": { + "height": 34, + "width": 32, + "x": 8822, + "y": 10251 + }, + "absoluteRenderBounds": { + "height": 14.919921875, + "width": 18.9443359375, + "x": 8822.8798828125, + "y": 10260.2998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "01", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignVertical": "CENTER", + "textAutoResize": "NONE", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12376": { + "id": "81:12376", + "type": "FRAME", + "fields": { + "parentId": "81:12379", + "childrenIds": [ + "81:12377", + "81:12378" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 586, + "x": 8874, + "y": 10251 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 586, + "x": 8874, + "y": 10251 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 586, + "x": 52, + "y": 32 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12377": { + "id": "81:12377", + "type": "TEXT", + "fields": { + "parentId": "81:12376", + "absoluteBoundingBox": { + "height": 34, + "width": 586, + "x": 8874, + "y": 10251 + }, + "absoluteRenderBounds": { + "height": 21.671875, + "width": 212.6923828125, + "x": 8874.599609375, + "y": 10257.416015625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "신약 후보물질 스크리닝", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "신약 후보물질 스크리닝", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 586, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "신약 후보물질 스크리닝", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12378": { + "id": "81:12378", + "type": "TEXT", + "fields": { + "parentId": "81:12376", + "absoluteBoundingBox": { + "height": 24, + "width": 586, + "x": 8874, + "y": 10291 + }, + "absoluteRenderBounds": { + "height": 14.7197265625, + "width": 506.4794921875, + "x": 8874.84765625, + "y": 10296.0244140625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "염증 · 연골 분해 지표(IL-6, PGE2, MM", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 586, + "x": 0, + "y": 40, + "styledTextSegments": [ + { + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "end": 53, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12379": { + "id": "81:12379", + "type": "COMPONENT", + "fields": { + "parentId": "81:12380", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "81:12375", + "81:12376" + ], + "absoluteBoundingBox": { + "height": 129, + "width": 638, + "x": 8822, + "y": 10219 + }, + "absoluteRenderBounds": { + "height": 129, + "width": 638, + "x": 8822, + "y": 10219 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 129, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "effect=selected, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "selected", + "viewport": "Desktop" + }, + "visible": true, + "width": 638, + "x": 21, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12380": { + "id": "81:12380", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "81:12379", + "81:12381", + "81:12431", + "81:12426" + ], + "absoluteBoundingBox": { + "height": 572, + "width": 680, + "x": 8801, + "y": 10198 + }, + "absoluteRenderBounds": { + "height": 572, + "width": 680, + "x": 8801, + "y": 10198 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "selected", + "type": "VARIANT", + "variantOptions": [ + "selected", + "default" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "81:12379", + "$nodeType": "COMPONENT" + }, + "height": 572, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "ApplicationsCard", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 680, + "x": 131, + "y": 9160 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12381": { + "id": "81:12381", + "type": "COMPONENT", + "fields": { + "parentId": "81:12380", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "81:12382", + "81:12383" + ], + "absoluteBoundingBox": { + "height": 129, + "width": 638, + "x": 8822, + "y": 10368 + }, + "absoluteRenderBounds": { + "height": 129, + "width": 638, + "x": 8822, + "y": 10368 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 129, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "viewport": "Desktop" + }, + "visible": true, + "width": 638, + "x": 21, + "y": 170 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12382": { + "id": "81:12382", + "type": "TEXT", + "fields": { + "parentId": "81:12381", + "absoluteBoundingBox": { + "height": 34, + "width": 32, + "x": 8822, + "y": 10400 + }, + "absoluteRenderBounds": { + "height": 14.919921875, + "width": 18.9443359375, + "x": 8822.8798828125, + "y": 10409.2998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "01", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignVertical": "CENTER", + "textAutoResize": "NONE", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12383": { + "id": "81:12383", + "type": "FRAME", + "fields": { + "parentId": "81:12381", + "childrenIds": [ + "81:12384", + "81:12385" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 586, + "x": 8874, + "y": 10400 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 586, + "x": 8874, + "y": 10400 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 586, + "x": 52, + "y": 32 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12384": { + "id": "81:12384", + "type": "TEXT", + "fields": { + "parentId": "81:12383", + "absoluteBoundingBox": { + "height": 34, + "width": 586, + "x": 8874, + "y": 10400 + }, + "absoluteRenderBounds": { + "height": 21.671875, + "width": 212.6923828125, + "x": 8874.599609375, + "y": 10406.416015625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "신약 후보물질 스크리닝", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "신약 후보물질 스크리닝", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 586, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "신약 후보물질 스크리닝", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12385": { + "id": "81:12385", + "type": "TEXT", + "fields": { + "parentId": "81:12383", + "absoluteBoundingBox": { + "height": 24, + "width": 586, + "x": 8874, + "y": 10440 + }, + "absoluteRenderBounds": { + "height": 14.7197265625, + "width": 506.4794921875, + "x": 8874.84765625, + "y": 10445.0244140625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "염증 · 연골 분해 지표(IL-6, PGE2, MM", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 586, + "x": 0, + "y": 40, + "styledTextSegments": [ + { + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "end": 53, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12426": { + "id": "81:12426", + "type": "COMPONENT", + "fields": { + "parentId": "81:12380", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "81:12427", + "81:12428" + ], + "absoluteBoundingBox": { + "height": 106, + "width": 638, + "x": 8822, + "y": 10643 + }, + "absoluteRenderBounds": { + "height": 106, + "width": 638, + "x": 8822, + "y": 10643 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "viewport": "Mobile" + }, + "visible": true, + "width": 638, + "x": 21, + "y": 445 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12427": { + "id": "81:12427", + "type": "TEXT", + "fields": { + "parentId": "81:12426", + "absoluteBoundingBox": { + "height": 25, + "width": 32, + "x": 8842, + "y": 10667 + }, + "absoluteRenderBounds": { + "height": 13.4287109375, + "width": 17.0498046875, + "x": 8842.7919921875, + "y": 10672.76953125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 18, + "height": 25, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "01", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 20, + "y": 24, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12428": { + "id": "81:12428", + "type": "FRAME", + "fields": { + "parentId": "81:12426", + "childrenIds": [ + "81:12429", + "81:12430" + ], + "absoluteBoundingBox": { + "height": 57, + "width": 558, + "x": 8882, + "y": 10667 + }, + "absoluteRenderBounds": { + "height": 57, + "width": 558, + "x": 8882, + "y": 10667 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 57, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 558, + "x": 60, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12429": { + "id": "81:12429", + "type": "TEXT", + "fields": { + "parentId": "81:12428", + "absoluteBoundingBox": { + "height": 28, + "width": 558, + "x": 8882, + "y": 10667 + }, + "absoluteRenderBounds": { + "height": 18.060546875, + "width": 177.2431640625, + "x": 8882.5, + "y": 10671.6796875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "신약 후보물질 스크리닝", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "신약 후보물질 스크리닝", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 558, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "신약 후보물질 스크리닝", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12430": { + "id": "81:12430", + "type": "TEXT", + "fields": { + "parentId": "81:12428", + "absoluteBoundingBox": { + "height": 23, + "width": 558, + "x": 8882, + "y": 10701 + }, + "absoluteRenderBounds": { + "height": 13.7998046875, + "width": 474.82421875, + "x": 8882.794921875, + "y": 10705.8349609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "염증 · 연골 분해 지표(IL-6, PGE2, MM", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 558, + "x": 0, + "y": 34, + "styledTextSegments": [ + { + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "end": 53, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12431": { + "id": "81:12431", + "type": "COMPONENT", + "fields": { + "parentId": "81:12380", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "81:12432", + "81:12433" + ], + "absoluteBoundingBox": { + "height": 106, + "width": 638, + "x": 8822, + "y": 10517 + }, + "absoluteRenderBounds": { + "height": 106, + "width": 638, + "x": 8822, + "y": 10517 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 106, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=selected, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 24, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "selected", + "viewport": "Mobile" + }, + "visible": true, + "width": 638, + "x": 21, + "y": 319 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12432": { + "id": "81:12432", + "type": "TEXT", + "fields": { + "parentId": "81:12431", + "absoluteBoundingBox": { + "height": 25, + "width": 32, + "x": 8842, + "y": 10541 + }, + "absoluteRenderBounds": { + "height": 13.4287109375, + "width": 17.0498046875, + "x": 8842.7919921875, + "y": 10546.76953125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 18, + "height": 25, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "01", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 20, + "y": 24, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12433": { + "id": "81:12433", + "type": "FRAME", + "fields": { + "parentId": "81:12431", + "childrenIds": [ + "81:12434", + "81:12435" + ], + "absoluteBoundingBox": { + "height": 57, + "width": 558, + "x": 8882, + "y": 10541 + }, + "absoluteRenderBounds": { + "height": 57, + "width": 558, + "x": 8882, + "y": 10541 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 57, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 558, + "x": 60, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12434": { + "id": "81:12434", + "type": "TEXT", + "fields": { + "parentId": "81:12433", + "absoluteBoundingBox": { + "height": 28, + "width": 558, + "x": 8882, + "y": 10541 + }, + "absoluteRenderBounds": { + "height": 18.060546875, + "width": 177.2431640625, + "x": 8882.5, + "y": 10545.6796875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "신약 후보물질 스크리닝", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "신약 후보물질 스크리닝", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 558, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "신약 후보물질 스크리닝", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "81:12435": { + "id": "81:12435", + "type": "TEXT", + "fields": { + "parentId": "81:12433", + "absoluteBoundingBox": { + "height": 23, + "width": 558, + "x": 8882, + "y": 10575 + }, + "absoluteRenderBounds": { + "height": 13.7998046875, + "width": 474.82421875, + "x": 8882.794921875, + "y": 10579.8349609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "염증 · 연골 분해 지표(IL-6, PGE2, MM", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 558, + "x": 0, + "y": 34, + "styledTextSegments": [ + { + "characters": "염증 · 연골 분해 지표(IL-6, PGE2, MMP-13 등)로 후보물질의 효능을 평가합니다.", + "end": 53, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_board_row_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_board_row_set.json new file mode 100644 index 00000000..c84f0007 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_board_row_set.json @@ -0,0 +1,5732 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "73:5583" + ], + "nodes": { + "73:5583": { + "id": "73:5583", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "73:5584", + "73:5591", + "73:6001", + "73:6022", + "73:7420", + "73:7427" + ], + "absoluteBoundingBox": { + "height": 666, + "width": 1328, + "x": 8801, + "y": 8606 + }, + "absoluteRenderBounds": { + "height": 666, + "width": 1328, + "x": 8801, + "y": 8606 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + }, + "pinned": { + "defaultValue": "false", + "type": "VARIANT", + "variantOptions": [ + "false", + "true" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + }, + "등록일#47:103": { + "defaultValue": "2026. 09. 01", + "type": "TEXT" + }, + "번호#47:97": { + "defaultValue": "11", + "type": "TEXT" + }, + "제목#47:100": { + "defaultValue": "공지 제목이 들어갑니다", + "type": "TEXT" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "73:5584", + "$nodeType": "COMPONENT" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 666, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "BoardRow", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1328, + "x": 131, + "y": 7568 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5584": { + "id": "73:5584", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:5585", + "73:5587", + "73:5589" + ], + "absoluteBoundingBox": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8630 + }, + "absoluteRenderBounds": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8630 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 74, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=false, effect=default, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "pinned": "false", + "viewport": "Desktop" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5585": { + "id": "73:5585", + "type": "FRAME", + "fields": { + "parentId": "73:5584", + "childrenIds": [ + "73:5586" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8655 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8655 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "num", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 96, + "x": 0, + "y": 25 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5586": { + "id": "73:5586", + "type": "TEXT", + "fields": { + "parentId": "73:5585", + "absoluteBoundingBox": { + "height": 23, + "width": 12, + "x": 8867, + "y": 8655 + }, + "absoluteRenderBounds": { + "height": 10.8447265625, + "width": 9.7451171875, + "x": 8867.6904296875, + "y": 8661.169921875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "11", + "componentPropertyReferences": { + "characters": "번호#47:97" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 12, + "x": 42, + "y": 0, + "styledTextSegments": [ + { + "characters": "11", + "end": 2, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5587": { + "id": "73:5587", + "type": "FRAME", + "fields": { + "parentId": "73:5584", + "childrenIds": [ + "73:5588" + ], + "absoluteBoundingBox": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8652 + }, + "absoluteRenderBounds": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8652 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 29, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "title wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1024, + "x": 96, + "y": 22 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5588": { + "id": "73:5588", + "type": "TEXT", + "fields": { + "parentId": "73:5587", + "absoluteBoundingBox": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8652 + }, + "absoluteRenderBounds": { + "height": 15.9658203125, + "width": 160.7421875, + "x": 8921.666015625, + "y": 8658.4560546875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 18, + "height": 29, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1024, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5589": { + "id": "73:5589", + "type": "FRAME", + "fields": { + "parentId": "73:5584", + "childrenIds": [ + "73:5590" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8656 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8656 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 21, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 1120, + "y": 26 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5590": { + "id": "73:5590", + "type": "TEXT", + "fields": { + "parentId": "73:5589", + "absoluteBoundingBox": { + "height": 21, + "width": 75, + "x": 9987.5, + "y": 8656 + }, + "absoluteRenderBounds": { + "height": 10.416015625, + "width": 71.953125, + "x": 9988.2841796875, + "y": 8661.765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 75, + "x": 42.5, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5591": { + "id": "73:5591", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:5592", + "73:5594", + "73:5598" + ], + "absoluteBoundingBox": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8720 + }, + "absoluteRenderBounds": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8720 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 74, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=true, effect=default, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "pinned": "true", + "viewport": "Desktop" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 114 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5592": { + "id": "73:5592", + "type": "FRAME", + "fields": { + "parentId": "73:5591", + "childrenIds": [ + "73:5593" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8745 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8745 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "num", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 96, + "x": 0, + "y": 25 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5593": { + "id": "73:5593", + "type": "TEXT", + "fields": { + "parentId": "73:5592", + "absoluteBoundingBox": { + "height": 23, + "width": 12, + "x": 8867, + "y": 8745 + }, + "absoluteRenderBounds": { + "height": 10.8447265625, + "width": 9.7451171875, + "x": 8867.6904296875, + "y": 8751.169921875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "11", + "componentPropertyReferences": { + "characters": "번호#47:97" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 12, + "x": 42, + "y": 0, + "styledTextSegments": [ + { + "characters": "11", + "end": 2, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5594": { + "id": "73:5594", + "type": "FRAME", + "fields": { + "parentId": "73:5591", + "childrenIds": [ + "73:5596", + "73:5597" + ], + "absoluteBoundingBox": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8742 + }, + "absoluteRenderBounds": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8742 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 29, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "title wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1024, + "x": 96, + "y": 22 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5596": { + "id": "73:5596", + "type": "INSTANCE", + "fields": { + "parentId": "73:5594", + "childrenIds": [ + "I73:5596;73:6826", + "I73:5596;32:362" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 59, + "x": 8921, + "y": 8742.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 59, + "x": 8921, + "y": 8742.5 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pin tag", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 59, + "x": 0, + "y": 0.5, + "mainComponentId": "32:368", + "mainComponentName": "noticeTag", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5597": { + "id": "73:5597", + "type": "TEXT", + "fields": { + "parentId": "73:5594", + "absoluteBoundingBox": { + "height": 29, + "width": 955, + "x": 8990, + "y": 8742 + }, + "absoluteRenderBounds": { + "height": 16.2548828125, + "width": 160.9228515625, + "x": 8990.576171875, + "y": 8748.3115234375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 18, + "height": 29, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06,", + "textTruncation": "DISABLED", + "visible": true, + "width": 955, + "x": 69, + "y": 0, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5598": { + "id": "73:5598", + "type": "FRAME", + "fields": { + "parentId": "73:5591", + "childrenIds": [ + "73:5599" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8746 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8746 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 21, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 1120, + "y": 26 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:5599": { + "id": "73:5599", + "type": "TEXT", + "fields": { + "parentId": "73:5598", + "absoluteBoundingBox": { + "height": 21, + "width": 75, + "x": 9987.5, + "y": 8746 + }, + "absoluteRenderBounds": { + "height": 10.416015625, + "width": 71.953125, + "x": 9988.2841796875, + "y": 8751.765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 75, + "x": 42.5, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6001": { + "id": "73:6001", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:6002", + "73:6013", + "73:6008" + ], + "absoluteBoundingBox": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8810 + }, + "absoluteRenderBounds": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 74, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=false, effect=hover, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "hover", + "pinned": "false", + "viewport": "Desktop" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 204 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6002": { + "id": "73:6002", + "type": "FRAME", + "fields": { + "parentId": "73:6001", + "childrenIds": [ + "73:6003" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8835 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8835 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "num", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 96, + "x": 0, + "y": 25 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6003": { + "id": "73:6003", + "type": "TEXT", + "fields": { + "parentId": "73:6002", + "absoluteBoundingBox": { + "height": 23, + "width": 12, + "x": 8867, + "y": 8835 + }, + "absoluteRenderBounds": { + "height": 10.8447265625, + "width": 9.7451171875, + "x": 8867.6904296875, + "y": 8841.169921875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "11", + "componentPropertyReferences": { + "characters": "번호#47:97" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 12, + "x": 42, + "y": 0, + "styledTextSegments": [ + { + "characters": "11", + "end": 2, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6008": { + "id": "73:6008", + "type": "FRAME", + "fields": { + "parentId": "73:6001", + "childrenIds": [ + "73:6009" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8836 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8836 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 21, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 1120, + "y": 26 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6009": { + "id": "73:6009", + "type": "TEXT", + "fields": { + "parentId": "73:6008", + "absoluteBoundingBox": { + "height": 21, + "width": 75, + "x": 9987.5, + "y": 8836 + }, + "absoluteRenderBounds": { + "height": 10.416015625, + "width": 71.953125, + "x": 9988.2841796875, + "y": 8841.765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 75, + "x": 42.5, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6013": { + "id": "73:6013", + "type": "TEXT", + "fields": { + "parentId": "73:6001", + "absoluteBoundingBox": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8832 + }, + "absoluteRenderBounds": { + "height": 15.9658203125, + "width": 160.7421875, + "x": 8921.666015625, + "y": 8838.4560546875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 18, + "height": 29, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1024, + "x": 96, + "y": 22, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6022": { + "id": "73:6022", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:6023", + "73:6025", + "73:6028" + ], + "absoluteBoundingBox": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8900 + }, + "absoluteRenderBounds": { + "height": 74, + "width": 1280, + "x": 8825, + "y": 8900 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 0.9715099334716796, + "r": 0.9487178325653076 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 74, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=true, effect=hover, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 22, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 22, + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "hover", + "pinned": "true", + "viewport": "Desktop" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 294 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6023": { + "id": "73:6023", + "type": "FRAME", + "fields": { + "parentId": "73:6022", + "childrenIds": [ + "73:6024" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8925 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 96, + "x": 8825, + "y": 8925 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "num", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 96, + "x": 0, + "y": 25 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6024": { + "id": "73:6024", + "type": "TEXT", + "fields": { + "parentId": "73:6023", + "absoluteBoundingBox": { + "height": 23, + "width": 12, + "x": 8867, + "y": 8925 + }, + "absoluteRenderBounds": { + "height": 10.8447265625, + "width": 9.7451171875, + "x": 8867.6904296875, + "y": 8931.169921875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "11", + "componentPropertyReferences": { + "characters": "번호#47:97" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 12, + "x": 42, + "y": 0, + "styledTextSegments": [ + { + "characters": "11", + "end": 2, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6025": { + "id": "73:6025", + "type": "FRAME", + "fields": { + "parentId": "73:6022", + "childrenIds": [ + "73:6026", + "73:6027" + ], + "absoluteBoundingBox": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8922 + }, + "absoluteRenderBounds": { + "height": 29, + "width": 1024, + "x": 8921, + "y": 8922 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 29, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "title wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1024, + "x": 96, + "y": 22 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6026": { + "id": "73:6026", + "type": "INSTANCE", + "fields": { + "parentId": "73:6025", + "childrenIds": [ + "I73:6026;73:6826", + "I73:6026;32:362" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 59, + "x": 8921, + "y": 8922.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 59, + "x": 8921, + "y": 8922.5 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pin tag", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 59, + "x": 0, + "y": 0.5, + "mainComponentId": "32:368", + "mainComponentName": "noticeTag", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6027": { + "id": "73:6027", + "type": "TEXT", + "fields": { + "parentId": "73:6025", + "absoluteBoundingBox": { + "height": 29, + "width": 955, + "x": 8990, + "y": 8922 + }, + "absoluteRenderBounds": { + "height": 16.2548828125, + "width": 160.9228515625, + "x": 8990.576171875, + "y": 8928.3115234375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 18, + "height": 29, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06,", + "textTruncation": "DISABLED", + "visible": true, + "width": 955, + "x": 69, + "y": 0, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6028": { + "id": "73:6028", + "type": "FRAME", + "fields": { + "parentId": "73:6022", + "childrenIds": [ + "73:6029" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8926 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 160, + "x": 9945, + "y": 8926 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 21, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 1120, + "y": 26 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6029": { + "id": "73:6029", + "type": "TEXT", + "fields": { + "parentId": "73:6028", + "absoluteBoundingBox": { + "height": 21, + "width": 75, + "x": 9987.5, + "y": 8926 + }, + "absoluteRenderBounds": { + "height": 10.416015625, + "width": 71.953125, + "x": 9988.2841796875, + "y": 8931.765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 75, + "x": 42.5, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7420": { + "id": "73:7420", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:7423", + "73:7425" + ], + "absoluteBoundingBox": { + "height": 103, + "width": 1280, + "x": 8825, + "y": 8990 + }, + "absoluteRenderBounds": { + "height": 103, + "width": 1280, + "x": 8825, + "y": 8990 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 103, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 24, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=false, effect=default, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 24, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "pinned": "false", + "viewport": "Mobile" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 384 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7423": { + "id": "73:7423", + "type": "FRAME", + "fields": { + "parentId": "73:7420", + "childrenIds": [ + "73:7424" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 1280, + "x": 8825, + "y": 9014 + }, + "absoluteRenderBounds": { + "height": 26, + "width": 1280, + "x": 8825, + "y": 9014 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "title wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 0, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7424": { + "id": "73:7424", + "type": "TEXT", + "fields": { + "parentId": "73:7423", + "absoluteBoundingBox": { + "height": 26, + "width": 1280, + "x": 8825, + "y": 9014 + }, + "absoluteRenderBounds": { + "height": 14.19140625, + "width": 142.8828125, + "x": 8825.591796875, + "y": 9020.072265625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "SemiBold" + }, + "fontSize": 16, + "height": 26, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1280, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 600, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:39037a8c63dc0865f4023ee82afa65f8f6888f1a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7425": { + "id": "73:7425", + "type": "FRAME", + "fields": { + "parentId": "73:7420", + "childrenIds": [ + "73:7426" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 1280, + "x": 8825, + "y": 9048 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 1280, + "x": 8825, + "y": 9048 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 20, + "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" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 0, + "y": 58 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7426": { + "id": "73:7426", + "type": "TEXT", + "fields": { + "parentId": "73:7425", + "absoluteBoundingBox": { + "height": 20, + "width": 69, + "x": 8825, + "y": 9048 + }, + "absoluteRenderBounds": { + "height": 9.671875, + "width": 66.814453125, + "x": 8825.7275390625, + "y": 9053.4970703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 69, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7427": { + "id": "73:7427", + "type": "COMPONENT", + "fields": { + "parentId": "73:5583", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:7430", + "73:7433" + ], + "absoluteBoundingBox": { + "height": 139, + "width": 1280, + "x": 8825, + "y": 9109 + }, + "absoluteRenderBounds": { + "height": 139, + "width": 1280, + "x": 8825, + "y": 9109 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 139, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 24, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pinned=true, effect=default, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 24, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default", + "pinned": "true", + "viewport": "Mobile" + }, + "visible": true, + "width": 1280, + "x": 24, + "y": 503 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7430": { + "id": "73:7430", + "type": "FRAME", + "fields": { + "parentId": "73:7427", + "childrenIds": [ + "73:7431", + "73:7432" + ], + "absoluteBoundingBox": { + "height": 62, + "width": 1280, + "x": 8825, + "y": 9133 + }, + "absoluteRenderBounds": { + "height": 62, + "width": 1280, + "x": 8825, + "y": 9133 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 62, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "title wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 0, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7431": { + "id": "73:7431", + "type": "INSTANCE", + "fields": { + "parentId": "73:7430", + "childrenIds": [ + "I73:7431;73:6826", + "I73:7431;32:362" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 59, + "x": 8825, + "y": 9133 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 59, + "x": 8825, + "y": 9133 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "pin tag", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 4, + "paddingLeft": 8, + "paddingRight": 10, + "paddingTop": 4, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "visible": true, + "width": 59, + "x": 0, + "y": 0, + "mainComponentId": "32:368", + "mainComponentName": "noticeTag", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7432": { + "id": "73:7432", + "type": "TEXT", + "fields": { + "parentId": "73:7430", + "absoluteBoundingBox": { + "height": 26, + "width": 1280, + "x": 8825, + "y": 9169 + }, + "absoluteRenderBounds": { + "height": 14.447265625, + "width": 143.04296875, + "x": 8825.51171875, + "y": 9174.9443359375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공지 제목이 들어갑니다", + "componentPropertyReferences": { + "characters": "제목#47:100" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 16, + "height": 26, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1280, + "x": 0, + "y": 36, + "styledTextSegments": [ + { + "characters": "공지 제목이 들어갑니다", + "end": 12, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:7394fa3e4417d5710756b2f56d83e6105d173d06," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7433": { + "id": "73:7433", + "type": "FRAME", + "fields": { + "parentId": "73:7427", + "childrenIds": [ + "73:7434" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 1280, + "x": 8825, + "y": 9203 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 1280, + "x": 8825, + "y": 9203 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 20, + "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" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "date wrap", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 0, + "y": 94 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:7434": { + "id": "73:7434", + "type": "TEXT", + "fields": { + "parentId": "73:7433", + "absoluteBoundingBox": { + "height": 20, + "width": 69, + "x": 8825, + "y": 9203 + }, + "absoluteRenderBounds": { + "height": 9.671875, + "width": 66.814453125, + "x": 8825.7275390625, + "y": 9208.4970703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "2026. 09. 01", + "componentPropertyReferences": { + "characters": "등록일#47:103" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "date", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 69, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "2026. 09. 01", + "end": 12, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;32:362": { + "id": "I73:5596;32:362", + "type": "TEXT", + "fields": { + "parentId": "73:5596", + "absoluteBoundingBox": { + "height": 20, + "width": 23, + "x": 8947, + "y": 8746.5 + }, + "absoluteRenderBounds": { + "height": 11.21875, + "width": 21.697265625, + "x": 8947.3896484375, + "y": 8751.3994140625 + }, + "characters": "중요", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "중요", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259,", + "textTruncation": "DISABLED", + "visible": true, + "width": 23, + "x": 26, + "y": 4, + "styledTextSegments": [ + { + "characters": "중요", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826": { + "id": "I73:5596;73:6826", + "type": "INSTANCE", + "fields": { + "parentId": "73:5596", + "childrenIds": [ + "I73:5596;73:6826;73:6818" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 8929, + "y": 8750.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 8929, + "y": 8750.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.4997005462646485, + "paddingLeft": 0.5, + "paddingRight": 0.4995241165161133, + "paddingTop": 0.5, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "megaphone", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 12, + "x": 8, + "y": 8, + "mainComponentId": "73:6825", + "mainComponentName": "megaphone", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6818": { + "id": "I73:5596;73:6826;73:6818", + "type": "GROUP", + "fields": { + "parentId": "I73:5596;73:6826", + "childrenIds": [ + "I73:5596;73:6826;73:6819", + "I73:5596;73:6826;73:6821", + "I73:5596;73:6826;73:6823" + ], + "absoluteBoundingBox": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8929.5, + "y": 8751 + }, + "absoluteRenderBounds": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8929.5, + "y": 8751 + }, + "height": 11.000299453735352, + "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": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 11.000475883483888, + "x": 0.5, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6819": { + "id": "I73:5596;73:6826;73:6819", + "type": "GROUP", + "fields": { + "parentId": "I73:5596;73:6826;73:6818", + "childrenIds": [ + "I73:5596;73:6826;73:6820" + ], + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8751.6591796875 + }, + "absoluteRenderBounds": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8751.6591796875 + }, + "height": 7.182965278625488, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6820": { + "id": "I73:5596;73:6826;73:6820", + "type": "VECTOR", + "fields": { + "parentId": "I73:5596;73:6826;73:6819", + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8751.6591796875 + }, + "absoluteRenderBounds": { + "height": 7.1826171875, + "width": 8.283203125, + "x": 8929.5, + "y": 8751.6591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 7.182965278625488, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6821": { + "id": "I73:5596;73:6826;73:6821", + "type": "GROUP", + "fields": { + "parentId": "I73:5596;73:6826;73:6818", + "childrenIds": [ + "I73:5596;73:6826;73:6822" + ], + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8757.4892578125 + }, + "absoluteRenderBounds": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8757.4892578125 + }, + "height": 4.511041164398193, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6822": { + "id": "I73:5596;73:6826;73:6822", + "type": "VECTOR", + "fields": { + "parentId": "I73:5596;73:6826;73:6821", + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8757.4892578125 + }, + "absoluteRenderBounds": { + "height": 4.5107421875, + "width": 3.7822265625, + "x": 8930.4052734375, + "y": 8757.4892578125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 4.511041164398193, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6823": { + "id": "I73:5596;73:6826;73:6823", + "type": "GROUP", + "fields": { + "parentId": "I73:5596;73:6826;73:6818", + "childrenIds": [ + "I73:5596;73:6826;73:6824" + ], + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8751 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8751 + }, + "height": 8.501578330993652, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:5596;73:6826;73:6824": { + "id": "I73:5596;73:6826;73:6824", + "type": "VECTOR", + "fields": { + "parentId": "I73:5596;73:6826;73:6823", + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8751 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.01171875, + "x": 8938.48828125, + "y": 8751 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.501578330993652, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;32:362": { + "id": "I73:6026;32:362", + "type": "TEXT", + "fields": { + "parentId": "73:6026", + "absoluteBoundingBox": { + "height": 20, + "width": 23, + "x": 8947, + "y": 8926.5 + }, + "absoluteRenderBounds": { + "height": 11.21875, + "width": 21.697265625, + "x": 8947.3896484375, + "y": 8931.3994140625 + }, + "characters": "중요", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "중요", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259,", + "textTruncation": "DISABLED", + "visible": true, + "width": 23, + "x": 26, + "y": 4, + "styledTextSegments": [ + { + "characters": "중요", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826": { + "id": "I73:6026;73:6826", + "type": "INSTANCE", + "fields": { + "parentId": "73:6026", + "childrenIds": [ + "I73:6026;73:6826;73:6818" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 8929, + "y": 8930.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 8929, + "y": 8930.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.4997005462646485, + "paddingLeft": 0.5, + "paddingRight": 0.4995241165161133, + "paddingTop": 0.5, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "megaphone", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 12, + "x": 8, + "y": 8, + "mainComponentId": "73:6825", + "mainComponentName": "megaphone", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6818": { + "id": "I73:6026;73:6826;73:6818", + "type": "GROUP", + "fields": { + "parentId": "I73:6026;73:6826", + "childrenIds": [ + "I73:6026;73:6826;73:6819", + "I73:6026;73:6826;73:6821", + "I73:6026;73:6826;73:6823" + ], + "absoluteBoundingBox": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8929.5, + "y": 8931 + }, + "absoluteRenderBounds": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8929.5, + "y": 8931 + }, + "height": 11.000299453735352, + "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": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 11.000475883483888, + "x": 0.5, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6819": { + "id": "I73:6026;73:6826;73:6819", + "type": "GROUP", + "fields": { + "parentId": "I73:6026;73:6826;73:6818", + "childrenIds": [ + "I73:6026;73:6826;73:6820" + ], + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8931.6591796875 + }, + "absoluteRenderBounds": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8931.6591796875 + }, + "height": 7.182965278625488, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6820": { + "id": "I73:6026;73:6826;73:6820", + "type": "VECTOR", + "fields": { + "parentId": "I73:6026;73:6826;73:6819", + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8929.5, + "y": 8931.6591796875 + }, + "absoluteRenderBounds": { + "height": 7.1826171875, + "width": 8.283203125, + "x": 8929.5, + "y": 8931.6591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 7.182965278625488, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6821": { + "id": "I73:6026;73:6826;73:6821", + "type": "GROUP", + "fields": { + "parentId": "I73:6026;73:6826;73:6818", + "childrenIds": [ + "I73:6026;73:6826;73:6822" + ], + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8937.4892578125 + }, + "absoluteRenderBounds": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8937.4892578125 + }, + "height": 4.511041164398193, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6822": { + "id": "I73:6026;73:6826;73:6822", + "type": "VECTOR", + "fields": { + "parentId": "I73:6026;73:6826;73:6821", + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8930.4052734375, + "y": 8937.4892578125 + }, + "absoluteRenderBounds": { + "height": 4.5107421875, + "width": 3.7822265625, + "x": 8930.4052734375, + "y": 8937.4892578125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 4.511041164398193, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6823": { + "id": "I73:6026;73:6826;73:6823", + "type": "GROUP", + "fields": { + "parentId": "I73:6026;73:6826;73:6818", + "childrenIds": [ + "I73:6026;73:6826;73:6824" + ], + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8931 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8931 + }, + "height": 8.501578330993652, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6026;73:6826;73:6824": { + "id": "I73:6026;73:6826;73:6824", + "type": "VECTOR", + "fields": { + "parentId": "I73:6026;73:6826;73:6823", + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8938.48828125, + "y": 8931 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.01171875, + "x": 8938.48828125, + "y": 8931 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.501578330993652, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;32:362": { + "id": "I73:7431;32:362", + "type": "TEXT", + "fields": { + "parentId": "73:7431", + "absoluteBoundingBox": { + "height": 20, + "width": 23, + "x": 8851, + "y": 9137 + }, + "absoluteRenderBounds": { + "height": 11.21875, + "width": 21.697265625, + "x": 8851.3896484375, + "y": 9141.8994140625 + }, + "characters": "중요", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "중요", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259,", + "textTruncation": "DISABLED", + "visible": true, + "width": 23, + "x": 26, + "y": 4, + "styledTextSegments": [ + { + "characters": "중요", + "end": 2, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:6ff02d889b5b4f9b91a3306f15c43ad1d19ee259," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826": { + "id": "I73:7431;73:6826", + "type": "INSTANCE", + "fields": { + "parentId": "73:7431", + "childrenIds": [ + "I73:7431;73:6826;73:6818" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 8833, + "y": 9141 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 8833, + "y": 9141 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.4997005462646485, + "paddingLeft": 0.5, + "paddingRight": 0.4995241165161133, + "paddingTop": 0.5, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "megaphone", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 512, + "y": 512 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 12, + "x": 8, + "y": 8, + "mainComponentId": "73:6825", + "mainComponentName": "megaphone", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6818": { + "id": "I73:7431;73:6826;73:6818", + "type": "GROUP", + "fields": { + "parentId": "I73:7431;73:6826", + "childrenIds": [ + "I73:7431;73:6826;73:6819", + "I73:7431;73:6826;73:6821", + "I73:7431;73:6826;73:6823" + ], + "absoluteBoundingBox": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8833.5, + "y": 9141.5 + }, + "absoluteRenderBounds": { + "height": 11.000299453735352, + "width": 11.000475883483888, + "x": 8833.5, + "y": 9141.5 + }, + "height": 11.000299453735352, + "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": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 11.000475883483888, + "x": 0.5, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6819": { + "id": "I73:7431;73:6826;73:6819", + "type": "GROUP", + "fields": { + "parentId": "I73:7431;73:6826;73:6818", + "childrenIds": [ + "I73:7431;73:6826;73:6820" + ], + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8833.5, + "y": 9142.1591796875 + }, + "absoluteRenderBounds": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8833.5, + "y": 9142.1591796875 + }, + "height": 7.182965278625488, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6820": { + "id": "I73:7431;73:6826;73:6820", + "type": "VECTOR", + "fields": { + "parentId": "I73:7431;73:6826;73:6819", + "absoluteBoundingBox": { + "height": 7.182965278625488, + "width": 8.283529281616211, + "x": 8833.5, + "y": 9142.1591796875 + }, + "absoluteRenderBounds": { + "height": 7.1826171875, + "width": 8.283203125, + "x": 8833.5, + "y": 9142.1591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 7.182965278625488, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 8.283529281616211, + "x": 0.5, + "y": 1.1593017578125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6821": { + "id": "I73:7431;73:6826;73:6821", + "type": "GROUP", + "fields": { + "parentId": "I73:7431;73:6826;73:6818", + "childrenIds": [ + "I73:7431;73:6826;73:6822" + ], + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8834.4052734375, + "y": 9147.9892578125 + }, + "absoluteRenderBounds": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8834.4052734375, + "y": 9147.9892578125 + }, + "height": 4.511041164398193, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6822": { + "id": "I73:7431;73:6826;73:6822", + "type": "VECTOR", + "fields": { + "parentId": "I73:7431;73:6826;73:6821", + "absoluteBoundingBox": { + "height": 4.511041164398193, + "width": 3.78228759765625, + "x": 8834.4052734375, + "y": 9147.9892578125 + }, + "absoluteRenderBounds": { + "height": 4.5107421875, + "width": 3.7822265625, + "x": 8834.4052734375, + "y": 9147.9892578125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 4.511041164398193, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 3.78228759765625, + "x": 1.4054877758026123, + "y": 6.9888916015625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6823": { + "id": "I73:7431;73:6826;73:6823", + "type": "GROUP", + "fields": { + "parentId": "I73:7431;73:6826;73:6818", + "childrenIds": [ + "I73:7431;73:6826;73:6824" + ], + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8842.48828125, + "y": 9141.5 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.0121943950653076, + "x": 8842.48828125, + "y": 9141.5 + }, + "height": 8.501578330993652, + "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" + }, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:7431;73:6826;73:6824": { + "id": "I73:7431;73:6826;73:6824", + "type": "VECTOR", + "fields": { + "parentId": "I73:7431;73:6826;73:6823", + "absoluteBoundingBox": { + "height": 8.501578330993652, + "width": 2.0121943950653076, + "x": 8842.48828125, + "y": 9141.5 + }, + "absoluteRenderBounds": { + "height": 8.501953125, + "width": 2.01171875, + "x": 8842.48828125, + "y": 9141.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.501578330993652, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 15.058823585510254, + "visible": true, + "width": 2.0121943950653076, + "x": 9.487805366516112, + "y": 0.5 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_button_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_button_set.json new file mode 100644 index 00000000..7c5905dc --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_button_set.json @@ -0,0 +1,12500 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "23:1613" + ], + "nodes": { + "23:1610": { + "id": "23:1610", + "type": "TEXT", + "fields": { + "parentId": "23:1612", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8808, + "y": 1931 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8808.9384765625, + "y": 1935.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1612": { + "id": "23:1612", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "23:1610", + "23:1620" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 8796, + "y": 1925 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 8796, + "y": 1925 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 4, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=primary, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "sm", + "type": "primary" + }, + "visible": true, + "width": 84, + "x": 21, + "y": 281 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1613": { + "id": "23:1613", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "23:1612", + "23:1634", + "23:1642", + "24:1665", + "24:1659", + "24:1662", + "24:1853", + "24:1856", + "24:1859", + "24:1865", + "24:1862", + "24:1868", + "24:1871", + "24:1933", + "24:1940", + "30:368", + "30:371", + "30:374", + "30:377", + "30:383", + "30:399", + "30:402", + "30:415", + "30:421", + "30:508", + "30:511", + "30:514", + "30:517", + "30:496", + "30:499", + "30:505", + "30:502" + ], + "absoluteBoundingBox": { + "height": 486, + "width": 554, + "x": 8775, + "y": 1644 + }, + "absoluteRenderBounds": { + "height": 486, + "width": 554, + "x": 8775, + "y": 1644 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "hover", + "active", + "disabled" + ] + }, + "rightIcon#23:2": { + "defaultValue": true, + "type": "BOOLEAN" + }, + "size": { + "defaultValue": "md", + "type": "VARIANT", + "variantOptions": [ + "sm", + "md" + ] + }, + "type": { + "defaultValue": "primary", + "type": "VARIANT", + "variantOptions": [ + "white", + "primary", + "white-line", + "ghost" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "24:1853", + "$nodeType": "COMPONENT" + }, + "gridColumnCount": 4, + "gridColumnGap": 16, + "gridColumnSizes": [ + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + } + ], + "gridRowCount": 8, + "gridRowGap": 16, + "gridRowSizes": [ + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + }, + { + "type": "HUG", + "value": 1 + } + ], + "height": 486, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "GRID", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "button", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 554, + "x": 105, + "y": 606 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1620": { + "id": "23:1620", + "type": "INSTANCE", + "fields": { + "parentId": "23:1612", + "childrenIds": [ + "I23:1620;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8852, + "y": 1933.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8852, + "y": 1933.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1634": { + "id": "23:1634", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "23:1635", + "23:1636" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 8928, + "y": 1925 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 8928, + "y": 1925 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6078431606292725, + "g": 0.2823529541492462, + "r": 0.003921568859368563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 4, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=primary, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover", + "size": "sm", + "type": "primary" + }, + "visible": true, + "width": 84, + "x": 153, + "y": 281 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1635": { + "id": "23:1635", + "type": "TEXT", + "fields": { + "parentId": "23:1634", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8940, + "y": 1931 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8940.9384765625, + "y": 1935.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1636": { + "id": "23:1636", + "type": "INSTANCE", + "fields": { + "parentId": "23:1634", + "childrenIds": [ + "I23:1636;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8984, + "y": 1933.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8984, + "y": 1933.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1642": { + "id": "23:1642", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "23:1643", + "23:1644" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 9060, + "y": 1925 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 9060, + "y": 1925 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:13", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:13", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5137255191802979, + "g": 0.239215686917305, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 4, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=primary, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "sm", + "type": "primary" + }, + "visible": true, + "width": 84, + "x": 285, + "y": 281 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1643": { + "id": "23:1643", + "type": "TEXT", + "fields": { + "parentId": "23:1642", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9072, + "y": 1931 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9072.9384765625, + "y": 1935.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1644": { + "id": "23:1644", + "type": "INSTANCE", + "fields": { + "parentId": "23:1642", + "childrenIds": [ + "I23:1644;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9116, + "y": 1933.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9116, + "y": 1933.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1659": { + "id": "24:1659", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1660", + "24:1661" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 8928, + "y": 1974 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 8928, + "y": 1974 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.07999999821186066, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 5, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=ghost, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover", + "size": "sm", + "type": "ghost" + }, + "visible": true, + "width": 84, + "x": 153, + "y": 330 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1660": { + "id": "24:1660", + "type": "TEXT", + "fields": { + "parentId": "24:1659", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8940, + "y": 1980 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8940.9384765625, + "y": 1984.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1661": { + "id": "24:1661", + "type": "INSTANCE", + "fields": { + "parentId": "24:1659", + "childrenIds": [ + "I24:1661;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8984, + "y": 1982.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8984, + "y": 1982.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1662": { + "id": "24:1662", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1663", + "24:1664" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 9060, + "y": 1974 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 9060, + "y": 1974 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.1599999964237213, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 5, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=ghost, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "sm", + "type": "ghost" + }, + "visible": true, + "width": 84, + "x": 285, + "y": 330 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1663": { + "id": "24:1663", + "type": "TEXT", + "fields": { + "parentId": "24:1662", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9072, + "y": 1980 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9072.9384765625, + "y": 1984.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1664": { + "id": "24:1664", + "type": "INSTANCE", + "fields": { + "parentId": "24:1662", + "childrenIds": [ + "I24:1664;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9116, + "y": 1982.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9116, + "y": 1982.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1665": { + "id": "24:1665", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1666", + "24:1667" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 9192, + "y": 1925 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 9192, + "y": 1925 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 4, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=primary, size=sm", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "disabled", + "size": "sm", + "type": "primary" + }, + "visible": true, + "width": 84, + "x": 417, + "y": 281 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1666": { + "id": "24:1666", + "type": "TEXT", + "fields": { + "parentId": "24:1665", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9204, + "y": 1931 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9204.9384765625, + "y": 1935.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1667": { + "id": "24:1667", + "type": "INSTANCE", + "fields": { + "parentId": "24:1665", + "childrenIds": [ + "I24:1667;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9248, + "y": 1933.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9248, + "y": 1933.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1853": { + "id": "24:1853", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1854", + "24:1855" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 8796, + "y": 1665 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 8796, + "y": 1665 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 0, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=primary, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "primary" + }, + "visible": true, + "width": 114, + "x": 21, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1854": { + "id": "24:1854", + "type": "TEXT", + "fields": { + "parentId": "24:1853", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8820, + "y": 1677 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8821.072265625, + "y": 1682.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1855": { + "id": "24:1855", + "type": "INSTANCE", + "fields": { + "parentId": "24:1853", + "childrenIds": [ + "I24:1855;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8870, + "y": 1681 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8870, + "y": 1681 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1856": { + "id": "24:1856", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1857", + "24:1858" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 8928, + "y": 1665 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 8928, + "y": 1665 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6078431606292725, + "g": 0.2823529541492462, + "r": 0.003921568859368563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 0, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=primary, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "md", + "type": "primary" + }, + "visible": true, + "width": 114, + "x": 153, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1857": { + "id": "24:1857", + "type": "TEXT", + "fields": { + "parentId": "24:1856", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8952, + "y": 1677 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8953.072265625, + "y": 1682.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1858": { + "id": "24:1858", + "type": "INSTANCE", + "fields": { + "parentId": "24:1856", + "childrenIds": [ + "I24:1858;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9002, + "y": 1681 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9002, + "y": 1681 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1859": { + "id": "24:1859", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1860", + "24:1861" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 9060, + "y": 1665 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 9060, + "y": 1665 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:13", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:13", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5137255191802979, + "g": 0.239215686917305, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 0, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=primary, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "md", + "type": "primary" + }, + "visible": true, + "width": 114, + "x": 285, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1860": { + "id": "24:1860", + "type": "TEXT", + "fields": { + "parentId": "24:1859", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9084, + "y": 1677 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9085.072265625, + "y": 1682.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1861": { + "id": "24:1861", + "type": "INSTANCE", + "fields": { + "parentId": "24:1859", + "childrenIds": [ + "I24:1861;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9134, + "y": 1681 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9134, + "y": 1681 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1862": { + "id": "24:1862", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1863", + "24:1864" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 9192, + "y": 1665 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 9192, + "y": 1665 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 0, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=primary, size=md", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "disabled", + "size": "md", + "type": "primary" + }, + "visible": true, + "width": 114, + "x": 417, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1863": { + "id": "24:1863", + "type": "TEXT", + "fields": { + "parentId": "24:1862", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9216, + "y": 1677 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9217.072265625, + "y": 1682.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1864": { + "id": "24:1864", + "type": "INSTANCE", + "fields": { + "parentId": "24:1862", + "childrenIds": [ + "I24:1864;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9266, + "y": 1681 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9266, + "y": 1681 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1865": { + "id": "24:1865", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1866", + "24:1867" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 8796, + "y": 1859 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 8796, + "y": 1859 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 3, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=white-line, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 116, + "x": 21, + "y": 215 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1866": { + "id": "24:1866", + "type": "TEXT", + "fields": { + "parentId": "24:1865", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8821, + "y": 1872 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8822.072265625, + "y": 1877.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1867": { + "id": "24:1867", + "type": "INSTANCE", + "fields": { + "parentId": "24:1865", + "childrenIds": [ + "I24:1867;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8871, + "y": 1876 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8871, + "y": 1876 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1868": { + "id": "24:1868", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1869", + "24:1870" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 8928, + "y": 1859 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 8928, + "y": 1859 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 3, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=white-line, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 116, + "x": 153, + "y": 215 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1869": { + "id": "24:1869", + "type": "TEXT", + "fields": { + "parentId": "24:1868", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8953, + "y": 1872 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8954.072265625, + "y": 1877.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1870": { + "id": "24:1870", + "type": "INSTANCE", + "fields": { + "parentId": "24:1868", + "childrenIds": [ + "I24:1870;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9003, + "y": 1876 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9003, + "y": 1876 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1871": { + "id": "24:1871", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1872", + "24:1873" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 9060, + "y": 1859 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 9060, + "y": 1859 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6078431606292725, + "g": 0.2823529541492462, + "r": 0.003921568859368563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 3, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=white-line, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 116, + "x": 285, + "y": 215 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1872": { + "id": "24:1872", + "type": "TEXT", + "fields": { + "parentId": "24:1871", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9085, + "y": 1872 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9086.072265625, + "y": 1877.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1873": { + "id": "24:1873", + "type": "INSTANCE", + "fields": { + "parentId": "24:1871", + "childrenIds": [ + "I24:1873;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9135, + "y": 1876 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9135, + "y": 1876 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1933": { + "id": "24:1933", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1934", + "24:1935" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 8796, + "y": 1974 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 8796, + "y": 1974 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 5, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=ghost, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "sm", + "type": "ghost" + }, + "visible": true, + "width": 84, + "x": 21, + "y": 330 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1934": { + "id": "24:1934", + "type": "TEXT", + "fields": { + "parentId": "24:1933", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8808, + "y": 1980 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8808.9384765625, + "y": 1984.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1935": { + "id": "24:1935", + "type": "INSTANCE", + "fields": { + "parentId": "24:1933", + "childrenIds": [ + "I24:1935;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8852, + "y": 1982.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8852, + "y": 1982.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1940": { + "id": "24:1940", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "24:1941", + "24:1942" + ], + "absoluteBoundingBox": { + "height": 33, + "width": 84, + "x": 9192, + "y": 1974 + }, + "absoluteRenderBounds": { + "height": 33, + "width": 84, + "x": 9192, + "y": 1974 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 5, + "height": 33, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=ghost, size=sm", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "disabled", + "size": "sm", + "type": "ghost" + }, + "visible": true, + "width": 84, + "x": 417, + "y": 330 + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1941": { + "id": "24:1941", + "type": "TEXT", + "fields": { + "parentId": "24:1940", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9204, + "y": 1980 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9204.9384765625, + "y": 1984.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 12, + "y": 6, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "24:1942": { + "id": "24:1942", + "type": "INSTANCE", + "fields": { + "parentId": "24:1940", + "childrenIds": [ + "I24:1942;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9248, + "y": 1982.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9248, + "y": 1982.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 56, + "y": 8.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:368": { + "id": "30:368", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:369", + "30:370" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 8796, + "y": 1729 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 8796, + "y": 1729 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=ghost, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "ghost" + }, + "visible": true, + "width": 114, + "x": 21, + "y": 85 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:369": { + "id": "30:369", + "type": "TEXT", + "fields": { + "parentId": "30:368", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8820, + "y": 1741 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8821.072265625, + "y": 1746.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:370": { + "id": "30:370", + "type": "INSTANCE", + "fields": { + "parentId": "30:368", + "childrenIds": [ + "I30:370;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8870, + "y": 1745 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8870, + "y": 1745 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:371": { + "id": "30:371", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:372", + "30:373" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 8928, + "y": 1729 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 8928, + "y": 1729 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.07999999821186066, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=ghost, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "md", + "type": "ghost" + }, + "visible": true, + "width": 114, + "x": 153, + "y": 85 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:372": { + "id": "30:372", + "type": "TEXT", + "fields": { + "parentId": "30:371", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8952, + "y": 1741 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8953.072265625, + "y": 1746.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:373": { + "id": "30:373", + "type": "INSTANCE", + "fields": { + "parentId": "30:371", + "childrenIds": [ + "I30:373;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9002, + "y": 1745 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9002, + "y": 1745 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:374": { + "id": "30:374", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:375", + "30:376" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 9060, + "y": 1729 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 9060, + "y": 1729 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.1599999964237213, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=ghost, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "md", + "type": "ghost" + }, + "visible": true, + "width": 114, + "x": 285, + "y": 85 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:375": { + "id": "30:375", + "type": "TEXT", + "fields": { + "parentId": "30:374", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9084, + "y": 1741 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9085.072265625, + "y": 1746.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:376": { + "id": "30:376", + "type": "INSTANCE", + "fields": { + "parentId": "30:374", + "childrenIds": [ + "I30:376;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9134, + "y": 1745 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9134, + "y": 1745 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:377": { + "id": "30:377", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:378", + "30:379" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 114, + "x": 9192, + "y": 1729 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 114, + "x": 9192, + "y": 1729 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 1, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=ghost, size=md", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": 0, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "disabled", + "size": "md", + "type": "ghost" + }, + "visible": true, + "width": 114, + "x": 417, + "y": 85 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:378": { + "id": "30:378", + "type": "TEXT", + "fields": { + "parentId": "30:377", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9216, + "y": 1741 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9217.072265625, + "y": 1746.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 24, + "y": 12, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:379": { + "id": "30:379", + "type": "INSTANCE", + "fields": { + "parentId": "30:377", + "childrenIds": [ + "I30:379;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9266, + "y": 1745 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9266, + "y": 1745 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 74, + "y": 16, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:383": { + "id": "30:383", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:384", + "30:385" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 9192, + "y": 1859 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 9192, + "y": 1859 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 3, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=white-line, size=md", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "disabled", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 116, + "x": 417, + "y": 215 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:384": { + "id": "30:384", + "type": "TEXT", + "fields": { + "parentId": "30:383", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9217, + "y": 1872 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9218.072265625, + "y": 1877.0240478515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:385": { + "id": "30:385", + "type": "INSTANCE", + "fields": { + "parentId": "30:383", + "childrenIds": [ + "I30:385;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9267, + "y": 1876 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9267, + "y": 1876 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:399": { + "id": "30:399", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:400", + "30:401" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 8796, + "y": 1793 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 8796, + "y": 1793 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 2, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=white, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "white" + }, + "visible": true, + "width": 116, + "x": 21, + "y": 149 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:400": { + "id": "30:400", + "type": "TEXT", + "fields": { + "parentId": "30:399", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8821, + "y": 1806 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8822.072265625, + "y": 1811.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:401": { + "id": "30:401", + "type": "INSTANCE", + "fields": { + "parentId": "30:399", + "childrenIds": [ + "I30:401;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8871, + "y": 1810 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8871, + "y": 1810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:402": { + "id": "30:402", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:403", + "30:404" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 8928, + "y": 1793 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 8928, + "y": 1793 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 2, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=white, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "hover", + "size": "md", + "type": "white" + }, + "visible": true, + "width": 116, + "x": 153, + "y": 149 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:403": { + "id": "30:403", + "type": "TEXT", + "fields": { + "parentId": "30:402", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8953, + "y": 1806 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 8954.072265625, + "y": 1811.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:404": { + "id": "30:404", + "type": "INSTANCE", + "fields": { + "parentId": "30:402", + "childrenIds": [ + "I30:404;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9003, + "y": 1810 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9003, + "y": 1810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:415": { + "id": "30:415", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:416", + "30:417" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 9192, + "y": 1793 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 9192, + "y": 1793 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 2, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=white, size=md", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "disabled", + "size": "md", + "type": "white" + }, + "visible": true, + "width": 116, + "x": 417, + "y": 149 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:416": { + "id": "30:416", + "type": "TEXT", + "fields": { + "parentId": "30:415", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9217, + "y": 1806 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9218.072265625, + "y": 1811.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:417": { + "id": "30:417", + "type": "INSTANCE", + "fields": { + "parentId": "30:415", + "childrenIds": [ + "I30:417;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9267, + "y": 1810 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9267, + "y": 1810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:421": { + "id": "30:421", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:422", + "30:423" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 116, + "x": 9060, + "y": 1793 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 116, + "x": 9060, + "y": 1793 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:157", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:30:411", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:157", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9647058844566344, + "g": 0.95686274766922, + "r": 0.9529411792755128 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 2, + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=white, size=md", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:30:411", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8313725590705872, + "g": 0.7882353067398071, + "r": 0.772549033164978 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "active", + "size": "md", + "type": "white" + }, + "visible": true, + "width": 116, + "x": 285, + "y": 149 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:422": { + "id": "30:422", + "type": "TEXT", + "fields": { + "parentId": "30:421", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9085, + "y": 1806 + }, + "absoluteRenderBounds": { + "height": 14.2879638671875, + "width": 38.6884765625, + "x": 9086.072265625, + "y": 1811.0240478515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:423": { + "id": "30:423", + "type": "INSTANCE", + "fields": { + "parentId": "30:421", + "childrenIds": [ + "I30:423;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9135, + "y": 1810 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9135, + "y": 1810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 75, + "y": 17, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:496": { + "id": "30:496", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:497", + "30:498" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 8796, + "y": 2023 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 8796, + "y": 2023 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 6, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=white, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "sm", + "type": "white" + }, + "visible": true, + "width": 86, + "x": 21, + "y": 379 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:497": { + "id": "30:497", + "type": "TEXT", + "fields": { + "parentId": "30:496", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8809, + "y": 2030 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8809.9384765625, + "y": 2034.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:498": { + "id": "30:498", + "type": "INSTANCE", + "fields": { + "parentId": "30:496", + "childrenIds": [ + "I30:498;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8853, + "y": 2032.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8853, + "y": 2032.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:499": { + "id": "30:499", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:500", + "30:501" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 8928, + "y": 2023 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 8928, + "y": 2023 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 6, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=white, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover", + "size": "sm", + "type": "white" + }, + "visible": true, + "width": 86, + "x": 153, + "y": 379 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:500": { + "id": "30:500", + "type": "TEXT", + "fields": { + "parentId": "30:499", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8941, + "y": 2030 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8941.9384765625, + "y": 2034.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:501": { + "id": "30:501", + "type": "INSTANCE", + "fields": { + "parentId": "30:499", + "childrenIds": [ + "I30:501;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8985, + "y": 2032.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8985, + "y": 2032.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:502": { + "id": "30:502", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:503", + "30:504" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 9060, + "y": 2023 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 9060, + "y": 2023 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:157", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:30:411", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:157", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9647058844566344, + "g": 0.95686274766922, + "r": 0.9529411792755128 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 6, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=white, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:30:411", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8313725590705872, + "g": 0.7882353067398071, + "r": 0.772549033164978 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "sm", + "type": "white" + }, + "visible": true, + "width": 86, + "x": 285, + "y": 379 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:503": { + "id": "30:503", + "type": "TEXT", + "fields": { + "parentId": "30:502", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9073, + "y": 2030 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9073.9384765625, + "y": 2034.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:504": { + "id": "30:504", + "type": "INSTANCE", + "fields": { + "parentId": "30:502", + "childrenIds": [ + "I30:504;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9117, + "y": 2032.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9117, + "y": 2032.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:505": { + "id": "30:505", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:506", + "30:507" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 9192, + "y": 2023 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 9192, + "y": 2023 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 6, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=white, size=sm", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "disabled", + "size": "sm", + "type": "white" + }, + "visible": true, + "width": 86, + "x": 417, + "y": 379 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:506": { + "id": "30:506", + "type": "TEXT", + "fields": { + "parentId": "30:505", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9205, + "y": 2030 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9205.9384765625, + "y": 2034.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:507": { + "id": "30:507", + "type": "INSTANCE", + "fields": { + "parentId": "30:505", + "childrenIds": [ + "I30:507;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9249, + "y": 2032.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9249, + "y": 2032.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:508": { + "id": "30:508", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:509", + "30:510" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 8796, + "y": 2074 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 8796, + "y": 2074 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 7, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default, type=white-line, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default", + "size": "sm", + "type": "white-line" + }, + "visible": true, + "width": 86, + "x": 21, + "y": 430 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:509": { + "id": "30:509", + "type": "TEXT", + "fields": { + "parentId": "30:508", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8809, + "y": 2081 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8809.9384765625, + "y": 2085.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:510": { + "id": "30:510", + "type": "INSTANCE", + "fields": { + "parentId": "30:508", + "childrenIds": [ + "I30:510;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8853, + "y": 2083.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8853, + "y": 2083.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:511": { + "id": "30:511", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:512", + "30:513" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 8928, + "y": 2074 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 8928, + "y": 2074 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 7, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover, type=white-line, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover", + "size": "sm", + "type": "white-line" + }, + "visible": true, + "width": 86, + "x": 153, + "y": 430 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:512": { + "id": "30:512", + "type": "TEXT", + "fields": { + "parentId": "30:511", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 8941, + "y": 2081 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 8941.9384765625, + "y": 2085.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:513": { + "id": "30:513", + "type": "INSTANCE", + "fields": { + "parentId": "30:511", + "childrenIds": [ + "I30:513;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 8985, + "y": 2083.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 8985, + "y": 2083.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:514": { + "id": "30:514", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:515", + "30:516" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 9060, + "y": 2074 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 9060, + "y": 2074 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:23:1651", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6078431606292725, + "g": 0.2823529541492462, + "r": 0.003921568859368563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 7, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active, type=white-line, size=sm", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "active", + "size": "sm", + "type": "white-line" + }, + "visible": true, + "width": 86, + "x": 285, + "y": 430 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:515": { + "id": "30:515", + "type": "TEXT", + "fields": { + "parentId": "30:514", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9073, + "y": 2081 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9073.9384765625, + "y": 2085.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:516": { + "id": "30:516", + "type": "INSTANCE", + "fields": { + "parentId": "30:514", + "childrenIds": [ + "I30:516;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9117, + "y": 2083.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9117, + "y": 2083.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "30:517": { + "id": "30:517", + "type": "COMPONENT", + "fields": { + "parentId": "23:1613", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:518", + "30:519" + ], + "absoluteBoundingBox": { + "height": 35, + "width": 86, + "x": 9192, + "y": 2074 + }, + "absoluteRenderBounds": { + "height": 35, + "width": 86, + "x": 9192, + "y": 2074 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "gridColumnAnchorIndex": 3, + "gridRowAnchorIndex": 7, + "height": 35, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "effect=disabled, type=white-line, size=sm", + "opacity": 0.4000000059604645, + "overflowDirection": "NONE", + "paddingBottom": 6, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 6, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "disabled", + "size": "sm", + "type": "white-line" + }, + "visible": true, + "width": 86, + "x": 417, + "y": 430 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:518": { + "id": "30:518", + "type": "TEXT", + "fields": { + "parentId": "30:517", + "absoluteBoundingBox": { + "height": 21, + "width": 36, + "x": 9205, + "y": 2081 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 33.572265625, + "x": 9205.9384765625, + "y": 2085.64599609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "버튼명", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 36, + "x": 13, + "y": 7, + "styledTextSegments": [ + { + "characters": "버튼명", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:1649d6614e863b73049b737254cc0e54ab553c77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:519": { + "id": "30:519", + "type": "INSTANCE", + "fields": { + "parentId": "30:517", + "childrenIds": [ + "I30:519;23:1618" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9249, + "y": 2083.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9249, + "y": 2083.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.666666269302368, + "paddingLeft": 6, + "paddingRight": 4.666666507720947, + "paddingTop": 2.6666667461395264, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 16, + "x": 57, + "y": 9.5, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1620;23:1618": { + "id": "I23:1620;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "23:1620", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8858, + "y": 1936.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8857.2001953125, + "y": 1935.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1636;23:1618": { + "id": "I23:1636;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "23:1636", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8990, + "y": 1936.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8989.2001953125, + "y": 1935.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1644;23:1618": { + "id": "I23:1644;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "23:1644", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9122, + "y": 1936.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9121.2001953125, + "y": 1935.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1661;23:1618": { + "id": "I24:1661;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1661", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8990, + "y": 1985.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8989.2001953125, + "y": 1984.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1664;23:1618": { + "id": "I24:1664;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1664", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9122, + "y": 1985.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9121.2001953125, + "y": 1984.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1667;23:1618": { + "id": "I24:1667;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1667", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9254, + "y": 1936.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9253.2001953125, + "y": 1935.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1855;23:1618": { + "id": "I24:1855;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1855", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8876, + "y": 1683.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8875.2001953125, + "y": 1682.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1858;23:1618": { + "id": "I24:1858;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1858", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9008, + "y": 1683.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9007.2001953125, + "y": 1682.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1861;23:1618": { + "id": "I24:1861;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1861", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9140, + "y": 1683.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9139.2001953125, + "y": 1682.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1864;23:1618": { + "id": "I24:1864;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1864", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9272, + "y": 1683.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9271.2001953125, + "y": 1682.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1867;23:1618": { + "id": "I24:1867;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1867", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8877, + "y": 1878.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8876.2001953125, + "y": 1877.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1870;23:1618": { + "id": "I24:1870;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1870", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9009, + "y": 1878.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9008.2001953125, + "y": 1877.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1873;23:1618": { + "id": "I24:1873;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1873", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9141, + "y": 1878.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9140.2001953125, + "y": 1877.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1935;23:1618": { + "id": "I24:1935;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1935", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8858, + "y": 1985.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8857.2001953125, + "y": 1984.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I24:1942;23:1618": { + "id": "I24:1942;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "24:1942", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9254, + "y": 1985.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9253.2001953125, + "y": 1984.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:370;23:1618": { + "id": "I30:370;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:370", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8876, + "y": 1747.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8875.2001953125, + "y": 1746.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:373;23:1618": { + "id": "I30:373;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:373", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9008, + "y": 1747.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9007.2001953125, + "y": 1746.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:376;23:1618": { + "id": "I30:376;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:376", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9140, + "y": 1747.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9139.2001953125, + "y": 1746.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:379;23:1618": { + "id": "I30:379;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:379", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9272, + "y": 1747.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9271.2001953125, + "y": 1746.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:385;23:1618": { + "id": "I30:385;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:385", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9273, + "y": 1878.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9272.2001953125, + "y": 1877.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:401;23:1618": { + "id": "I30:401;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:401", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8877, + "y": 1812.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8876.2001953125, + "y": 1811.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:404;23:1618": { + "id": "I30:404;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:404", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9009, + "y": 1812.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9008.2001953125, + "y": 1811.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:417;23:1618": { + "id": "I30:417;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:417", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9273, + "y": 1812.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9272.2001953125, + "y": 1811.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:423;23:1618": { + "id": "I30:423;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:423", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9141, + "y": 1812.6666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9140.2001953125, + "y": 1811.8665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:498;23:1618": { + "id": "I30:498;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:498", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8859, + "y": 2035.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8858.2001953125, + "y": 2034.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:501;23:1618": { + "id": "I30:501;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:501", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8991, + "y": 2035.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 8990.2001953125, + "y": 2034.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:504;23:1618": { + "id": "I30:504;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:504", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9123, + "y": 2035.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9122.2001953125, + "y": 2034.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:507;23:1618": { + "id": "I30:507;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:507", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9255, + "y": 2035.1666259765625 + }, + "absoluteRenderBounds": { + "height": 12.2667236328125, + "width": 6.93359375, + "x": 9254.2001953125, + "y": 2034.3665771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:510;23:1618": { + "id": "I30:510;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:510", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8859, + "y": 2086.166748046875 + }, + "absoluteRenderBounds": { + "height": 12.2666015625, + "width": 6.93359375, + "x": 8858.2001953125, + "y": 2085.36669921875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:513;23:1618": { + "id": "I30:513;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:513", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 8991, + "y": 2086.166748046875 + }, + "absoluteRenderBounds": { + "height": 12.2666015625, + "width": 6.93359375, + "x": 8990.2001953125, + "y": 2085.36669921875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:516;23:1618": { + "id": "I30:516;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:516", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9123, + "y": 2086.166748046875 + }, + "absoluteRenderBounds": { + "height": 12.2666015625, + "width": 6.93359375, + "x": 9122.2001953125, + "y": 2085.36669921875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:519;23:1618": { + "id": "I30:519;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "30:519", + "absoluteBoundingBox": { + "height": 10.666666984558104, + "width": 5.333333492279053, + "x": 9255, + "y": 2086.166748046875 + }, + "absoluteRenderBounds": { + "height": 12.2666015625, + "width": 6.93359375, + "x": 9254.2001953125, + "y": 2085.36669921875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 10.666666984558104, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 5.333333492279053, + "x": 6, + "y": 2.6666667461395264 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_caret_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_caret_set.json new file mode 100644 index 00000000..07f942ce --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_caret_set.json @@ -0,0 +1,709 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "40:459" + ], + "nodes": { + "40:445": { + "id": "40:445", + "type": "VECTOR", + "fields": { + "parentId": "40:458", + "absoluteBoundingBox": { + "height": 16.500835418701172, + "width": 9.001008033752441, + "x": 8063.74951171875, + "y": 1118.7496337890625 + }, + "absoluteRenderBounds": { + "height": 16.5008544921875, + "width": 9.0009765625, + "x": 8063.74951171875, + "y": 1118.7496337890625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.500835418701172, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 9.001008033752441, + "x": 6.7494096755981445, + "y": 3.7495830059051514 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:447": { + "id": "40:447", + "type": "VECTOR", + "fields": { + "parentId": "40:457", + "absoluteBoundingBox": { + "height": 9.001006126403809, + "width": 16.500835418701172, + "x": 8092.74951171875, + "y": 1123.2496337890625 + }, + "absoluteRenderBounds": { + "height": 9.0009765625, + "width": 16.5009765625, + "x": 8092.74951171875, + "y": 1123.2496337890625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 9.001006126403809, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 16.500835418701172, + "x": 3.7495830059051514, + "y": 8.24958324432373 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:449": { + "id": "40:449", + "type": "VECTOR", + "fields": { + "parentId": "40:456", + "absoluteBoundingBox": { + "height": 9.001179695129395, + "width": 16.501007080078125, + "x": 8124.74951171875, + "y": 1121.7493896484375 + }, + "absoluteRenderBounds": { + "height": 9.001220703125, + "width": 16.5009765625, + "x": 8124.74951171875, + "y": 1121.7493896484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 9.001179695129395, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 16.501007080078125, + "x": 3.7495830059051514, + "y": 6.7494096755981445 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:451": { + "id": "40:451", + "type": "VECTOR", + "fields": { + "parentId": "40:455", + "absoluteBoundingBox": { + "height": 16.500835418701172, + "width": 9.001006126403809, + "x": 8161.24951171875, + "y": 1118.7496337890625 + }, + "absoluteRenderBounds": { + "height": 16.5008544921875, + "width": 9.0009765625, + "x": 8161.24951171875, + "y": 1118.7496337890625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.500835418701172, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 9.001006126403809, + "x": 8.24958324432373, + "y": 3.7495830059051514 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:455": { + "id": "40:455", + "type": "COMPONENT", + "fields": { + "parentId": "40:459", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:451" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 8153, + "y": 1115 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 8153, + "y": 1115 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 3.7495815753936768, + "paddingLeft": 8.24958324432373, + "paddingRight": 6.749410629272461, + "paddingTop": 3.7495830059051514, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=CaretRight", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 24, + "x": 116, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:456": { + "id": "40:456", + "type": "COMPONENT", + "fields": { + "parentId": "40:459", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:449" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 8121, + "y": 1115 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 8121, + "y": 1115 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8.249410629272461, + "paddingLeft": 3.7495830059051514, + "paddingRight": 3.749409914016723, + "paddingTop": 6.7494096755981445, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=CaretUp", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretUp" + }, + "visible": true, + "width": 24, + "x": 84, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:457": { + "id": "40:457", + "type": "COMPONENT", + "fields": { + "parentId": "40:459", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:447" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 8089, + "y": 1115 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 8089, + "y": 1115 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 6.749410629272461, + "paddingLeft": 3.7495830059051514, + "paddingRight": 3.7495815753936768, + "paddingTop": 8.24958324432373, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=CaretDown", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretDown" + }, + "visible": true, + "width": 24, + "x": 52, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:458": { + "id": "40:458", + "type": "COMPONENT", + "fields": { + "parentId": "40:459", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:445" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 8057, + "y": 1115 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 8057, + "y": 1115 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 3.7495815753936768, + "paddingLeft": 6.7494096755981445, + "paddingRight": 8.249582290649414, + "paddingTop": 3.7495830059051514, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=CaretLeft", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretLeft" + }, + "visible": true, + "width": 24, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:459": { + "id": "40:459", + "type": "COMPONENT_SET", + "fields": { + "parentId": "40:514", + "parentType": "SECTION", + "parentName": "Icons", + "childrenIds": [ + "40:458", + "40:457", + "40:456", + "40:455" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 160, + "x": 8037, + "y": 1095 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 160, + "x": 8037, + "y": 1095 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "속성 1": { + "defaultValue": "CaretLeft", + "type": "VARIANT", + "variantOptions": [ + "CaretLeft", + "CaretDown", + "CaretUp", + "CaretRight" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "40:458", + "$nodeType": "COMPONENT" + }, + "height": 64, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 160, + "x": 17, + "y": 57 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_cta_banner_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_cta_banner_set.json new file mode 100644 index 00000000..26036899 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_cta_banner_set.json @@ -0,0 +1,1991 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "73:11106" + ], + "nodes": { + "73:11070": { + "id": "73:11070", + "type": "FRAME", + "fields": { + "parentId": "73:11078", + "childrenIds": [ + "73:11071", + "73:11072", + "73:11073" + ], + "absoluteBoundingBox": { + "height": 115, + "width": 1023, + "x": 8885, + "y": 9511 + }, + "absoluteRenderBounds": { + "height": 115, + "width": 1023, + "x": 8885, + "y": 9511 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 115, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1023, + "x": 64, + "y": 56 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11071": { + "id": "73:11071", + "type": "TEXT", + "fields": { + "parentId": "73:11070", + "absoluteBoundingBox": { + "height": 20, + "width": 79, + "x": 8885, + "y": 9511 + }, + "absoluteRenderBounds": { + "height": 11.625, + "width": 76.8564453125, + "x": 8885.900390625, + "y": 9514.7802734375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "CONTACT", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8392156958580017, + "g": 0.8156862854957581, + "r": 0.40392157435417175 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "CONTACT", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 79, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "CONTACT", + "end": 7, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11072": { + "id": "73:11072", + "type": "TEXT", + "fields": { + "parentId": "73:11070", + "absoluteBoundingBox": { + "height": 42, + "width": 1023, + "x": 8885, + "y": 9543 + }, + "absoluteRenderBounds": { + "height": 28.896484375, + "width": 333.8935546875, + "x": 8886.0244140625, + "y": 9549.8876953125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "콘드로스페로이드 관련 문의", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 32, + "height": 42, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "콘드로스페로이드 관련 문의", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:8f74b830ee8360510db15b6145b2c30e5a240ce2,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1023, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "콘드로스페로이드 관련 문의", + "end": 14, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:8f74b830ee8360510db15b6145b2c30e5a240ce2," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11073": { + "id": "73:11073", + "type": "TEXT", + "fields": { + "parentId": "73:11070", + "absoluteBoundingBox": { + "height": 29, + "width": 1023, + "x": 8885, + "y": 9597 + }, + "absoluteRenderBounds": { + "height": 15.9111328125, + "width": 540.9013671875, + "x": 8885.73828125, + "y": 9603.4384765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면 담당자가 확인 후 연락드립니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 18, + "height": 29, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1023, + "x": 0, + "y": 86, + "styledTextSegments": [ + { + "characters": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면 담당자가 확인 후 연락드립니다.", + "end": 46, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11074": { + "id": "73:11074", + "type": "INSTANCE", + "fields": { + "parentId": "73:11078", + "childrenIds": [ + "I73:11074;24:1866", + "I73:11074;24:1867" + ], + "absoluteBoundingBox": { + "height": 50, + "width": 129, + "x": 9908, + "y": 9576 + }, + "absoluteRenderBounds": { + "height": 50, + "width": 129, + "x": 9908, + "y": 9576 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "rightIcon#23:2": { + "type": "BOOLEAN", + "value": true + }, + "size": { + "boundVariables": {}, + "type": "VARIANT", + "value": "md" + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "white-line" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "height": 50, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "button", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 129, + "x": 1087, + "y": 121, + "mainComponentId": "24:1865", + "mainComponentName": "effect=default, type=white-line, size=md", + "mainComponentSetId": "23:1613" + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11078": { + "id": "73:11078", + "type": "COMPONENT", + "fields": { + "parentId": "73:11106", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:11070", + "73:11074" + ], + "absoluteBoundingBox": { + "height": 227, + "width": 1280, + "x": 8821, + "y": 9455 + }, + "absoluteRenderBounds": { + "height": 227, + "width": 1280, + "x": 8821, + "y": 9455 + }, + "bottomLeftRadius": 24, + "bottomRightRadius": 24, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 24, + "counterAxisAlignItems": "MAX", + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "3dff48ef546574de374768d70081b41b8d205ec4", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 1, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.949999988079071, + "b": 0.21960784494876864, + "g": 0.10196078568696976, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.21960784494876864, + "g": 0.10196078568696976, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 227, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 56, + "paddingLeft": 64, + "paddingRight": 64, + "paddingTop": 56, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 56, + "paddingLeft": 64, + "paddingRight": 64, + "paddingTop": 56, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 24, + "topRightRadius": 24, + "variantProperties": { + "viewport": "Desktop" + }, + "visible": true, + "width": 1280, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11106": { + "id": "73:11106", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "73:11078", + "73:11107" + ], + "absoluteBoundingBox": { + "height": 600, + "width": 1320, + "x": 8801, + "y": 9435 + }, + "absoluteRenderBounds": { + "height": 600, + "width": 1320, + "x": 8801, + "y": 9435 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "73:11078", + "$nodeType": "COMPONENT" + }, + "height": 600, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "CTABanner", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1320, + "x": 131, + "y": 8397 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11107": { + "id": "73:11107", + "type": "COMPONENT", + "fields": { + "parentId": "73:11106", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:11108", + "73:11112" + ], + "absoluteBoundingBox": { + "height": 313, + "width": 360, + "x": 8821, + "y": 9702 + }, + "absoluteRenderBounds": { + "height": 313, + "width": 360, + "x": 8821, + "y": 9702 + }, + "bottomLeftRadius": 20, + "bottomRightRadius": 20, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 20, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "3dff48ef546574de374768d70081b41b8d205ec4", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 1, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.949999988079071, + "b": 0.21960784494876864, + "g": 0.10196078568696976, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.21960784494876864, + "g": 0.10196078568696976, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 313, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 48, + "paddingLeft": 32, + "paddingRight": 32, + "paddingTop": 48, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "itemSpacing": 40, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 48, + "paddingLeft": 32, + "paddingRight": 32, + "paddingTop": 48, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 20, + "topRightRadius": 20, + "variantProperties": { + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 20, + "y": 267 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11108": { + "id": "73:11108", + "type": "FRAME", + "fields": { + "parentId": "73:11107", + "childrenIds": [ + "73:11109", + "73:11110", + "73:11111" + ], + "absoluteBoundingBox": { + "height": 128, + "width": 296, + "x": 8853, + "y": 9750 + }, + "absoluteRenderBounds": { + "height": 128, + "width": 296, + "x": 8853, + "y": 9750 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 128, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 296, + "x": 32, + "y": 48 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11109": { + "id": "73:11109", + "type": "TEXT", + "fields": { + "parentId": "73:11108", + "absoluteBoundingBox": { + "height": 20, + "width": 79, + "x": 8853, + "y": 9750 + }, + "absoluteRenderBounds": { + "height": 11.625, + "width": 76.8564453125, + "x": 8853.900390625, + "y": 9753.7802734375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "CONTACT", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8392156958580017, + "g": 0.8156862854957581, + "r": 0.40392157435417175 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "CONTACT", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 79, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "CONTACT", + "end": 7, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11110": { + "id": "73:11110", + "type": "TEXT", + "fields": { + "parentId": "73:11108", + "absoluteBoundingBox": { + "height": 32, + "width": 296, + "x": 8853, + "y": 9782 + }, + "absoluteRenderBounds": { + "height": 21.671875, + "width": 250.4208984375, + "x": 8853.767578125, + "y": 9787.416015625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "콘드로스페로이드 관련 문의", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -3 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "콘드로스페로이드 관련 문의", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:8f74b830ee8360510db15b6145b2c30e5a240ce2,", + "textTruncation": "DISABLED", + "visible": true, + "width": 296, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "콘드로스페로이드 관련 문의", + "end": 14, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:8f74b830ee8360510db15b6145b2c30e5a240ce2," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11111": { + "id": "73:11111", + "type": "TEXT", + "fields": { + "parentId": "73:11108", + "absoluteBoundingBox": { + "height": 52, + "width": 296, + "x": 8853, + "y": 9826 + }, + "absoluteRenderBounds": { + "height": 40.03125, + "width": 285.90234375, + "x": 8853.65625, + "y": 9832.15234375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면 담당자가 확인 후 연락드립니다.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 52, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3,", + "textTruncation": "DISABLED", + "visible": true, + "width": 296, + "x": 0, + "y": 76, + "styledTextSegments": [ + { + "characters": "공동연구 · 투자 · 임상 관련 문의를 남겨 주시면 담당자가 확인 후 연락드립니다.", + "end": 46, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11112": { + "id": "73:11112", + "type": "INSTANCE", + "fields": { + "parentId": "73:11107", + "childrenIds": [ + "I73:11112;24:1866", + "I73:11112;24:1867" + ], + "absoluteBoundingBox": { + "height": 49, + "width": 296, + "x": 8853, + "y": 9918 + }, + "absoluteRenderBounds": { + "height": 49, + "width": 296, + "x": 8853, + "y": 9918 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "rightIcon#23:2": { + "type": "BOOLEAN", + "value": true + }, + "size": { + "boundVariables": {}, + "type": "VARIANT", + "value": "md" + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "white-line" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "counterAxisAlignItems": "CENTER", + "height": 49, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "button", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 12, + "topRightRadius": 12, + "variantProperties": { + "effect": "default", + "size": "md", + "type": "white-line" + }, + "visible": true, + "width": 296, + "x": 32, + "y": 216, + "mainComponentId": "24:1865", + "mainComponentName": "effect=default, type=white-line, size=md", + "mainComponentSetId": "23:1613" + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11074;24:1866": { + "id": "I73:11074;24:1866", + "type": "TEXT", + "fields": { + "parentId": "73:11074", + "absoluteBoundingBox": { + "height": 24, + "width": 55, + "x": 9933, + "y": 9589 + }, + "absoluteRenderBounds": { + "height": 14.287109375, + "width": 52.78515625, + "x": 9933.5283203125, + "y": 9594.0244140625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "문의하기", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 55, + "x": 25, + "y": 13, + "styledTextSegments": [ + { + "characters": "문의하기", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11074;24:1867": { + "id": "I73:11074;24:1867", + "type": "INSTANCE", + "fields": { + "parentId": "73:11074", + "childrenIds": [ + "I73:11074;24:1867;40:451" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9996, + "y": 9593 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9996, + "y": 9593 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.499721050262451, + "paddingLeft": 5.499722003936768, + "paddingRight": 4.499607086181641, + "paddingTop": 2.4997220039367676, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 16, + "x": 88, + "y": 17, + "mainComponentId": "40:455", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:459" + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11074;24:1867;40:451": { + "id": "I73:11074;24:1867;40:451", + "type": "VECTOR", + "fields": { + "parentId": "I73:11074;24:1867", + "absoluteBoundingBox": { + "height": 11.00055694580078, + "width": 6.000670909881592, + "x": 10001.5, + "y": 9595.5 + }, + "absoluteRenderBounds": { + "height": 11.0009765625, + "width": 6.0009765625, + "x": 10001.5, + "y": 9595.5 + }, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.00055694580078, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6.000670909881592, + "x": 5.499722003936768, + "y": 2.4997220039367676 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11112;24:1866": { + "id": "I73:11112;24:1866", + "type": "TEXT", + "fields": { + "parentId": "73:11112", + "absoluteBoundingBox": { + "height": 23, + "width": 52, + "x": 8963, + "y": 9931 + }, + "absoluteRenderBounds": { + "height": 13.3955078125, + "width": 49.486328125, + "x": 8963.4951171875, + "y": 9935.8349609375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "문의하기", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "버튼명", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 52, + "x": 110, + "y": 13, + "styledTextSegments": [ + { + "characters": "문의하기", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11112;24:1867": { + "id": "I73:11112;24:1867", + "type": "INSTANCE", + "fields": { + "parentId": "73:11112", + "childrenIds": [ + "I73:11112;24:1867;40:451" + ], + "absoluteBoundingBox": { + "height": 16, + "width": 16, + "x": 9023, + "y": 9934.5 + }, + "absoluteRenderBounds": { + "height": 16, + "width": 16, + "x": 9023, + "y": 9934.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "rightIcon#23:2" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 16, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.499721050262451, + "paddingLeft": 5.499722003936768, + "paddingRight": 4.499607086181641, + "paddingTop": 2.4997220039367676, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 16, + "x": 170, + "y": 16.5, + "mainComponentId": "40:455", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:459" + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:11112;24:1867;40:451": { + "id": "I73:11112;24:1867;40:451", + "type": "VECTOR", + "fields": { + "parentId": "I73:11112;24:1867", + "absoluteBoundingBox": { + "height": 11.00055694580078, + "width": 6.000670909881592, + "x": 9028.5, + "y": 9937 + }, + "absoluteRenderBounds": { + "height": 11.0009765625, + "width": 6.0009765625, + "x": 9028.5, + "y": 9937 + }, + "boundVariables": { + "strokes": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.00055694580078, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1.600000023841858, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6.000670909881592, + "x": 5.499722003936768, + "y": 2.4997220039367676 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_dropdown_option_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_dropdown_option_set.json new file mode 100644 index 00000000..da7eee34 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_dropdown_option_set.json @@ -0,0 +1,737 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "45:2034" + ], + "nodes": { + "45:2025": { + "id": "45:2025", + "type": "TEXT", + "fields": { + "parentId": "45:2033", + "absoluteBoundingBox": { + "height": 24, + "width": 37, + "x": 8818, + "y": 4955 + }, + "absoluteRenderBounds": { + "height": 13.7919921875, + "width": 34.408203125, + "x": 8818.6396484375, + "y": 4960.18408203125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "옵션 1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "옵션 1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 37, + "x": 16, + "y": 12, + "styledTextSegments": [ + { + "characters": "옵션 1", + "end": 4, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2028": { + "id": "45:2028", + "type": "TEXT", + "fields": { + "parentId": "45:2032", + "absoluteBoundingBox": { + "height": 24, + "width": 37, + "x": 8818, + "y": 5031 + }, + "absoluteRenderBounds": { + "height": 13.7919921875, + "width": 34.408203125, + "x": 8818.6396484375, + "y": 5036.18408203125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "옵션 1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "옵션 1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 37, + "x": 16, + "y": 12, + "styledTextSegments": [ + { + "characters": "옵션 1", + "end": 4, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2030": { + "id": "45:2030", + "type": "TEXT", + "fields": { + "parentId": "45:2031", + "absoluteBoundingBox": { + "height": 24, + "width": 37, + "x": 8818, + "y": 5107 + }, + "absoluteRenderBounds": { + "height": 13.7919921875, + "width": 34.408203125, + "x": 8818.6396484375, + "y": 5112.18408203125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "옵션 1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "옵션 1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 37, + "x": 16, + "y": 12, + "styledTextSegments": [ + { + "characters": "옵션 1", + "end": 4, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2031": { + "id": "45:2031", + "type": "COMPONENT", + "fields": { + "parentId": "45:2034", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "45:2030" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 540, + "x": 8802, + "y": 5095 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 540, + "x": 8802, + "y": 5095 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:3", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:3", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9839743375778198, + "g": 0.9189276099205016, + "r": 0.8625540137290955 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=active", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "active" + }, + "visible": true, + "width": 540, + "x": 20, + "y": 172 + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2032": { + "id": "45:2032", + "type": "COMPONENT", + "fields": { + "parentId": "45:2034", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "45:2028" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 540, + "x": 8802, + "y": 5019 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 540, + "x": 8802, + "y": 5019 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 0.9715099334716796, + "r": 0.9487178325653076 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=hover", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "hover" + }, + "visible": true, + "width": 540, + "x": 20, + "y": 96 + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2033": { + "id": "45:2033", + "type": "COMPONENT", + "fields": { + "parentId": "45:2034", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "45:2025" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 540, + "x": 8802, + "y": 4943 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 540, + "x": 8802, + "y": 4943 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:161", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=default", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "default" + }, + "visible": true, + "width": 540, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "45:2034": { + "id": "45:2034", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "45:2033", + "45:2032", + "45:2031" + ], + "absoluteBoundingBox": { + "height": 240, + "width": 580, + "x": 8782, + "y": 4923 + }, + "absoluteRenderBounds": { + "height": 240, + "width": 580, + "x": 8782, + "y": 4923 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "속성 1": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "hover", + "active" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "45:2033", + "$nodeType": "COMPONENT" + }, + "height": 240, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "DropdownOption", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 580, + "x": 112, + "y": 3885 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_footer_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_footer_set.json new file mode 100644 index 00000000..abbe100f --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_footer_set.json @@ -0,0 +1,5761 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "30:1118" + ], + "nodes": { + "30:1118": { + "id": "30:1118", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "30:1119", + "43:1187" + ], + "absoluteBoundingBox": { + "height": 615, + "width": 1686, + "x": 8782, + "y": 3714 + }, + "absoluteRenderBounds": { + "height": 615, + "width": 1686, + "x": 8782, + "y": 3714 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "30:1119", + "$nodeType": "COMPONENT" + }, + "height": 615, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Footer", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1686, + "x": 112, + "y": 2676 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:1119": { + "id": "30:1119", + "type": "COMPONENT", + "fields": { + "parentId": "30:1118", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "30:1120" + ], + "absoluteBoundingBox": { + "height": 181, + "width": 1600, + "x": 8802, + "y": 3734 + }, + "absoluteRenderBounds": { + "height": 181, + "width": 1600, + "x": 8802, + "y": 3734 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 181, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 48, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 48, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 48, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 48, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "viewport": "Desktop" + }, + "visible": true, + "width": 1600, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:1120": { + "id": "30:1120", + "type": "FRAME", + "fields": { + "parentId": "30:1119", + "childrenIds": [ + "41:901", + "41:914" + ], + "absoluteBoundingBox": { + "height": 85, + "width": 1280, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 85, + "width": 1280, + "x": 8962, + "y": 3782 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 85, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 24, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 15", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 160, + "y": 48 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:1122": { + "id": "30:1122", + "type": "FRAME", + "fields": { + "parentId": "41:914", + "childrenIds": [ + "30:1123", + "30:1124", + "73:10999" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 260, + "x": 9209, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 260, + "x": 9209, + "y": 3782 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 25", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 260, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "30:1123": { + "id": "30:1123", + "type": "INSTANCE", + "fields": { + "parentId": "30:1122", + "childrenIds": [ + "I30:1123;15:2101" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 114, + "x": 9209, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 114, + "x": 9209, + "y": 3782 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "TextButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 114, + "x": 0, + "y": 0, + "mainComponentId": "30:1108", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "30:1107" + }, + "extra": {}, + "fieldErrors": { + "componentProperties": "in get_componentProperties: Component set for node has existing errors", + "variantProperties": "in get_variantProperties: Component set for node has existing errors" + } + }, + "30:1124": { + "id": "30:1124", + "type": "TEXT", + "fields": { + "parentId": "30:1122", + "absoluteBoundingBox": { + "height": 24, + "width": 55, + "x": 9339, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 14.031982421875, + "width": 53.392578125, + "x": 9340.15234375, + "y": 3787.152099609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "이용약관", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "이용약관", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 55, + "x": 130, + "y": 0, + "styledTextSegments": [ + { + "characters": "이용약관", + "end": 4, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "30:1126": { + "id": "30:1126", + "type": "TEXT", + "fields": { + "parentId": "41:926", + "absoluteBoundingBox": { + "height": 18, + "width": 228, + "x": 9209, + "y": 3849 + }, + "absoluteRenderBounds": { + "height": 12.16796875, + "width": 225.5576171875, + "x": 9210.1396484375, + "y": 3852.424072265625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "© 2026 ChondroGen Inc. All rights reserved.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 12, + "height": 18, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "© 2026 ChondroGen Inc. All rights reserved.", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:695b4683d717713bed12afa28c899d6ea1758b53,", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "x": 0, + "y": 27, + "styledTextSegments": [ + { + "characters": "© 2026 ChondroGen Inc. All rights reserved.", + "end": 43, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695b4683d717713bed12afa28c899d6ea1758b53," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:901": { + "id": "41:901", + "type": "INSTANCE", + "fields": { + "parentId": "30:1120", + "childrenIds": [ + "I41:901;136:19765", + "I41:901;136:19766", + "I41:901;136:19779" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 223, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 223, + "x": 8962, + "y": 3782 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "gray" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 36, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "gray" + }, + "visible": true, + "width": 223, + "x": 0, + "y": 0, + "mainComponentId": "136:19764", + "mainComponentName": "속성 1=gray", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "41:908": { + "id": "41:908", + "type": "TEXT", + "fields": { + "parentId": "41:926", + "absoluteBoundingBox": { + "height": 21, + "width": 1033, + "x": 9209, + "y": 3822 + }, + "absoluteRenderBounds": { + "height": 14.3359375, + "width": 701.615234375, + "x": 9209.5595703125, + "y": 3826.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1033, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "end": 87, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:914": { + "id": "41:914", + "type": "FRAME", + "fields": { + "parentId": "30:1120", + "childrenIds": [ + "30:1122", + "41:926" + ], + "absoluteBoundingBox": { + "height": 85, + "width": 1033, + "x": 9209, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 85, + "width": 1033, + "x": 9209, + "y": 3782 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 85, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 496", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1033, + "x": 247, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:926": { + "id": "41:926", + "type": "FRAME", + "fields": { + "parentId": "41:914", + "childrenIds": [ + "41:908", + "30:1126" + ], + "absoluteBoundingBox": { + "height": 45, + "width": 1033, + "x": 9209, + "y": 3822 + }, + "absoluteRenderBounds": { + "height": 45, + "width": 1033, + "x": 9209, + "y": 3822 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 45, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 497", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1033, + "x": 0, + "y": 40 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1187": { + "id": "43:1187", + "type": "COMPONENT", + "fields": { + "parentId": "30:1118", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "43:1188" + ], + "absoluteBoundingBox": { + "height": 247, + "width": 360, + "x": 8802, + "y": 3976 + }, + "absoluteRenderBounds": { + "height": 247, + "width": 360, + "x": 8802, + "y": 3976 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + ], + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:349", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9764705896377563 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 247, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 36, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 36, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 36, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 36, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 20, + "y": 262 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1188": { + "id": "43:1188", + "type": "FRAME", + "fields": { + "parentId": "43:1187", + "childrenIds": [ + "43:1189", + "43:1190" + ], + "absoluteBoundingBox": { + "height": 175, + "width": 320, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 175, + "width": 320, + "x": 8822, + "y": 4012 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 175, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 15", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 320, + "x": 20, + "y": 36 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1189": { + "id": "43:1189", + "type": "INSTANCE", + "fields": { + "parentId": "43:1188", + "childrenIds": [ + "I43:1189;136:19765", + "I43:1189;136:19766", + "I43:1189;136:19779" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 223, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 223, + "x": 8822, + "y": 4012 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "gray" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 36, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "gray" + }, + "visible": true, + "width": 223, + "x": 0, + "y": 0, + "mainComponentId": "136:19764", + "mainComponentName": "속성 1=gray", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1190": { + "id": "43:1190", + "type": "FRAME", + "fields": { + "parentId": "43:1188", + "childrenIds": [ + "43:1191", + "43:1194" + ], + "absoluteBoundingBox": { + "height": 123, + "width": 320, + "x": 8822, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 123, + "width": 320, + "x": 8822, + "y": 4064 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 123, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 496", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 320, + "x": 0, + "y": 52 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1191": { + "id": "43:1191", + "type": "FRAME", + "fields": { + "parentId": "43:1190", + "childrenIds": [ + "43:1192", + "43:1193", + "73:11036" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 245, + "x": 8822, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 245, + "x": 8822, + "y": 4064 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 25", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 245, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1192": { + "id": "43:1192", + "type": "INSTANCE", + "fields": { + "parentId": "43:1191", + "childrenIds": [ + "I43:1192;15:2101" + ], + "absoluteBoundingBox": { + "height": 23, + "width": 106, + "x": 8822, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 23, + "width": 106, + "x": 8822, + "y": 4064 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 23, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "TextButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 106, + "x": 0, + "y": 0, + "mainComponentId": "30:1108", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "30:1107" + }, + "extra": {}, + "fieldErrors": { + "componentProperties": "in get_componentProperties: Component set for node has existing errors", + "variantProperties": "in get_variantProperties: Component set for node has existing errors" + } + }, + "43:1193": { + "id": "43:1193", + "type": "TEXT", + "fields": { + "parentId": "43:1191", + "absoluteBoundingBox": { + "height": 23, + "width": 52, + "x": 8944, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 13.155029296875, + "width": 50.0556640625, + "x": 8945.080078125, + "y": 4068.955078125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "이용약관", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "이용약관", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 52, + "x": 122, + "y": 0, + "styledTextSegments": [ + { + "characters": "이용약관", + "end": 4, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1194": { + "id": "43:1194", + "type": "FRAME", + "fields": { + "parentId": "43:1190", + "childrenIds": [ + "43:1195", + "43:1196" + ], + "absoluteBoundingBox": { + "height": 84, + "width": 320, + "x": 8822, + "y": 4103 + }, + "absoluteRenderBounds": { + "height": 84, + "width": 320, + "x": 8822, + "y": 4103 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 84, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 6, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 497", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 320, + "x": 0, + "y": 39 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1195": { + "id": "43:1195", + "type": "TEXT", + "fields": { + "parentId": "43:1194", + "absoluteBoundingBox": { + "height": 60, + "width": 320, + "x": 8822, + "y": 4103 + }, + "absoluteRenderBounds": { + "height": 53.2080078125, + "width": 310.5810546875, + "x": 8822.4814453125, + "y": 4107.56103515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 13, + "height": 60, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f,", + "textTruncation": "DISABLED", + "visible": true, + "width": 320, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "주식회사 콘드로젠 · 대표자 임군일 · 경기 고양시 일산동구 동국로 32 동국대학교 산학협력관 733호 · contact@chondrogen.kr", + "end": 87, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:b24dbe253b56eab7caafdd82199d1cfb1188d02f," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1196": { + "id": "43:1196", + "type": "TEXT", + "fields": { + "parentId": "43:1194", + "absoluteBoundingBox": { + "height": 18, + "width": 228, + "x": 8822, + "y": 4169 + }, + "absoluteRenderBounds": { + "height": 12.16796875, + "width": 225.5576171875, + "x": 8823.1396484375, + "y": 4172.423828125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "© 2026 ChondroGen Inc. All rights reserved.", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 12, + "height": 18, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "© 2026 ChondroGen Inc. All rights reserved.", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:695b4683d717713bed12afa28c899d6ea1758b53,", + "textTruncation": "DISABLED", + "visible": true, + "width": 228, + "x": 0, + "y": 66, + "styledTextSegments": [ + { + "characters": "© 2026 ChondroGen Inc. All rights reserved.", + "end": 43, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695b4683d717713bed12afa28c899d6ea1758b53," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:10999": { + "id": "73:10999", + "type": "TEXT", + "fields": { + "parentId": "30:1122", + "absoluteBoundingBox": { + "height": 24, + "width": 59, + "x": 9410, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 14.031982421875, + "width": 56.296875, + "x": 9410.6396484375, + "y": 3787.152099609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "오시는 길", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "오시는 길", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 201, + "y": 0, + "styledTextSegments": [ + { + "characters": "오시는 길", + "end": 5, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:11036": { + "id": "73:11036", + "type": "TEXT", + "fields": { + "parentId": "43:1191", + "absoluteBoundingBox": { + "height": 23, + "width": 55, + "x": 9012, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 13.155029296875, + "width": 52.7783203125, + "x": 9012.599609375, + "y": 4068.955078125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "오시는 길", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "오시는 길", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 55, + "x": 190, + "y": 0, + "styledTextSegments": [ + { + "characters": "오시는 길", + "end": 5, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I30:1123;15:2101": { + "id": "I30:1123;15:2101", + "type": "TEXT", + "fields": { + "parentId": "30:1123", + "absoluteBoundingBox": { + "height": 24, + "width": 114, + "x": 9209, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 14.320068359375, + "width": 110.8896484375, + "x": 9209.416015625, + "y": 3786.991943359375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "개인정보 처리방침", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "텍스트", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 114, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "개인정보 처리방침", + "end": 9, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19765": { + "id": "I41:901;136:19765", + "type": "VECTOR", + "fields": { + "parentId": "41:901", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8962, + "y": 3782 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7843137383460999, + "g": 0.7686274647712708, + "r": 0.7490196228027344 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7647058963775635, + "g": 0.7490196228027344, + "r": 0.729411780834198 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7019608020782471, + "g": 0.686274528503418, + "r": 0.6666666865348816 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.686274528503418, + "g": 0.6705882549285889, + "r": 0.6509804129600525 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19766": { + "id": "I41:901;136:19766", + "type": "GROUP", + "fields": { + "parentId": "41:901", + "childrenIds": [ + "I41:901;136:19767", + "I41:901;136:19769" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "height": 36, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19767": { + "id": "I41:901;136:19767", + "type": "GROUP", + "fields": { + "parentId": "I41:901;136:19766", + "childrenIds": [ + "I41:901;136:19768" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": null, + "height": 36, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19768": { + "id": "I41:901;136:19768", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19767", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8962, + "y": 3782 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19769": { + "id": "I41:901;136:19769", + "type": "GROUP", + "fields": { + "parentId": "I41:901;136:19766", + "childrenIds": [ + "I41:901;136:19770", + "I41:901;136:19771", + "I41:901;136:19772", + "I41:901;136:19773", + "I41:901;136:19774", + "I41:901;136:19775", + "I41:901;136:19776", + "I41:901;136:19777", + "I41:901;136:19778" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8962, + "y": 3782 + }, + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19770": { + "id": "I41:901;136:19770", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8962, + "y": 3782 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19771": { + "id": "I41:901;136:19771", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8962, + "y": 3782 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8962, + "y": 3782 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19772": { + "id": "I41:901;136:19772", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 7.538562297821045, + "width": 14.69009494781494, + "x": 8981.4521484375, + "y": 3807.662353515625 + }, + "absoluteRenderBounds": { + "height": 7.53857421875, + "width": 14.6904296875, + "x": 8981.4521484375, + "y": 3807.662353515625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 7.538562297821045, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 14.69009494781494, + "x": 19.45182228088379, + "y": 25.662315368652344 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19773": { + "id": "I41:901;136:19773", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 20.55927467346191, + "width": 20.555435180664062, + "x": 8966.123046875, + "y": 3789.4462890625 + }, + "absoluteRenderBounds": { + "height": 20.559326171875, + "width": 20.5556640625, + "x": 8966.123046875, + "y": 3789.4462890625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8784313797950745, + "g": 0.8627451062202454, + "r": 0.843137264251709 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7803921699523926, + "g": 0.7647058963775635, + "r": 0.7450980544090271 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 20.55927467346191, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 20.555435180664062, + "x": 4.122681140899658, + "y": 7.446366786956787 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19774": { + "id": "I41:901;136:19774", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 12.231562614440918, + "width": 12.2383451461792, + "x": 8969.732421875, + "y": 3793.64013671875 + }, + "absoluteRenderBounds": { + "height": 12.2314453125, + "width": 12.23828125, + "x": 8969.732421875, + "y": 3793.64013671875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.9647058844566344, + "r": 0.945098042488098 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 12.231562614440918, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 12.2383451461792, + "x": 7.732332706451416, + "y": 11.64023494720459 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19775": { + "id": "I41:901;136:19775", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 6.650156497955322, + "width": 6.653844356536865, + "x": 8972.4052734375, + "y": 3796.31201171875 + }, + "absoluteRenderBounds": { + "height": 6.650146484375, + "width": 6.654296875, + "x": 8972.4052734375, + "y": 3796.31201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7529411911964417, + "g": 0.7372549176216125, + "r": 0.7176470756530762 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.650156497955322, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 6.653844356536865, + "x": 10.405689239501951, + "y": 14.31210994720459 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19776": { + "id": "I41:901;136:19776", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 29.376216888427734, + "width": 30.706666946411133, + "x": 8962.046875, + "y": 3785.271240234375 + }, + "absoluteRenderBounds": { + "height": 29.376220703125, + "width": 30.70703125, + "x": 8962.046875, + "y": 3785.271240234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9607843160629272, + "g": 0.945098042488098, + "r": 0.9254902005195618 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8823529481887817, + "g": 0.8666666746139526, + "r": 0.8470588326454163 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 29.376216888427734, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 30.706666946411133, + "x": 0.046630535274744034, + "y": 3.271313428878784 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19777": { + "id": "I41:901;136:19777", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 16.860309600830078, + "width": 30.57485008239746, + "x": 8965.8515625, + "y": 3793.567138671875 + }, + "absoluteRenderBounds": { + "height": 16.8603515625, + "width": 30.5751953125, + "x": 8965.8515625, + "y": 3793.567138671875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.860309600830078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 30.57485008239746, + "x": 3.851651191711426, + "y": 11.567109107971191 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19778": { + "id": "I41:901;136:19778", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19769", + "absoluteBoundingBox": { + "height": 8.95641803741455, + "width": 19.86937141418457, + "x": 8966.0849609375, + "y": 3789.470703125 + }, + "absoluteRenderBounds": { + "height": 8.956298828125, + "width": 19.869140625, + "x": 8966.0849609375, + "y": 3789.470703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9647058844566344, + "g": 0.9490196108818054, + "r": 0.929411768913269 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8705882430076599, + "g": 0.8549019694328308, + "r": 0.8352941274642944 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.843137264251709, + "g": 0.8274509906768799, + "r": 0.8078431487083435 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8313725590705872, + "g": 0.8156862854957581, + "r": 0.7960784435272217 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 8.95641803741455, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 19.86937141418457, + "x": 4.08460807800293, + "y": 7.470691680908203 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19779": { + "id": "I41:901;136:19779", + "type": "GROUP", + "fields": { + "parentId": "41:901", + "childrenIds": [ + "I41:901;136:19780", + "I41:901;136:19781", + "I41:901;136:19782", + "I41:901;136:19783", + "I41:901;136:19784", + "I41:901;136:19785", + "I41:901;136:19786", + "I41:901;136:19787", + "I41:901;136:19788", + "I41:901;136:19789" + ], + "absoluteBoundingBox": { + "height": 21.29252243041992, + "width": 177.15370178222656, + "x": 9007.765625, + "y": 3789.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.29252243041992, + "width": 177.15370178222656, + "x": 9007.765625, + "y": 3789.10302734375 + }, + "height": 21.29252243041992, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 2.3733348846435547, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0.000370025634765625, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 177.15370178222656, + "x": 45.765625, + "y": 7.10302734375 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19780": { + "id": "I41:901;136:19780", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 14.901744842529297, + "x": 9170.017578125, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 14.9013671875, + "x": 9170.017578125, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.901744842529297, + "x": 208.0172119140625, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19781": { + "id": "I41:901;136:19781", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 15.468348503112791, + "x": 9151.7138671875, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 15.46875, + "x": 9151.7138671875, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 15.468348503112791, + "x": 189.7138671875, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19782": { + "id": "I41:901;136:19782", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 20.38651657104492, + "width": 18.698009490966797, + "x": 9130.56640625, + "y": 3790.009033203125 + }, + "absoluteRenderBounds": { + "height": 20.386474609375, + "width": 18.6982421875, + "x": 9130.56640625, + "y": 3790.009033203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20.38651657104492, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 18.698009490966797, + "x": 168.56642150878906, + "y": 8.009008407592773 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19783": { + "id": "I41:901;136:19783", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 16.11993980407715, + "x": 9112.703125, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 16.1201171875, + "x": 9112.703125, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.11993980407715, + "x": 150.7032699584961, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19784": { + "id": "I41:901;136:19784", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 8.754060745239258, + "x": 9102.896484375, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 8.75390625, + "x": 9102.896484375, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 8.754060745239258, + "x": 140.89654541015625, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19785": { + "id": "I41:901;136:19785", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 21.207639694213867, + "width": 16.03495216369629, + "x": 9082.767578125, + "y": 3789.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.20751953125, + "width": 16.03515625, + "x": 9082.767578125, + "y": 3789.10302734375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.207639694213867, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.03495216369629, + "x": 120.76722717285156, + "y": 7.102945327758789 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19786": { + "id": "I41:901;136:19786", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 14.901739120483398, + "x": 9065.158203125, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 14.9013671875, + "x": 9065.158203125, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.901739120483398, + "x": 103.15860748291016, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19787": { + "id": "I41:901;136:19787", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 16.119945526123047, + "x": 9046.21875, + "y": 3794.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 16.1201171875, + "x": 9046.21875, + "y": 3794.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.119945526123047, + "x": 84.21893310546875, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19788": { + "id": "I41:901;136:19788", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 21.00943946838379, + "width": 14.90174388885498, + "x": 9028.6103515625, + "y": 3789.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.009521484375, + "width": 14.9013671875, + "x": 9028.6103515625, + "y": 3789.10302734375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.00943946838379, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.90174388885498, + "x": 66.61032104492188, + "y": 7.102945327758789 + }, + "extra": {}, + "fieldErrors": {} + }, + "I41:901;136:19789": { + "id": "I41:901;136:19789", + "type": "VECTOR", + "fields": { + "parentId": "I41:901;136:19779", + "absoluteBoundingBox": { + "height": 20.38651657104492, + "width": 18.47136116027832, + "x": 9007.765625, + "y": 3790.009033203125 + }, + "absoluteRenderBounds": { + "height": 20.386474609375, + "width": 18.4716796875, + "x": 9007.765625, + "y": 3790.009033203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20.38651657104492, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 18.47136116027832, + "x": 45.765625, + "y": 8.009008407592773 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19765": { + "id": "I43:1189;136:19765", + "type": "VECTOR", + "fields": { + "parentId": "43:1189", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8822, + "y": 4012 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7843137383460999, + "g": 0.7686274647712708, + "r": 0.7490196228027344 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7647058963775635, + "g": 0.7490196228027344, + "r": 0.729411780834198 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7019608020782471, + "g": 0.686274528503418, + "r": 0.6666666865348816 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.686274528503418, + "g": 0.6705882549285889, + "r": 0.6509804129600525 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19766": { + "id": "I43:1189;136:19766", + "type": "GROUP", + "fields": { + "parentId": "43:1189", + "childrenIds": [ + "I43:1189;136:19767", + "I43:1189;136:19769" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "height": 36, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19767": { + "id": "I43:1189;136:19767", + "type": "GROUP", + "fields": { + "parentId": "I43:1189;136:19766", + "childrenIds": [ + "I43:1189;136:19768" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": null, + "height": 36, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19768": { + "id": "I43:1189;136:19768", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19767", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8822, + "y": 4012 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19769": { + "id": "I43:1189;136:19769", + "type": "GROUP", + "fields": { + "parentId": "I43:1189;136:19766", + "childrenIds": [ + "I43:1189;136:19770", + "I43:1189;136:19771", + "I43:1189;136:19772", + "I43:1189;136:19773", + "I43:1189;136:19774", + "I43:1189;136:19775", + "I43:1189;136:19776", + "I43:1189;136:19777", + "I43:1189;136:19778" + ], + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8822, + "y": 4012 + }, + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19770": { + "id": "I43:1189;136:19770", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8822, + "y": 4012 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19771": { + "id": "I43:1189;136:19771", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 36, + "width": 36.019962310791016, + "x": 8822, + "y": 4012 + }, + "absoluteRenderBounds": { + "height": 36, + "width": 36.01953125, + "x": 8822, + "y": 4012 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 36, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 36.019962310791016, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19772": { + "id": "I43:1189;136:19772", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 7.538562297821045, + "width": 14.69009494781494, + "x": 8841.4521484375, + "y": 4037.662353515625 + }, + "absoluteRenderBounds": { + "height": 7.53857421875, + "width": 14.6904296875, + "x": 8841.4521484375, + "y": 4037.662353515625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 7.538562297821045, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 14.69009494781494, + "x": 19.45182228088379, + "y": 25.662315368652344 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19773": { + "id": "I43:1189;136:19773", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 20.55927467346191, + "width": 20.555435180664062, + "x": 8826.123046875, + "y": 4019.4462890625 + }, + "absoluteRenderBounds": { + "height": 20.559326171875, + "width": 20.5556640625, + "x": 8826.123046875, + "y": 4019.4462890625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8784313797950745, + "g": 0.8627451062202454, + "r": 0.843137264251709 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7803921699523926, + "g": 0.7647058963775635, + "r": 0.7450980544090271 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 20.55927467346191, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 20.555435180664062, + "x": 4.122681140899658, + "y": 7.446366786956787 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19774": { + "id": "I43:1189;136:19774", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 12.231562614440918, + "width": 12.2383451461792, + "x": 8829.732421875, + "y": 4023.64013671875 + }, + "absoluteRenderBounds": { + "height": 12.2314453125, + "width": 12.23828125, + "x": 8829.732421875, + "y": 4023.64013671875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.9647058844566344, + "r": 0.945098042488098 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 12.231562614440918, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 12.2383451461792, + "x": 7.732332706451416, + "y": 11.64023494720459 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19775": { + "id": "I43:1189;136:19775", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 6.650156497955322, + "width": 6.653844356536865, + "x": 8832.4052734375, + "y": 4026.31201171875 + }, + "absoluteRenderBounds": { + "height": 6.650146484375, + "width": 6.654296875, + "x": 8832.4052734375, + "y": 4026.31201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7529411911964417, + "g": 0.7372549176216125, + "r": 0.7176470756530762 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.650156497955322, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 6.653844356536865, + "x": 10.405689239501951, + "y": 14.31210994720459 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19776": { + "id": "I43:1189;136:19776", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 29.376216888427734, + "width": 30.706666946411133, + "x": 8822.046875, + "y": 4015.271240234375 + }, + "absoluteRenderBounds": { + "height": 29.376220703125, + "width": 30.70703125, + "x": 8822.046875, + "y": 4015.271240234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9607843160629272, + "g": 0.945098042488098, + "r": 0.9254902005195618 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8823529481887817, + "g": 0.8666666746139526, + "r": 0.8470588326454163 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 29.376216888427734, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 30.706666946411133, + "x": 0.046630535274744034, + "y": 3.271313428878784 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19777": { + "id": "I43:1189;136:19777", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 16.860309600830078, + "width": 30.57485008239746, + "x": 8825.8515625, + "y": 4023.567138671875 + }, + "absoluteRenderBounds": { + "height": 16.8603515625, + "width": 30.5751953125, + "x": 8825.8515625, + "y": 4023.567138671875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.860309600830078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 30.57485008239746, + "x": 3.851651191711426, + "y": 11.567109107971191 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19778": { + "id": "I43:1189;136:19778", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19769", + "absoluteBoundingBox": { + "height": 8.95641803741455, + "width": 19.86937141418457, + "x": 8826.0849609375, + "y": 4019.470703125 + }, + "absoluteRenderBounds": { + "height": 8.956298828125, + "width": 19.869140625, + "x": 8826.0849609375, + "y": 4019.470703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9647058844566344, + "g": 0.9490196108818054, + "r": 0.929411768913269 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8705882430076599, + "g": 0.8549019694328308, + "r": 0.8352941274642944 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.843137264251709, + "g": 0.8274509906768799, + "r": 0.8078431487083435 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8313725590705872, + "g": 0.8156862854957581, + "r": 0.7960784435272217 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 8.95641803741455, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 19.86937141418457, + "x": 4.08460807800293, + "y": 7.470691680908203 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19779": { + "id": "I43:1189;136:19779", + "type": "GROUP", + "fields": { + "parentId": "43:1189", + "childrenIds": [ + "I43:1189;136:19780", + "I43:1189;136:19781", + "I43:1189;136:19782", + "I43:1189;136:19783", + "I43:1189;136:19784", + "I43:1189;136:19785", + "I43:1189;136:19786", + "I43:1189;136:19787", + "I43:1189;136:19788", + "I43:1189;136:19789" + ], + "absoluteBoundingBox": { + "height": 21.29252243041992, + "width": 177.15370178222656, + "x": 8867.765625, + "y": 4019.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.29252243041992, + "width": 177.15370178222656, + "x": 8867.765625, + "y": 4019.10302734375 + }, + "height": 21.29252243041992, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 2.3733348846435547, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0.000370025634765625, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 177.15370178222656, + "x": 45.765625, + "y": 7.10302734375 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19780": { + "id": "I43:1189;136:19780", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 14.901744842529297, + "x": 9030.017578125, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 14.9013671875, + "x": 9030.017578125, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.901744842529297, + "x": 208.0172119140625, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19781": { + "id": "I43:1189;136:19781", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 15.468348503112791, + "x": 9011.7138671875, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 15.46875, + "x": 9011.7138671875, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 15.468348503112791, + "x": 189.7138671875, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19782": { + "id": "I43:1189;136:19782", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 20.38651657104492, + "width": 18.698009490966797, + "x": 8990.56640625, + "y": 4020.009033203125 + }, + "absoluteRenderBounds": { + "height": 20.386474609375, + "width": 18.6982421875, + "x": 8990.56640625, + "y": 4020.009033203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20.38651657104492, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 18.698009490966797, + "x": 168.56642150878906, + "y": 8.009008407592773 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19783": { + "id": "I43:1189;136:19783", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 16.11993980407715, + "x": 8972.703125, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 16.1201171875, + "x": 8972.703125, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.11993980407715, + "x": 150.7032699584961, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19784": { + "id": "I43:1189;136:19784", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 8.754060745239258, + "x": 8962.896484375, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 8.75390625, + "x": 8962.896484375, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 8.754060745239258, + "x": 140.89654541015625, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19785": { + "id": "I43:1189;136:19785", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 21.207639694213867, + "width": 16.03495216369629, + "x": 8942.767578125, + "y": 4019.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.20751953125, + "width": 16.03515625, + "x": 8942.767578125, + "y": 4019.10302734375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.207639694213867, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.03495216369629, + "x": 120.76722717285156, + "y": 7.102945327758789 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19786": { + "id": "I43:1189;136:19786", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.289889335632324, + "width": 14.901739120483398, + "x": 8925.158203125, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.289794921875, + "width": 14.9013671875, + "x": 8925.158203125, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.289889335632324, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.901739120483398, + "x": 103.15860748291016, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19787": { + "id": "I43:1189;136:19787", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 15.48809051513672, + "width": 16.119945526123047, + "x": 8906.21875, + "y": 4024.822509765625 + }, + "absoluteRenderBounds": { + "height": 15.488037109375, + "width": 16.1201171875, + "x": 8906.21875, + "y": 4024.822509765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.48809051513672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.119945526123047, + "x": 84.21893310546875, + "y": 12.822452545166016 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19788": { + "id": "I43:1189;136:19788", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 21.00943946838379, + "width": 14.90174388885498, + "x": 8888.6103515625, + "y": 4019.10302734375 + }, + "absoluteRenderBounds": { + "height": 21.009521484375, + "width": 14.9013671875, + "x": 8888.6103515625, + "y": 4019.10302734375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.00943946838379, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.90174388885498, + "x": 66.61032104492188, + "y": 7.102945327758789 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1189;136:19789": { + "id": "I43:1189;136:19789", + "type": "VECTOR", + "fields": { + "parentId": "I43:1189;136:19779", + "absoluteBoundingBox": { + "height": 20.38651657104492, + "width": 18.47136116027832, + "x": 8867.765625, + "y": 4020.009033203125 + }, + "absoluteRenderBounds": { + "height": 20.386474609375, + "width": 18.4716796875, + "x": 8867.765625, + "y": 4020.009033203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 20.38651657104492, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 18.47136116027832, + "x": 45.765625, + "y": 8.009008407592773 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1192;15:2101": { + "id": "I43:1192;15:2101", + "type": "TEXT", + "fields": { + "parentId": "43:1192", + "absoluteBoundingBox": { + "height": 23, + "width": 106, + "x": 8822, + "y": 4064 + }, + "absoluteRenderBounds": { + "height": 13.425048828125, + "width": 103.9599609375, + "x": 8822.3896484375, + "y": 4068.804931640625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "개인정보 처리방침", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "텍스트", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 106, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "개인정보 처리방침", + "end": 9, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_header_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_header_set.json new file mode 100644 index 00000000..73577179 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_header_set.json @@ -0,0 +1,18479 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "23:1575" + ], + "nodes": { + "23:1575": { + "id": "23:1575", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "23:1576", + "44:5181", + "40:265", + "43:1099", + "44:5193", + "43:1087" + ], + "absoluteBoundingBox": { + "height": 570, + "width": 1482, + "x": 10520, + "y": 3243 + }, + "absoluteRenderBounds": { + "height": 570, + "width": 1482, + "x": 10520, + "y": 3243 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "type": { + "defaultValue": "scroll", + "type": "VARIANT", + "variantOptions": [ + "scroll", + "default", + "pageTop" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "23:1576", + "$nodeType": "COMPONENT" + }, + "height": 570, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "header", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1482, + "x": 1850, + "y": 2205 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1576": { + "id": "23:1576", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "23:1577" + ], + "absoluteBoundingBox": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3264 + }, + "absoluteRenderBounds": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3264 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 80, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=scroll, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "scroll", + "viewport": "Desktop" + }, + "visible": true, + "width": 1440, + "x": 21, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1577": { + "id": "23:1577", + "type": "FRAME", + "fields": { + "parentId": "23:1576", + "childrenIds": [ + "37:224", + "23:1582", + "23:1589" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1408, + "x": 16, + "y": 15.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1582": { + "id": "23:1582", + "type": "FRAME", + "fields": { + "parentId": "23:1577", + "childrenIds": [ + "23:1583", + "23:1584", + "23:1585", + "23:1586", + "23:1588" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 40, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 446", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 462, + "x": 488, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1583": { + "id": "23:1583", + "type": "INSTANCE", + "fields": { + "parentId": "23:1582", + "childrenIds": [ + "I23:1583;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 0, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1584": { + "id": "23:1584", + "type": "INSTANCE", + "fields": { + "parentId": "23:1582", + "childrenIds": [ + "I23:1584;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 95, + "x": 99, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1585": { + "id": "23:1585", + "type": "INSTANCE", + "fields": { + "parentId": "23:1582", + "childrenIds": [ + "I23:1585;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 234, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1586": { + "id": "23:1586", + "type": "INSTANCE", + "fields": { + "parentId": "23:1582", + "childrenIds": [ + "I23:1586;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 30, + "x": 333, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1588": { + "id": "23:1588", + "type": "INSTANCE", + "fields": { + "parentId": "23:1582", + "childrenIds": [ + "I23:1588;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 403, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1589": { + "id": "23:1589", + "type": "FRAME", + "fields": { + "parentId": "23:1577", + "childrenIds": [ + "23:1590", + "23:1591" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3279.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 448", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 170, + "x": 1238, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1590": { + "id": "23:1590", + "type": "INSTANCE", + "fields": { + "parentId": "23:1589", + "childrenIds": [ + "I23:1590;20:1333", + "I23:1590;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 11829, + "y": 3279.5 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": false + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": false, + "width": 48, + "x": 34, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "23:1591": { + "id": "23:1591", + "type": "INSTANCE", + "fields": { + "parentId": "23:1589", + "childrenIds": [ + "I23:1591;20:1333", + "I23:1591;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3279.5 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3279.5 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": true + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 88, + "x": 82, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "37:224": { + "id": "37:224", + "type": "INSTANCE", + "fields": { + "parentId": "23:1577", + "childrenIds": [ + "I37:224;136:9027", + "I37:224;136:9028", + "I37:224;136:9041" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3287.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 200, + "x": 0, + "y": 8, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:265": { + "id": "40:265", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:266" + ], + "absoluteBoundingBox": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3464 + }, + "absoluteRenderBounds": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3464 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 80, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=default, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "default", + "viewport": "Desktop" + }, + "visible": true, + "width": 1440, + "x": 21, + "y": 221 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:266": { + "id": "40:266", + "type": "FRAME", + "fields": { + "parentId": "40:265", + "childrenIds": [ + "40:267", + "40:268", + "40:275" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1408, + "x": 16, + "y": 16 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:267": { + "id": "40:267", + "type": "INSTANCE", + "fields": { + "parentId": "40:266", + "childrenIds": [ + "I40:267;136:9027", + "I40:267;136:9028", + "I40:267;136:9041" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3488 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 200, + "x": 0, + "y": 8, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:268": { + "id": "40:268", + "type": "FRAME", + "fields": { + "parentId": "40:266", + "childrenIds": [ + "40:269", + "40:270", + "40:271", + "40:272", + "40:273" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 40, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 446", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 462, + "x": 488, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:269": { + "id": "40:269", + "type": "INSTANCE", + "fields": { + "parentId": "40:268", + "childrenIds": [ + "I40:269;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 0, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:270": { + "id": "40:270", + "type": "INSTANCE", + "fields": { + "parentId": "40:268", + "childrenIds": [ + "I40:270;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 95, + "x": 99, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:271": { + "id": "40:271", + "type": "INSTANCE", + "fields": { + "parentId": "40:268", + "childrenIds": [ + "I40:271;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 234, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:272": { + "id": "40:272", + "type": "INSTANCE", + "fields": { + "parentId": "40:268", + "childrenIds": [ + "I40:272;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 30, + "x": 333, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:273": { + "id": "40:273", + "type": "INSTANCE", + "fields": { + "parentId": "40:268", + "childrenIds": [ + "I40:273;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 403, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:275": { + "id": "40:275", + "type": "FRAME", + "fields": { + "parentId": "40:266", + "childrenIds": [ + "40:276", + "40:277" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3480 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 448", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 170, + "x": 1238, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:276": { + "id": "40:276", + "type": "INSTANCE", + "fields": { + "parentId": "40:275", + "childrenIds": [ + "I40:276;20:1333", + "I40:276;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 11829, + "y": 3480 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": false + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": false, + "width": 48, + "x": 34, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:277": { + "id": "40:277", + "type": "INSTANCE", + "fields": { + "parentId": "40:275", + "childrenIds": [ + "I40:277;20:1333", + "I40:277;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3480 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3480 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": true + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 88, + "x": 82, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1087": { + "id": "43:1087", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "43:1088", + "43:1147" + ], + "absoluteBoundingBox": { + "height": 60, + "width": 360, + "x": 10541, + "y": 3732 + }, + "absoluteRenderBounds": { + "height": 60, + "width": 360, + "x": 10541, + "y": 3732 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=default, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "default", + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 21, + "y": 489 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1088": { + "id": "43:1088", + "type": "FRAME", + "fields": { + "parentId": "43:1087", + "childrenIds": [ + "43:1089" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3748 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 261, + "x": 12, + "y": 16 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1089": { + "id": "43:1089", + "type": "INSTANCE", + "fields": { + "parentId": "43:1088", + "childrenIds": [ + "I43:1089;136:9027", + "I43:1089;136:9028", + "I43:1089;136:9041" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3748 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 173, + "x": 0, + "y": 0, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1099": { + "id": "43:1099", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "43:1100", + "43:1146" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 360, + "x": 10541, + "y": 3564 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 360, + "x": 10541, + "y": 3564 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + ], + "strokes": [ + { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=scroll, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:351", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "scroll", + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 21, + "y": 321 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1100": { + "id": "43:1100", + "type": "FRAME", + "fields": { + "parentId": "43:1099", + "childrenIds": [ + "43:1101" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3581.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 261, + "x": 12, + "y": 17.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1101": { + "id": "43:1101", + "type": "INSTANCE", + "fields": { + "parentId": "43:1100", + "childrenIds": [ + "I43:1101;136:9027", + "I43:1101;136:9028", + "I43:1101;136:9041" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3581.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 173, + "x": 0, + "y": 0, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1140": { + "id": "43:1140", + "type": "INSTANCE", + "fields": { + "parentId": "43:1146", + "childrenIds": [ + "I43:1140;43:1138" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3582.5 + }, + "absoluteRenderBounds": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3582.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 5.6875, + "paddingLeft": 3.25, + "paddingRight": 3.25, + "paddingTop": 5.6875, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "List", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 26, + "x": 16, + "y": 18.5, + "mainComponentId": "43:1139", + "mainComponentName": "List", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1146": { + "id": "43:1146", + "type": "FRAME", + "fields": { + "parentId": "43:1099", + "childrenIds": [ + "90:10317", + "43:1140" + ], + "absoluteBoundingBox": { + "height": 63, + "width": 58, + "x": 10843, + "y": 3564 + }, + "absoluteRenderBounds": { + "height": 63, + "width": 58, + "x": 10843, + "y": 3564 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 63, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 498", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 58, + "x": 302, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1147": { + "id": "43:1147", + "type": "FRAME", + "fields": { + "parentId": "43:1087", + "childrenIds": [ + "90:10393", + "43:1148" + ], + "absoluteBoundingBox": { + "height": 60, + "width": 58, + "x": 10843, + "y": 3732 + }, + "absoluteRenderBounds": { + "height": 60, + "width": 58, + "x": 10843, + "y": 3732 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 60, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 498", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 58, + "x": 302, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1148": { + "id": "43:1148", + "type": "INSTANCE", + "fields": { + "parentId": "43:1147", + "childrenIds": [ + "I43:1148;43:1138" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3749 + }, + "absoluteRenderBounds": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3749 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 5.6875, + "paddingLeft": 3.25, + "paddingRight": 3.25, + "paddingTop": 5.6875, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "List", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 26, + "x": 16, + "y": 17, + "mainComponentId": "43:1139", + "mainComponentName": "List", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5181": { + "id": "44:5181", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:5182" + ], + "absoluteBoundingBox": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3364 + }, + "absoluteRenderBounds": { + "height": 80, + "width": 1440, + "x": 10541, + "y": 3364 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 80, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=pageTop, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "pageTop", + "viewport": "Desktop" + }, + "visible": true, + "width": 1440, + "x": 21, + "y": 121 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5182": { + "id": "44:5182", + "type": "FRAME", + "fields": { + "parentId": "44:5181", + "childrenIds": [ + "44:5183", + "44:5184", + "44:5190" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 1408, + "x": 10557, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1408, + "x": 16, + "y": 16 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5183": { + "id": "44:5183", + "type": "INSTANCE", + "fields": { + "parentId": "44:5182", + "childrenIds": [ + "I44:5183;136:9027", + "I44:5183;136:9028", + "I44:5183;136:9041" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 200, + "x": 10557, + "y": 3388 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 32, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 200, + "x": 0, + "y": 8, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5184": { + "id": "44:5184", + "type": "FRAME", + "fields": { + "parentId": "44:5182", + "childrenIds": [ + "44:5185", + "44:5186", + "44:5187", + "44:5188", + "44:5189" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 462, + "x": 11045, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 40, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 40, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 446", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 462, + "x": 488, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5185": { + "id": "44:5185", + "type": "INSTANCE", + "fields": { + "parentId": "44:5184", + "childrenIds": [ + "I44:5185;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11045, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 0, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5186": { + "id": "44:5186", + "type": "INSTANCE", + "fields": { + "parentId": "44:5184", + "childrenIds": [ + "I44:5186;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 95, + "x": 11144, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 95, + "x": 99, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5187": { + "id": "44:5187", + "type": "INSTANCE", + "fields": { + "parentId": "44:5184", + "childrenIds": [ + "I44:5187;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11279, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 234, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5188": { + "id": "44:5188", + "type": "INSTANCE", + "fields": { + "parentId": "44:5184", + "childrenIds": [ + "I44:5188;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 30, + "x": 11378, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 30, + "x": 333, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5189": { + "id": "44:5189", + "type": "INSTANCE", + "fields": { + "parentId": "44:5184", + "childrenIds": [ + "I44:5189;18:959" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 59, + "x": 11448, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 8, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 59, + "x": 403, + "y": 0, + "mainComponentId": "19:972", + "mainComponentName": "effect=default", + "mainComponentSetId": "19:973" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5190": { + "id": "44:5190", + "type": "FRAME", + "fields": { + "parentId": "44:5182", + "childrenIds": [ + "44:5191", + "44:5192" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 170, + "x": 11795, + "y": 3380 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 0, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 448", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MAX", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 170, + "x": 1238, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5191": { + "id": "44:5191", + "type": "INSTANCE", + "fields": { + "parentId": "44:5190", + "childrenIds": [ + "I44:5191;20:1333", + "I44:5191;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 11829, + "y": 3380 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": false + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": false, + "width": 48, + "x": 34, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5192": { + "id": "44:5192", + "type": "INSTANCE", + "fields": { + "parentId": "44:5190", + "childrenIds": [ + "I44:5192;20:1333", + "I44:5192;20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3380 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 88, + "x": 11877, + "y": 3380 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + }, + "text#20:1": { + "type": "BOOLEAN", + "value": true + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 88, + "x": 82, + "y": 0, + "mainComponentId": "20:1348", + "mainComponentName": "effect=default", + "mainComponentSetId": "20:1349" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5193": { + "id": "44:5193", + "type": "COMPONENT", + "fields": { + "parentId": "23:1575", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:5194", + "44:5196" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 360, + "x": 10541, + "y": 3648 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 360, + "x": 10541, + "y": 3648 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=pageTop, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 12, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 0, + "strokeWeight": { + "$unsupported": "symbol" + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "pageTop", + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 21, + "y": 405 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5194": { + "id": "44:5194", + "type": "FRAME", + "fields": { + "parentId": "44:5193", + "childrenIds": [ + "44:5195" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 261, + "x": 10553, + "y": 3666 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 28, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 29, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 29, + "layoutGrow": 1, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 450", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "SPACE_BETWEEN", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 261, + "x": 12, + "y": 18 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5195": { + "id": "44:5195", + "type": "INSTANCE", + "fields": { + "parentId": "44:5194", + "childrenIds": [ + "I44:5195;136:9027", + "I44:5195;136:9028", + "I44:5195;136:9041" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 173, + "x": 10553, + "y": 3666 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "기본" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 28, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 1102, + "y": 178 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 173, + "x": 0, + "y": 0, + "mainComponentId": "37:217", + "mainComponentName": "속성 1=기본", + "mainComponentSetId": "136:19763" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5196": { + "id": "44:5196", + "type": "FRAME", + "fields": { + "parentId": "44:5193", + "childrenIds": [ + "90:10324", + "44:5197" + ], + "absoluteBoundingBox": { + "height": 64, + "width": 58, + "x": 10843, + "y": 3648 + }, + "absoluteRenderBounds": { + "height": 64, + "width": 58, + "x": 10843, + "y": 3648 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 64, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 498", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 58, + "x": 302, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:5197": { + "id": "44:5197", + "type": "INSTANCE", + "fields": { + "parentId": "44:5196", + "childrenIds": [ + "I44:5197;43:1138" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3667 + }, + "absoluteRenderBounds": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3667 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 5.6875, + "paddingLeft": 3.25, + "paddingRight": 3.25, + "paddingTop": 5.6875, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "List", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 26, + "x": 16, + "y": 19, + "mainComponentId": "43:1139", + "mainComponentName": "List", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "90:10317": { + "id": "90:10317", + "type": "INSTANCE", + "fields": { + "parentId": "43:1146", + "childrenIds": [ + "I90:10317;40:437" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3582.5 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.437045097351074, + "paddingLeft": 2.4150514602661133, + "paddingRight": 2.437045097351074, + "paddingTop": 2.4150514602661133, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": false, + "width": 26, + "x": 16, + "y": 18.5, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "90:10324": { + "id": "90:10324", + "type": "INSTANCE", + "fields": { + "parentId": "44:5196", + "childrenIds": [ + "I90:10324;40:437" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3667 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.437045097351074, + "paddingLeft": 2.4150514602661133, + "paddingRight": 2.437045097351074, + "paddingTop": 2.4150514602661133, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": false, + "width": 26, + "x": 16, + "y": 19, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "90:10393": { + "id": "90:10393", + "type": "INSTANCE", + "fields": { + "parentId": "43:1147", + "childrenIds": [ + "I90:10393;40:437" + ], + "absoluteBoundingBox": { + "height": 26, + "width": 26, + "x": 10859, + "y": 3749 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 26, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.437045097351074, + "paddingLeft": 2.4150514602661133, + "paddingRight": 2.437045097351074, + "paddingTop": 2.4150514602661133, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": false, + "width": 26, + "x": 16, + "y": 17, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1583;18:959": { + "id": "I23:1583;18:959", + "type": "TEXT", + "fields": { + "parentId": "23:1583", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11045, + "y": 3295 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.3564453125, + "x": 11045.6630859375, + "y": 3296.22998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기업소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기업소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1584;18:959": { + "id": "I23:1584;18:959", + "type": "TEXT", + "fields": { + "parentId": "23:1584", + "absoluteBoundingBox": { + "height": 17, + "width": 95, + "x": 11144, + "y": 3295 + }, + "absoluteRenderBounds": { + "height": 15.1640625, + "width": 93.427734375, + "x": 11144.6630859375, + "y": 3296.22998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기술/연구개발", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 95, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기술/연구개발", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1585;18:959": { + "id": "I23:1585;18:959", + "type": "TEXT", + "fields": { + "parentId": "23:1585", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11279, + "y": 3295 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.7138671875, + "x": 11279.3056640625, + "y": 3296.22998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "제품소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "제품소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1586;18:959": { + "id": "I23:1586;18:959", + "type": "TEXT", + "fields": { + "parentId": "23:1586", + "absoluteBoundingBox": { + "height": 17, + "width": 30, + "x": 11378, + "y": 3295 + }, + "absoluteRenderBounds": { + "height": 15.1298828125, + "width": 26.99609375, + "x": 11378.578125, + "y": 3296.2470703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "소식", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 30, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "소식", + "end": 2, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1588;18:959": { + "id": "I23:1588;18:959", + "type": "TEXT", + "fields": { + "parentId": "23:1588", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11448, + "y": 3295 + }, + "absoluteRenderBounds": { + "height": 15.18115234375, + "width": 56.0849609375, + "x": 11448.560546875, + "y": 3296.212890625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "문의하기", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "문의하기", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1590;20:1321": { + "id": "I23:1590;20:1321", + "type": "TEXT", + "fields": { + "parentId": "23:1590", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 11873, + "y": 3291.5 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1590;20:1333": { + "id": "I23:1590;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "23:1590", + "childrenIds": [ + "I23:1590;20:1333;40:437" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11841, + "y": 3291.5 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2495806217193604, + "paddingLeft": 2.229278326034546, + "paddingRight": 2.2495806217193604, + "paddingTop": 2.229278326034546, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1590;20:1333;40:437": { + "id": "I23:1590;20:1333;40:437", + "type": "VECTOR", + "fields": { + "parentId": "I23:1590;20:1333", + "absoluteBoundingBox": { + "height": 19.521141052246097, + "width": 19.521141052246097, + "x": 11843.2294921875, + "y": 3293.729248046875 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.521141052246097, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.521141052246097, + "x": 2.229278326034546, + "y": 2.229278326034546 + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1591;20:1321": { + "id": "I23:1591;20:1321", + "type": "TEXT", + "fields": { + "parentId": "23:1591", + "absoluteBoundingBox": { + "height": 23, + "width": 32, + "x": 11921, + "y": 3292 + }, + "absoluteRenderBounds": { + "height": 11.31005859375, + "width": 29.6357421875, + "x": 11922.2001953125, + "y": 3297.929931640625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 44, + "y": 12.5, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1591;20:1333": { + "id": "I23:1591;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "23:1591", + "childrenIds": [ + "I23:1591;20:1333;40:440" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3291.5 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3291.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2499961853027344, + "paddingLeft": 2.249995708465576, + "paddingRight": 2.250000476837158, + "paddingTop": 2.25, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Globe", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:441", + "mainComponentName": "Globe", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I23:1591;20:1333;40:440": { + "id": "I23:1591;20:1333;40:440", + "type": "VECTOR", + "fields": { + "parentId": "I23:1591;20:1333", + "absoluteBoundingBox": { + "height": 19.500003814697266, + "width": 19.500003814697266, + "x": 11891.25, + "y": 3293.75 + }, + "absoluteRenderBounds": { + "height": 19.5, + "width": 19.5, + "x": 11891.25, + "y": 3293.75 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.500003814697266, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.500003814697266, + "x": 2.249995708465576, + "y": 2.25 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9027": { + "id": "I37:224;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "37:224", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3287.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9028": { + "id": "I37:224;136:9028", + "type": "GROUP", + "fields": { + "parentId": "37:224", + "childrenIds": [ + "I37:224;136:9029", + "I37:224;136:9031" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9029": { + "id": "I37:224;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I37:224;136:9028", + "childrenIds": [ + "I37:224;136:9030" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9030": { + "id": "I37:224;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9029", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3287.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9031": { + "id": "I37:224;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I37:224;136:9028", + "childrenIds": [ + "I37:224;136:9032", + "I37:224;136:9033", + "I37:224;136:9034", + "I37:224;136:9035", + "I37:224;136:9036", + "I37:224;136:9037", + "I37:224;136:9038", + "I37:224;136:9039", + "I37:224;136:9040" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3287.5 + }, + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9032": { + "id": "I37:224;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3287.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9033": { + "id": "I37:224;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3287.5 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3287.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9034": { + "id": "I37:224;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 6.700944423675537, + "width": 13.174972534179688, + "x": 10574.4453125, + "y": 3310.31103515625 + }, + "absoluteRenderBounds": { + "height": 6.700927734375, + "width": 13.1748046875, + "x": 10574.4453125, + "y": 3310.31103515625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.700944423675537, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 13.174972534179688, + "x": 17.445581436157227, + "y": 22.81094741821289 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9035": { + "id": "I37:224;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 18.27490997314453, + "width": 18.435367584228516, + "x": 10560.697265625, + "y": 3294.118896484375 + }, + "absoluteRenderBounds": { + "height": 18.27490234375, + "width": 18.435546875, + "x": 10560.697265625, + "y": 3294.118896484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 18.27490997314453, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 18.435367584228516, + "x": 3.697471857070923, + "y": 6.618992328643799 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9036": { + "id": "I37:224;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 10.8725004196167, + "width": 10.976094245910645, + "x": 10563.9345703125, + "y": 3297.846923828125 + }, + "absoluteRenderBounds": { + "height": 10.87255859375, + "width": 10.9765625, + "x": 10563.9345703125, + "y": 3297.846923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 10.8725004196167, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 10.976094245910645, + "x": 6.9348273277282715, + "y": 10.346875190734863 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9037": { + "id": "I37:224;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 5.911250114440918, + "width": 5.967573165893555, + "x": 10566.33203125, + "y": 3300.221923828125 + }, + "absoluteRenderBounds": { + "height": 5.9111328125, + "width": 5.9677734375, + "x": 10566.33203125, + "y": 3300.221923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.911250114440918, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.967573165893555, + "x": 9.332456588745115, + "y": 12.72187614440918 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9038": { + "id": "I37:224;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 26.112192153930664, + "width": 27.539609909057617, + "x": 10557.0419921875, + "y": 3290.40771484375 + }, + "absoluteRenderBounds": { + "height": 26.1123046875, + "width": 27.5400390625, + "x": 10557.0419921875, + "y": 3290.40771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 26.112192153930664, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 27.539609909057617, + "x": 0.041821110993623734, + "y": 2.907834053039551 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9039": { + "id": "I37:224;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 14.986942291259766, + "width": 27.421390533447266, + "x": 10560.4541015625, + "y": 3297.781982421875 + }, + "absoluteRenderBounds": { + "height": 14.987060546875, + "width": 27.421875, + "x": 10560.4541015625, + "y": 3297.781982421875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.986942291259766, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.421390533447266, + "x": 3.454395532608032, + "y": 10.281874656677246 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9040": { + "id": "I37:224;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9031", + "absoluteBoundingBox": { + "height": 7.961260318756104, + "width": 17.820064544677734, + "x": 10560.6630859375, + "y": 3294.140625 + }, + "absoluteRenderBounds": { + "height": 7.961181640625, + "width": 17.8203125, + "x": 10560.6630859375, + "y": 3294.140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 7.961260318756104, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 17.820064544677734, + "x": 3.663325548171997, + "y": 6.6406145095825195 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9041": { + "id": "I37:224;136:9041", + "type": "GROUP", + "fields": { + "parentId": "37:224", + "childrenIds": [ + "I37:224;136:9042", + "I37:224;136:9043", + "I37:224;136:9044", + "I37:224;136:9045", + "I37:224;136:9046", + "I37:224;136:9047", + "I37:224;136:9048", + "I37:224;136:9049", + "I37:224;136:9050", + "I37:224;136:9051" + ], + "absoluteBoundingBox": { + "height": 18.926769256591797, + "width": 158.8823699951172, + "x": 10598.044921875, + "y": 3293.813720703125 + }, + "absoluteRenderBounds": { + "height": 18.926769256591797, + "width": 158.8828125, + "x": 10598.044921875, + "y": 3293.813720703125 + }, + "height": 18.926769256591797, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 2.128551483154297, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.00002288818359375, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0.00000762939453125, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 158.8823699951172, + "x": 41.044921875, + "y": 6.313720703125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9042": { + "id": "I37:224;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.36479377746582, + "x": 10743.5625, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10743.5625, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.36479377746582, + "x": 186.56251525878903, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9043": { + "id": "I37:224;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 13.87295913696289, + "x": 10727.146484375, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 13.873046875, + "x": 10727.146484375, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.87295913696289, + "x": 170.14695739746094, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9044": { + "id": "I37:224;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.769514083862305, + "x": 10708.1806640625, + "y": 3294.619140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.76953125, + "x": 10708.1806640625, + "y": 3294.619140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.769514083862305, + "x": 151.18064880371094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9045": { + "id": "I37:224;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457345008850098, + "x": 10692.16015625, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10692.16015625, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457345008850098, + "x": 135.15988159179688, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9046": { + "id": "I37:224;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 7.851175785064697, + "x": 10683.3642578125, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 7.8515625, + "x": 10683.3642578125, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 7.851175785064697, + "x": 126.36461639404295, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9047": { + "id": "I37:224;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 18.85123634338379, + "width": 14.381123542785645, + "x": 10665.3115234375, + "y": 3293.813720703125 + }, + "absoluteRenderBounds": { + "height": 18.851318359375, + "width": 14.380859375, + "x": 10665.3115234375, + "y": 3293.813720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.85123634338379, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.381123542785645, + "x": 108.31141662597656, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9048": { + "id": "I37:224;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.364788055419922, + "x": 10649.5185546875, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10649.5185546875, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364788055419922, + "x": 92.51893615722656, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9049": { + "id": "I37:224;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457350730895996, + "x": 10632.5322265625, + "y": 3298.897705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10632.5322265625, + "y": 3298.897705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457350730895996, + "x": 75.53268432617188, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9050": { + "id": "I37:224;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 18.67505645751953, + "width": 13.364792823791504, + "x": 10616.740234375, + "y": 3293.813720703125 + }, + "absoluteRenderBounds": { + "height": 18.675048828125, + "width": 13.365234375, + "x": 10616.740234375, + "y": 3293.813720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.67505645751953, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364792823791504, + "x": 59.74018859863281, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I37:224;136:9051": { + "id": "I37:224;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I37:224;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.566242218017578, + "x": 10598.044921875, + "y": 3294.619140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.56640625, + "x": 10598.044921875, + "y": 3294.619140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.566242218017578, + "x": 41.04539489746094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9027": { + "id": "I40:267;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "40:267", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3488 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9028": { + "id": "I40:267;136:9028", + "type": "GROUP", + "fields": { + "parentId": "40:267", + "childrenIds": [ + "I40:267;136:9029", + "I40:267;136:9031" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9029": { + "id": "I40:267;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I40:267;136:9028", + "childrenIds": [ + "I40:267;136:9030" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9030": { + "id": "I40:267;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9029", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3488 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9031": { + "id": "I40:267;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I40:267;136:9028", + "childrenIds": [ + "I40:267;136:9032", + "I40:267;136:9033", + "I40:267;136:9034", + "I40:267;136:9035", + "I40:267;136:9036", + "I40:267;136:9037", + "I40:267;136:9038", + "I40:267;136:9039", + "I40:267;136:9040" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3488 + }, + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9032": { + "id": "I40:267;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3488 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9033": { + "id": "I40:267;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3488 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3488 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9034": { + "id": "I40:267;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 6.700944423675537, + "width": 13.174972534179688, + "x": 10574.4453125, + "y": 3510.81103515625 + }, + "absoluteRenderBounds": { + "height": 6.700927734375, + "width": 13.1748046875, + "x": 10574.4453125, + "y": 3510.81103515625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.700944423675537, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 13.174972534179688, + "x": 17.445581436157227, + "y": 22.81094741821289 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9035": { + "id": "I40:267;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 18.27490997314453, + "width": 18.435367584228516, + "x": 10560.697265625, + "y": 3494.618896484375 + }, + "absoluteRenderBounds": { + "height": 18.27490234375, + "width": 18.435546875, + "x": 10560.697265625, + "y": 3494.618896484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 18.27490997314453, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 18.435367584228516, + "x": 3.697471857070923, + "y": 6.618992328643799 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9036": { + "id": "I40:267;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 10.8725004196167, + "width": 10.976094245910645, + "x": 10563.9345703125, + "y": 3498.346923828125 + }, + "absoluteRenderBounds": { + "height": 10.87255859375, + "width": 10.9765625, + "x": 10563.9345703125, + "y": 3498.346923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 10.8725004196167, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 10.976094245910645, + "x": 6.9348273277282715, + "y": 10.346875190734863 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9037": { + "id": "I40:267;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 5.911250114440918, + "width": 5.967573165893555, + "x": 10566.33203125, + "y": 3500.721923828125 + }, + "absoluteRenderBounds": { + "height": 5.9111328125, + "width": 5.9677734375, + "x": 10566.33203125, + "y": 3500.721923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.911250114440918, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.967573165893555, + "x": 9.332456588745115, + "y": 12.72187614440918 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9038": { + "id": "I40:267;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 26.112192153930664, + "width": 27.539609909057617, + "x": 10557.0419921875, + "y": 3490.90771484375 + }, + "absoluteRenderBounds": { + "height": 26.1123046875, + "width": 27.5400390625, + "x": 10557.0419921875, + "y": 3490.90771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 26.112192153930664, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 27.539609909057617, + "x": 0.041821110993623734, + "y": 2.907834053039551 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9039": { + "id": "I40:267;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 14.986942291259766, + "width": 27.421390533447266, + "x": 10560.4541015625, + "y": 3498.281982421875 + }, + "absoluteRenderBounds": { + "height": 14.987060546875, + "width": 27.421875, + "x": 10560.4541015625, + "y": 3498.281982421875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.986942291259766, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.421390533447266, + "x": 3.454395532608032, + "y": 10.281874656677246 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9040": { + "id": "I40:267;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9031", + "absoluteBoundingBox": { + "height": 7.961260318756104, + "width": 17.820064544677734, + "x": 10560.6630859375, + "y": 3494.640625 + }, + "absoluteRenderBounds": { + "height": 7.961181640625, + "width": 17.8203125, + "x": 10560.6630859375, + "y": 3494.640625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 7.961260318756104, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 17.820064544677734, + "x": 3.663325548171997, + "y": 6.6406145095825195 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9041": { + "id": "I40:267;136:9041", + "type": "GROUP", + "fields": { + "parentId": "40:267", + "childrenIds": [ + "I40:267;136:9042", + "I40:267;136:9043", + "I40:267;136:9044", + "I40:267;136:9045", + "I40:267;136:9046", + "I40:267;136:9047", + "I40:267;136:9048", + "I40:267;136:9049", + "I40:267;136:9050", + "I40:267;136:9051" + ], + "absoluteBoundingBox": { + "height": 18.926769256591797, + "width": 158.8823699951172, + "x": 10598.044921875, + "y": 3494.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.926769256591797, + "width": 158.8828125, + "x": 10598.044921875, + "y": 3494.313720703125 + }, + "height": 18.926769256591797, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 2.128551483154297, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.00002288818359375, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0.00000762939453125, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 158.8823699951172, + "x": 41.044921875, + "y": 6.313720703125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9042": { + "id": "I40:267;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.36479377746582, + "x": 10743.5625, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10743.5625, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.36479377746582, + "x": 186.56251525878903, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9043": { + "id": "I40:267;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 13.87295913696289, + "x": 10727.146484375, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 13.873046875, + "x": 10727.146484375, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.87295913696289, + "x": 170.14695739746094, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9044": { + "id": "I40:267;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.769514083862305, + "x": 10708.1806640625, + "y": 3495.119140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.76953125, + "x": 10708.1806640625, + "y": 3495.119140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.769514083862305, + "x": 151.18064880371094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9045": { + "id": "I40:267;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457345008850098, + "x": 10692.16015625, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10692.16015625, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457345008850098, + "x": 135.15988159179688, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9046": { + "id": "I40:267;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 7.851175785064697, + "x": 10683.3642578125, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 7.8515625, + "x": 10683.3642578125, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 7.851175785064697, + "x": 126.36461639404295, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9047": { + "id": "I40:267;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 18.85123634338379, + "width": 14.381123542785645, + "x": 10665.3115234375, + "y": 3494.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.851318359375, + "width": 14.380859375, + "x": 10665.3115234375, + "y": 3494.313720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.85123634338379, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.381123542785645, + "x": 108.31141662597656, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9048": { + "id": "I40:267;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.364788055419922, + "x": 10649.5185546875, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10649.5185546875, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364788055419922, + "x": 92.51893615722656, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9049": { + "id": "I40:267;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457350730895996, + "x": 10632.5322265625, + "y": 3499.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10632.5322265625, + "y": 3499.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457350730895996, + "x": 75.53268432617188, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9050": { + "id": "I40:267;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 18.67505645751953, + "width": 13.364792823791504, + "x": 10616.740234375, + "y": 3494.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.675048828125, + "width": 13.365234375, + "x": 10616.740234375, + "y": 3494.313720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.67505645751953, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364792823791504, + "x": 59.74018859863281, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:267;136:9051": { + "id": "I40:267;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I40:267;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.566242218017578, + "x": 10598.044921875, + "y": 3495.119140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.56640625, + "x": 10598.044921875, + "y": 3495.119140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.566242218017578, + "x": 41.04539489746094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:269;18:959": { + "id": "I40:269;18:959", + "type": "TEXT", + "fields": { + "parentId": "40:269", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11045, + "y": 3495.5 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.3564453125, + "x": 11045.6630859375, + "y": 3496.72998046875 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기업소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기업소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:270;18:959": { + "id": "I40:270;18:959", + "type": "TEXT", + "fields": { + "parentId": "40:270", + "absoluteBoundingBox": { + "height": 17, + "width": 95, + "x": 11144, + "y": 3495.5 + }, + "absoluteRenderBounds": { + "height": 15.1640625, + "width": 93.427734375, + "x": 11144.6630859375, + "y": 3496.72998046875 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기술/연구개발", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 95, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기술/연구개발", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:271;18:959": { + "id": "I40:271;18:959", + "type": "TEXT", + "fields": { + "parentId": "40:271", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11279, + "y": 3495.5 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.7138671875, + "x": 11279.3056640625, + "y": 3496.72998046875 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "제품소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "제품소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:272;18:959": { + "id": "I40:272;18:959", + "type": "TEXT", + "fields": { + "parentId": "40:272", + "absoluteBoundingBox": { + "height": 17, + "width": 30, + "x": 11378, + "y": 3495.5 + }, + "absoluteRenderBounds": { + "height": 15.1298828125, + "width": 26.99609375, + "x": 11378.578125, + "y": 3496.7470703125 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "소식", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 30, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "소식", + "end": 2, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:273;18:959": { + "id": "I40:273;18:959", + "type": "TEXT", + "fields": { + "parentId": "40:273", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11448, + "y": 3495.5 + }, + "absoluteRenderBounds": { + "height": 15.18115234375, + "width": 56.0849609375, + "x": 11448.560546875, + "y": 3496.712890625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "문의하기", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "문의하기", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:276;20:1321": { + "id": "I40:276;20:1321", + "type": "TEXT", + "fields": { + "parentId": "40:276", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 11873, + "y": 3492 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:276;20:1333": { + "id": "I40:276;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "40:276", + "childrenIds": [ + "I40:276;20:1333;40:437" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11841, + "y": 3492 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2495806217193604, + "paddingLeft": 2.229278326034546, + "paddingRight": 2.2495806217193604, + "paddingTop": 2.229278326034546, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:276;20:1333;40:437": { + "id": "I40:276;20:1333;40:437", + "type": "VECTOR", + "fields": { + "parentId": "I40:276;20:1333", + "absoluteBoundingBox": { + "height": 19.521141052246097, + "width": 19.521141052246097, + "x": 11843.2294921875, + "y": 3494.229248046875 + }, + "absoluteRenderBounds": null, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.521141052246097, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.521141052246097, + "x": 2.229278326034546, + "y": 2.229278326034546 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:277;20:1321": { + "id": "I40:277;20:1321", + "type": "TEXT", + "fields": { + "parentId": "40:277", + "absoluteBoundingBox": { + "height": 23, + "width": 32, + "x": 11921, + "y": 3492.5 + }, + "absoluteRenderBounds": { + "height": 11.31005859375, + "width": 29.6357421875, + "x": 11922.2001953125, + "y": 3498.429931640625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 44, + "y": 12.5, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:277;20:1333": { + "id": "I40:277;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "40:277", + "childrenIds": [ + "I40:277;20:1333;40:440" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3492 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3492 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2499961853027344, + "paddingLeft": 2.249995708465576, + "paddingRight": 2.250000476837158, + "paddingTop": 2.25, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Globe", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:441", + "mainComponentName": "Globe", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:277;20:1333;40:440": { + "id": "I40:277;20:1333;40:440", + "type": "VECTOR", + "fields": { + "parentId": "I40:277;20:1333", + "absoluteBoundingBox": { + "height": 19.500003814697266, + "width": 19.500003814697266, + "x": 11891.25, + "y": 3494.25 + }, + "absoluteRenderBounds": { + "height": 19.5, + "width": 19.5, + "x": 11891.25, + "y": 3494.25 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.500003814697266, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.500003814697266, + "x": 2.249995708465576, + "y": 2.25 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9027": { + "id": "I43:1089;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "43:1089", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3748 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9028": { + "id": "I43:1089;136:9028", + "type": "GROUP", + "fields": { + "parentId": "43:1089", + "childrenIds": [ + "I43:1089;136:9029", + "I43:1089;136:9031" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9029": { + "id": "I43:1089;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I43:1089;136:9028", + "childrenIds": [ + "I43:1089;136:9030" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9030": { + "id": "I43:1089;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9029", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3748 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9031": { + "id": "I43:1089;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I43:1089;136:9028", + "childrenIds": [ + "I43:1089;136:9032", + "I43:1089;136:9033", + "I43:1089;136:9034", + "I43:1089;136:9035", + "I43:1089;136:9036", + "I43:1089;136:9037", + "I43:1089;136:9038", + "I43:1089;136:9039", + "I43:1089;136:9040" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3748 + }, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9032": { + "id": "I43:1089;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3748 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9033": { + "id": "I43:1089;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3748 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3748 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9034": { + "id": "I43:1089;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 5.863326072692871, + "width": 11.39635181427002, + "x": 10568.0908203125, + "y": 3767.95947265625 + }, + "absoluteRenderBounds": { + "height": 5.86328125, + "width": 11.396484375, + "x": 10568.0908203125, + "y": 3767.95947265625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.863326072692871, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 11.39635181427002, + "x": 15.09042739868164, + "y": 19.95957946777344 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9035": { + "id": "I43:1089;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 15.99054718017578, + "width": 15.946592330932615, + "x": 10556.1982421875, + "y": 3753.79150390625 + }, + "absoluteRenderBounds": { + "height": 15.990478515625, + "width": 15.9462890625, + "x": 10556.1982421875, + "y": 3753.79150390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 15.99054718017578, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.946592330932615, + "x": 3.1983132362365723, + "y": 5.791618347167969 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9036": { + "id": "I43:1089;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 9.51343822479248, + "width": 9.494321823120115, + "x": 10558.9990234375, + "y": 3757.053466796875 + }, + "absoluteRenderBounds": { + "height": 9.513427734375, + "width": 9.494140625, + "x": 10558.9990234375, + "y": 3757.053466796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 9.51343822479248, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 9.494321823120115, + "x": 5.998625755310059, + "y": 9.053515434265137 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9037": { + "id": "I43:1089;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 5.172343730926514, + "width": 5.161951065063477, + "x": 10561.072265625, + "y": 3759.131591796875 + }, + "absoluteRenderBounds": { + "height": 5.17236328125, + "width": 5.162109375, + "x": 10561.072265625, + "y": 3759.131591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.172343730926514, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.161951065063477, + "x": 8.072575569152832, + "y": 11.131641387939451 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9038": { + "id": "I43:1089;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 22.848167419433594, + "width": 23.82176399230957, + "x": 10553.0361328125, + "y": 3750.54443359375 + }, + "absoluteRenderBounds": { + "height": 22.84814453125, + "width": 23.8212890625, + "x": 10553.0361328125, + "y": 3750.54443359375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 22.848167419433594, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 23.82176399230957, + "x": 0.036175258457660675, + "y": 2.5443549156188965 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9039": { + "id": "I43:1089;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 13.113574981689451, + "width": 23.719501495361328, + "x": 10555.98828125, + "y": 3756.99658203125 + }, + "absoluteRenderBounds": { + "height": 13.113525390625, + "width": 23.7197265625, + "x": 10555.98828125, + "y": 3756.99658203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.113574981689451, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 23.719501495361328, + "x": 2.9880521297454834, + "y": 8.9966402053833 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9040": { + "id": "I43:1089;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9031", + "absoluteBoundingBox": { + "height": 6.9661030769348145, + "width": 15.414355278015137, + "x": 10556.1689453125, + "y": 3753.810546875 + }, + "absoluteRenderBounds": { + "height": 6.966064453125, + "width": 15.4140625, + "x": 10556.1689453125, + "y": 3753.810546875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.9661030769348145, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.414355278015137, + "x": 3.168776512145996, + "y": 5.810537815093994 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9041": { + "id": "I43:1089;136:9041", + "type": "GROUP", + "fields": { + "parentId": "43:1089", + "childrenIds": [ + "I43:1089;136:9042", + "I43:1089;136:9043", + "I43:1089;136:9044", + "I43:1089;136:9045", + "I43:1089;136:9046", + "I43:1089;136:9047", + "I43:1089;136:9048", + "I43:1089;136:9049", + "I43:1089;136:9050", + "I43:1089;136:9051" + ], + "absoluteBoundingBox": { + "height": 16.56101417541504, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3753.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.56103515625, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3753.5244140625 + }, + "height": 16.56101417541504, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 1.8411893844604492, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.000019073486328125, + "paddingLeft": 0.0003662109375, + "paddingRight": 0.00037384033203125, + "paddingTop": 0.00009918212890625, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 137.43359375, + "x": 35.50390625, + "y": 5.5244140625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9042": { + "id": "I43:1089;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560546875, + "x": 161.37657928466797, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9043": { + "id": "I43:1089;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.000109672546388, + "x": 10700.1767578125, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12, + "x": 10700.1767578125, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.000109672546388, + "x": 147.1771240234375, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9044": { + "id": "I43:1089;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.505629539489746, + "x": 10683.771484375, + "y": 3754.229248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.505859375, + "x": 10683.771484375, + "y": 3754.229248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.505629539489746, + "x": 130.7712631225586, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9045": { + "id": "I43:1089;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505603790283203, + "x": 10669.9130859375, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10669.9130859375, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505603790283203, + "x": 116.91329956054688, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9046": { + "id": "I43:1089;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 6.791267395019531, + "x": 10662.3056640625, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 6.791015625, + "x": 10662.3056640625, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 6.791267395019531, + "x": 109.3053970336914, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9047": { + "id": "I43:1089;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 16.494831085205078, + "width": 12.439671516418455, + "x": 10646.689453125, + "y": 3753.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.494873046875, + "width": 12.439453125, + "x": 10646.689453125, + "y": 3753.5244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.494831085205078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.439671516418455, + "x": 93.68937683105467, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9048": { + "id": "I43:1089;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560542106628418, + "x": 10633.029296875, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10633.029296875, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560542106628418, + "x": 80.02886962890625, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9049": { + "id": "I43:1089;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505608558654783, + "x": 10618.3359375, + "y": 3757.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10618.3359375, + "y": 3757.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505608558654783, + "x": 65.33576965332031, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9050": { + "id": "I43:1089;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 16.340675354003906, + "width": 11.560545921325684, + "x": 10604.6748046875, + "y": 3753.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.340576171875, + "width": 11.560546875, + "x": 10604.6748046875, + "y": 3753.5244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.340675354003906, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560545921325684, + "x": 51.675262451171875, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1089;136:9051": { + "id": "I43:1089;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I43:1089;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.329800605773926, + "x": 10588.50390625, + "y": 3754.229248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.330078125, + "x": 10588.50390625, + "y": 3754.229248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.329800605773926, + "x": 35.5042724609375, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9027": { + "id": "I43:1101;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "43:1101", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3581.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9028": { + "id": "I43:1101;136:9028", + "type": "GROUP", + "fields": { + "parentId": "43:1101", + "childrenIds": [ + "I43:1101;136:9029", + "I43:1101;136:9031" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9029": { + "id": "I43:1101;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I43:1101;136:9028", + "childrenIds": [ + "I43:1101;136:9030" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9030": { + "id": "I43:1101;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9029", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3581.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9031": { + "id": "I43:1101;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I43:1101;136:9028", + "childrenIds": [ + "I43:1101;136:9032", + "I43:1101;136:9033", + "I43:1101;136:9034", + "I43:1101;136:9035", + "I43:1101;136:9036", + "I43:1101;136:9037", + "I43:1101;136:9038", + "I43:1101;136:9039", + "I43:1101;136:9040" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3581.5 + }, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9032": { + "id": "I43:1101;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3581.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9033": { + "id": "I43:1101;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3581.5 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3581.5 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9034": { + "id": "I43:1101;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 5.863326072692871, + "width": 11.39635181427002, + "x": 10568.0908203125, + "y": 3601.45947265625 + }, + "absoluteRenderBounds": { + "height": 5.86328125, + "width": 11.396484375, + "x": 10568.0908203125, + "y": 3601.45947265625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.863326072692871, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 11.39635181427002, + "x": 15.09042739868164, + "y": 19.95957946777344 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9035": { + "id": "I43:1101;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 15.99054718017578, + "width": 15.946592330932615, + "x": 10556.1982421875, + "y": 3587.29150390625 + }, + "absoluteRenderBounds": { + "height": 15.990478515625, + "width": 15.9462890625, + "x": 10556.1982421875, + "y": 3587.29150390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 15.99054718017578, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.946592330932615, + "x": 3.1983132362365723, + "y": 5.791618347167969 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9036": { + "id": "I43:1101;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 9.51343822479248, + "width": 9.494321823120115, + "x": 10558.9990234375, + "y": 3590.553466796875 + }, + "absoluteRenderBounds": { + "height": 9.513427734375, + "width": 9.494140625, + "x": 10558.9990234375, + "y": 3590.553466796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 9.51343822479248, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 9.494321823120115, + "x": 5.998625755310059, + "y": 9.053515434265137 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9037": { + "id": "I43:1101;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 5.172343730926514, + "width": 5.161951065063477, + "x": 10561.072265625, + "y": 3592.631591796875 + }, + "absoluteRenderBounds": { + "height": 5.17236328125, + "width": 5.162109375, + "x": 10561.072265625, + "y": 3592.631591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.172343730926514, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.161951065063477, + "x": 8.072575569152832, + "y": 11.131641387939451 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9038": { + "id": "I43:1101;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 22.848167419433594, + "width": 23.82176399230957, + "x": 10553.0361328125, + "y": 3584.04443359375 + }, + "absoluteRenderBounds": { + "height": 22.84814453125, + "width": 23.8212890625, + "x": 10553.0361328125, + "y": 3584.04443359375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 22.848167419433594, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 23.82176399230957, + "x": 0.036175258457660675, + "y": 2.5443549156188965 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9039": { + "id": "I43:1101;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 13.113574981689451, + "width": 23.719501495361328, + "x": 10555.98828125, + "y": 3590.49658203125 + }, + "absoluteRenderBounds": { + "height": 13.113525390625, + "width": 23.7197265625, + "x": 10555.98828125, + "y": 3590.49658203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.113574981689451, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 23.719501495361328, + "x": 2.9880521297454834, + "y": 8.9966402053833 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9040": { + "id": "I43:1101;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9031", + "absoluteBoundingBox": { + "height": 6.9661030769348145, + "width": 15.414355278015137, + "x": 10556.1689453125, + "y": 3587.310546875 + }, + "absoluteRenderBounds": { + "height": 6.966064453125, + "width": 15.4140625, + "x": 10556.1689453125, + "y": 3587.310546875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.9661030769348145, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.414355278015137, + "x": 3.168776512145996, + "y": 5.810537815093994 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9041": { + "id": "I43:1101;136:9041", + "type": "GROUP", + "fields": { + "parentId": "43:1101", + "childrenIds": [ + "I43:1101;136:9042", + "I43:1101;136:9043", + "I43:1101;136:9044", + "I43:1101;136:9045", + "I43:1101;136:9046", + "I43:1101;136:9047", + "I43:1101;136:9048", + "I43:1101;136:9049", + "I43:1101;136:9050", + "I43:1101;136:9051" + ], + "absoluteBoundingBox": { + "height": 16.56101417541504, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3587.0244140625 + }, + "absoluteRenderBounds": { + "height": 16.56103515625, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3587.0244140625 + }, + "height": 16.56101417541504, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 1.8411893844604492, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.000019073486328125, + "paddingLeft": 0.0003662109375, + "paddingRight": 0.00037384033203125, + "paddingTop": 0.00009918212890625, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 137.43359375, + "x": 35.50390625, + "y": 5.5244140625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9042": { + "id": "I43:1101;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560546875, + "x": 161.37657928466797, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9043": { + "id": "I43:1101;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.000109672546388, + "x": 10700.1767578125, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12, + "x": 10700.1767578125, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.000109672546388, + "x": 147.1771240234375, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9044": { + "id": "I43:1101;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.505629539489746, + "x": 10683.771484375, + "y": 3587.729248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.505859375, + "x": 10683.771484375, + "y": 3587.729248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.505629539489746, + "x": 130.7712631225586, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9045": { + "id": "I43:1101;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505603790283203, + "x": 10669.9130859375, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10669.9130859375, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505603790283203, + "x": 116.91329956054688, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9046": { + "id": "I43:1101;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 6.791267395019531, + "x": 10662.3056640625, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 6.791015625, + "x": 10662.3056640625, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 6.791267395019531, + "x": 109.3053970336914, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9047": { + "id": "I43:1101;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 16.494831085205078, + "width": 12.439671516418455, + "x": 10646.689453125, + "y": 3587.0244140625 + }, + "absoluteRenderBounds": { + "height": 16.494873046875, + "width": 12.439453125, + "x": 10646.689453125, + "y": 3587.0244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.494831085205078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.439671516418455, + "x": 93.68937683105467, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9048": { + "id": "I43:1101;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560542106628418, + "x": 10633.029296875, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10633.029296875, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560542106628418, + "x": 80.02886962890625, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9049": { + "id": "I43:1101;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505608558654783, + "x": 10618.3359375, + "y": 3591.472900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10618.3359375, + "y": 3591.472900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505608558654783, + "x": 65.33576965332031, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9050": { + "id": "I43:1101;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 16.340675354003906, + "width": 11.560545921325684, + "x": 10604.6748046875, + "y": 3587.0244140625 + }, + "absoluteRenderBounds": { + "height": 16.340576171875, + "width": 11.560546875, + "x": 10604.6748046875, + "y": 3587.0244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.340675354003906, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560545921325684, + "x": 51.675262451171875, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1101;136:9051": { + "id": "I43:1101;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I43:1101;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.329800605773926, + "x": 10588.50390625, + "y": 3587.729248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.330078125, + "x": 10588.50390625, + "y": 3587.729248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.329800605773926, + "x": 35.5042724609375, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1140;43:1138": { + "id": "I43:1140;43:1138", + "type": "VECTOR", + "fields": { + "parentId": "43:1140", + "absoluteBoundingBox": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3588.1875 + }, + "absoluteRenderBounds": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3588.1875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.625, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.5, + "x": 3.25, + "y": 5.6875 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1148;43:1138": { + "id": "I43:1148;43:1138", + "type": "VECTOR", + "fields": { + "parentId": "43:1148", + "absoluteBoundingBox": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3754.6875 + }, + "absoluteRenderBounds": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3754.6875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.625, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.5, + "x": 3.25, + "y": 5.6875 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9027": { + "id": "I44:5183;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "44:5183", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3388 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9028": { + "id": "I44:5183;136:9028", + "type": "GROUP", + "fields": { + "parentId": "44:5183", + "childrenIds": [ + "I44:5183;136:9029", + "I44:5183;136:9031" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "height": 32, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9029": { + "id": "I44:5183;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I44:5183;136:9028", + "childrenIds": [ + "I44:5183;136:9030" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9030": { + "id": "I44:5183;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9029", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3388 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9031": { + "id": "I44:5183;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I44:5183;136:9028", + "childrenIds": [ + "I44:5183;136:9032", + "I44:5183;136:9033", + "I44:5183;136:9034", + "I44:5183;136:9035", + "I44:5183;136:9036", + "I44:5183;136:9037", + "I44:5183;136:9038", + "I44:5183;136:9039", + "I44:5183;136:9040" + ], + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3388 + }, + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9032": { + "id": "I44:5183;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3388 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9033": { + "id": "I44:5183;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 32, + "width": 32.304901123046875, + "x": 10557, + "y": 3388 + }, + "absoluteRenderBounds": { + "height": 32, + "width": 32.3046875, + "x": 10557, + "y": 3388 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 32, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.304901123046875, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9034": { + "id": "I44:5183;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 6.700944423675537, + "width": 13.174972534179688, + "x": 10574.4453125, + "y": 3410.81103515625 + }, + "absoluteRenderBounds": { + "height": 6.700927734375, + "width": 13.1748046875, + "x": 10574.4453125, + "y": 3410.81103515625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.700944423675537, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 13.174972534179688, + "x": 17.445581436157227, + "y": 22.81094741821289 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9035": { + "id": "I44:5183;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 18.27490997314453, + "width": 18.435367584228516, + "x": 10560.697265625, + "y": 3394.618896484375 + }, + "absoluteRenderBounds": { + "height": 18.27490234375, + "width": 18.435546875, + "x": 10560.697265625, + "y": 3394.618896484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 18.27490997314453, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 18.435367584228516, + "x": 3.697471857070923, + "y": 6.618992328643799 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9036": { + "id": "I44:5183;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 10.8725004196167, + "width": 10.976094245910645, + "x": 10563.9345703125, + "y": 3398.346923828125 + }, + "absoluteRenderBounds": { + "height": 10.87255859375, + "width": 10.9765625, + "x": 10563.9345703125, + "y": 3398.346923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 10.8725004196167, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 10.976094245910645, + "x": 6.9348273277282715, + "y": 10.346875190734863 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9037": { + "id": "I44:5183;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 5.911250114440918, + "width": 5.967573165893555, + "x": 10566.33203125, + "y": 3400.721923828125 + }, + "absoluteRenderBounds": { + "height": 5.9111328125, + "width": 5.9677734375, + "x": 10566.33203125, + "y": 3400.721923828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.911250114440918, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.967573165893555, + "x": 9.332456588745115, + "y": 12.72187614440918 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9038": { + "id": "I44:5183;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 26.112192153930664, + "width": 27.539609909057617, + "x": 10557.0419921875, + "y": 3390.90771484375 + }, + "absoluteRenderBounds": { + "height": 26.1123046875, + "width": 27.5400390625, + "x": 10557.0419921875, + "y": 3390.90771484375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 26.112192153930664, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 27.539609909057617, + "x": 0.041821110993623734, + "y": 2.907834053039551 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9039": { + "id": "I44:5183;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 14.986942291259766, + "width": 27.421390533447266, + "x": 10560.4541015625, + "y": 3398.281982421875 + }, + "absoluteRenderBounds": { + "height": 14.987060546875, + "width": 27.421875, + "x": 10560.4541015625, + "y": 3398.281982421875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.986942291259766, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.421390533447266, + "x": 3.454395532608032, + "y": 10.281874656677246 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9040": { + "id": "I44:5183;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9031", + "absoluteBoundingBox": { + "height": 7.961260318756104, + "width": 17.820064544677734, + "x": 10560.6630859375, + "y": 3394.640625 + }, + "absoluteRenderBounds": { + "height": 7.961181640625, + "width": 17.8203125, + "x": 10560.6630859375, + "y": 3394.640625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 7.961260318756104, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 17.820064544677734, + "x": 3.663325548171997, + "y": 6.6406145095825195 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9041": { + "id": "I44:5183;136:9041", + "type": "GROUP", + "fields": { + "parentId": "44:5183", + "childrenIds": [ + "I44:5183;136:9042", + "I44:5183;136:9043", + "I44:5183;136:9044", + "I44:5183;136:9045", + "I44:5183;136:9046", + "I44:5183;136:9047", + "I44:5183;136:9048", + "I44:5183;136:9049", + "I44:5183;136:9050", + "I44:5183;136:9051" + ], + "absoluteBoundingBox": { + "height": 18.926769256591797, + "width": 158.8823699951172, + "x": 10598.044921875, + "y": 3394.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.926769256591797, + "width": 158.8828125, + "x": 10598.044921875, + "y": 3394.313720703125 + }, + "height": 18.926769256591797, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 2.128551483154297, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.00002288818359375, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0.00000762939453125, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 158.8823699951172, + "x": 41.044921875, + "y": 6.313720703125 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9042": { + "id": "I44:5183;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.36479377746582, + "x": 10743.5625, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10743.5625, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.36479377746582, + "x": 186.56251525878903, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9043": { + "id": "I44:5183;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 13.87295913696289, + "x": 10727.146484375, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 13.873046875, + "x": 10727.146484375, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.87295913696289, + "x": 170.14695739746094, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9044": { + "id": "I44:5183;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.769514083862305, + "x": 10708.1806640625, + "y": 3395.119140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.76953125, + "x": 10708.1806640625, + "y": 3395.119140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.769514083862305, + "x": 151.18064880371094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9045": { + "id": "I44:5183;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457345008850098, + "x": 10692.16015625, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10692.16015625, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457345008850098, + "x": 135.15988159179688, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9046": { + "id": "I44:5183;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 7.851175785064697, + "x": 10683.3642578125, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 7.8515625, + "x": 10683.3642578125, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 7.851175785064697, + "x": 126.36461639404295, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9047": { + "id": "I44:5183;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 18.85123634338379, + "width": 14.381123542785645, + "x": 10665.3115234375, + "y": 3394.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.851318359375, + "width": 14.380859375, + "x": 10665.3115234375, + "y": 3394.313720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.85123634338379, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.381123542785645, + "x": 108.31141662597656, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9048": { + "id": "I44:5183;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.591012001037598, + "width": 13.364788055419922, + "x": 10649.5185546875, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.591064453125, + "width": 13.365234375, + "x": 10649.5185546875, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.591012001037598, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364788055419922, + "x": 92.51893615722656, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9049": { + "id": "I44:5183;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 13.76719093322754, + "width": 14.457350730895996, + "x": 10632.5322265625, + "y": 3399.397705078125 + }, + "absoluteRenderBounds": { + "height": 13.76708984375, + "width": 14.45703125, + "x": 10632.5322265625, + "y": 3399.397705078125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.76719093322754, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.457350730895996, + "x": 75.53268432617188, + "y": 11.397735595703123 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9050": { + "id": "I44:5183;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 18.67505645751953, + "width": 13.364792823791504, + "x": 10616.740234375, + "y": 3394.313720703125 + }, + "absoluteRenderBounds": { + "height": 18.675048828125, + "width": 13.365234375, + "x": 10616.740234375, + "y": 3394.313720703125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.67505645751953, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 13.364792823791504, + "x": 59.74018859863281, + "y": 6.313728332519531 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5183;136:9051": { + "id": "I44:5183;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I44:5183;136:9041", + "absoluteBoundingBox": { + "height": 18.121349334716797, + "width": 16.566242218017578, + "x": 10598.044921875, + "y": 3395.119140625 + }, + "absoluteRenderBounds": { + "height": 18.121337890625, + "width": 16.56640625, + "x": 10598.044921875, + "y": 3395.119140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18.121349334716797, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 16.566242218017578, + "x": 41.04539489746094, + "y": 7.119117736816406 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5185;18:959": { + "id": "I44:5185;18:959", + "type": "TEXT", + "fields": { + "parentId": "44:5185", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11045, + "y": 3395.5 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.3564453125, + "x": 11045.6630859375, + "y": 3396.72998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기업소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기업소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5186;18:959": { + "id": "I44:5186;18:959", + "type": "TEXT", + "fields": { + "parentId": "44:5186", + "absoluteBoundingBox": { + "height": 17, + "width": 95, + "x": 11144, + "y": 3395.5 + }, + "absoluteRenderBounds": { + "height": 15.1640625, + "width": 93.427734375, + "x": 11144.6630859375, + "y": 3396.72998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "기술/연구개발", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 95, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "기술/연구개발", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5187;18:959": { + "id": "I44:5187;18:959", + "type": "TEXT", + "fields": { + "parentId": "44:5187", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11279, + "y": 3395.5 + }, + "absoluteRenderBounds": { + "height": 15.130126953125, + "width": 56.7138671875, + "x": 11279.3056640625, + "y": 3396.72998046875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "제품소개", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "제품소개", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5188;18:959": { + "id": "I44:5188;18:959", + "type": "TEXT", + "fields": { + "parentId": "44:5188", + "absoluteBoundingBox": { + "height": 17, + "width": 30, + "x": 11378, + "y": 3395.5 + }, + "absoluteRenderBounds": { + "height": 15.1298828125, + "width": 26.99609375, + "x": 11378.578125, + "y": 3396.7470703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "소식", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 30, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "소식", + "end": 2, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5189;18:959": { + "id": "I44:5189;18:959", + "type": "TEXT", + "fields": { + "parentId": "44:5189", + "absoluteBoundingBox": { + "height": 17, + "width": 59, + "x": 11448, + "y": 3395.5 + }, + "absoluteRenderBounds": { + "height": 15.18115234375, + "width": 56.0849609375, + "x": 11448.560546875, + "y": 3396.712890625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "문의하기", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "menu", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": true, + "width": 59, + "x": 0, + "y": 15.5, + "styledTextSegments": [ + { + "characters": "문의하기", + "end": 4, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5191;20:1321": { + "id": "I44:5191;20:1321", + "type": "TEXT", + "fields": { + "parentId": "44:5191", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 11873, + "y": 3392 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5191;20:1333": { + "id": "I44:5191;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "44:5191", + "childrenIds": [ + "I44:5191;20:1333;40:437" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11841, + "y": 3392 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2495806217193604, + "paddingLeft": 2.229278326034546, + "paddingRight": 2.2495806217193604, + "paddingTop": 2.229278326034546, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "MagnifyingGlass", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:438", + "mainComponentName": "MagnifyingGlass", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5191;20:1333;40:437": { + "id": "I44:5191;20:1333;40:437", + "type": "VECTOR", + "fields": { + "parentId": "I44:5191;20:1333", + "absoluteBoundingBox": { + "height": 19.521141052246097, + "width": 19.521141052246097, + "x": 11843.2294921875, + "y": 3394.229248046875 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.521141052246097, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.521141052246097, + "x": 2.229278326034546, + "y": 2.229278326034546 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5192;20:1321": { + "id": "I44:5192;20:1321", + "type": "TEXT", + "fields": { + "parentId": "44:5192", + "absoluteBoundingBox": { + "height": 23, + "width": 32, + "x": 11921, + "y": 3392.5 + }, + "absoluteRenderBounds": { + "height": 11.31005859375, + "width": 29.6357421875, + "x": 11922.2001953125, + "y": 3398.429931640625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 15, + "height": 23, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb,", + "textTruncation": "DISABLED", + "visible": true, + "width": 32, + "x": 44, + "y": 12.5, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:01da56e122aa148e08cea720f74dbe1f2d759cdb," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5192;20:1333": { + "id": "I44:5192;20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "44:5192", + "childrenIds": [ + "I44:5192;20:1333;40:440" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3392 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 11889, + "y": 3392 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 2.2499961853027344, + "paddingLeft": 2.249995708465576, + "paddingRight": 2.250000476837158, + "paddingTop": 2.25, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Globe", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "40:441", + "mainComponentName": "Globe", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5192;20:1333;40:440": { + "id": "I44:5192;20:1333;40:440", + "type": "VECTOR", + "fields": { + "parentId": "I44:5192;20:1333", + "absoluteBoundingBox": { + "height": 19.500003814697266, + "width": 19.500003814697266, + "x": 11891.25, + "y": 3394.25 + }, + "absoluteRenderBounds": { + "height": 19.5, + "width": 19.5, + "x": 11891.25, + "y": 3394.25 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 19.500003814697266, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.500003814697266, + "x": 2.249995708465576, + "y": 2.25 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9027": { + "id": "I44:5195;136:9027", + "type": "VECTOR", + "fields": { + "parentId": "44:5195", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3666 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9028": { + "id": "I44:5195;136:9028", + "type": "GROUP", + "fields": { + "parentId": "44:5195", + "childrenIds": [ + "I44:5195;136:9029", + "I44:5195;136:9031" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "height": 28, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9029": { + "id": "I44:5195;136:9029", + "type": "GROUP", + "fields": { + "parentId": "I44:5195;136:9028", + "childrenIds": [ + "I44:5195;136:9030" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": null, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9030": { + "id": "I44:5195;136:9030", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9029", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3666 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9031": { + "id": "I44:5195;136:9031", + "type": "GROUP", + "fields": { + "parentId": "I44:5195;136:9028", + "childrenIds": [ + "I44:5195;136:9032", + "I44:5195;136:9033", + "I44:5195;136:9034", + "I44:5195;136:9035", + "I44:5195;136:9036", + "I44:5195;136:9037", + "I44:5195;136:9038", + "I44:5195;136:9039", + "I44:5195;136:9040" + ], + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3666 + }, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9032": { + "id": "I44:5195;136:9032", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3666 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9033": { + "id": "I44:5195;136:9033", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 28, + "width": 27.94373893737793, + "x": 10553, + "y": 3666 + }, + "absoluteRenderBounds": { + "height": 28, + "width": 27.943359375, + "x": 10553, + "y": 3666 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 27.94373893737793, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9034": { + "id": "I44:5195;136:9034", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 5.863326072692871, + "width": 11.39635181427002, + "x": 10568.0908203125, + "y": 3685.95947265625 + }, + "absoluteRenderBounds": { + "height": 5.86328125, + "width": 11.396484375, + "x": 10568.0908203125, + "y": 3685.95947265625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.863326072692871, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 11.39635181427002, + "x": 15.09042739868164, + "y": 19.95957946777344 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9035": { + "id": "I44:5195;136:9035", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 15.99054718017578, + "width": 15.946592330932615, + "x": 10556.1982421875, + "y": 3671.79150390625 + }, + "absoluteRenderBounds": { + "height": 15.990478515625, + "width": 15.9462890625, + "x": 10556.1982421875, + "y": 3671.79150390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 15.99054718017578, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.946592330932615, + "x": 3.1983132362365723, + "y": 5.791618347167969 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9036": { + "id": "I44:5195;136:9036", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 9.51343822479248, + "width": 9.494321823120115, + "x": 10558.9990234375, + "y": 3675.053466796875 + }, + "absoluteRenderBounds": { + "height": 9.513427734375, + "width": 9.494140625, + "x": 10558.9990234375, + "y": 3675.053466796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 9.51343822479248, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 9.494321823120115, + "x": 5.998625755310059, + "y": 9.053515434265137 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9037": { + "id": "I44:5195;136:9037", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 5.172343730926514, + "width": 5.161951065063477, + "x": 10561.072265625, + "y": 3677.131591796875 + }, + "absoluteRenderBounds": { + "height": 5.17236328125, + "width": 5.162109375, + "x": 10561.072265625, + "y": 3677.131591796875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 5.172343730926514, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 5.161951065063477, + "x": 8.072575569152832, + "y": 11.131641387939451 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9038": { + "id": "I44:5195;136:9038", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 22.848167419433594, + "width": 23.82176399230957, + "x": 10553.0361328125, + "y": 3668.54443359375 + }, + "absoluteRenderBounds": { + "height": 22.84814453125, + "width": 23.8212890625, + "x": 10553.0361328125, + "y": 3668.54443359375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 22.848167419433594, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 23.82176399230957, + "x": 0.036175258457660675, + "y": 2.5443549156188965 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9039": { + "id": "I44:5195;136:9039", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 13.113574981689451, + "width": 23.719501495361328, + "x": 10555.98828125, + "y": 3674.99658203125 + }, + "absoluteRenderBounds": { + "height": 13.113525390625, + "width": 23.7197265625, + "x": 10555.98828125, + "y": 3674.99658203125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 13.113574981689451, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 23.719501495361328, + "x": 2.9880521297454834, + "y": 8.9966402053833 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9040": { + "id": "I44:5195;136:9040", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9031", + "absoluteBoundingBox": { + "height": 6.9661030769348145, + "width": 15.414355278015137, + "x": 10556.1689453125, + "y": 3671.810546875 + }, + "absoluteRenderBounds": { + "height": 6.966064453125, + "width": 15.4140625, + "x": 10556.1689453125, + "y": 3671.810546875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 6.9661030769348145, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 15.414355278015137, + "x": 3.168776512145996, + "y": 5.810537815093994 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9041": { + "id": "I44:5195;136:9041", + "type": "GROUP", + "fields": { + "parentId": "44:5195", + "childrenIds": [ + "I44:5195;136:9042", + "I44:5195;136:9043", + "I44:5195;136:9044", + "I44:5195;136:9045", + "I44:5195;136:9046", + "I44:5195;136:9047", + "I44:5195;136:9048", + "I44:5195;136:9049", + "I44:5195;136:9050", + "I44:5195;136:9051" + ], + "absoluteBoundingBox": { + "height": 16.56101417541504, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3671.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.56103515625, + "width": 137.43359375, + "x": 10588.50390625, + "y": 3671.5244140625 + }, + "height": 16.56101417541504, + "inferredAutoLayout": { + "counterAxisAlignItems": "MAX", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 1.8411893844604492, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0.000019073486328125, + "paddingLeft": 0.0003662109375, + "paddingRight": 0.00037384033203125, + "paddingTop": 0.00009918212890625, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 137.43359375, + "x": 35.50390625, + "y": 5.5244140625 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9042": { + "id": "I44:5195;136:9042", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10714.376953125, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560546875, + "x": 161.37657928466797, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9043": { + "id": "I44:5195;136:9043", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.000109672546388, + "x": 10700.1767578125, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12, + "x": 10700.1767578125, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.000109672546388, + "x": 147.1771240234375, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9044": { + "id": "I44:5195;136:9044", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.505629539489746, + "x": 10683.771484375, + "y": 3672.229248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.505859375, + "x": 10683.771484375, + "y": 3672.229248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.505629539489746, + "x": 130.7712631225586, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9045": { + "id": "I44:5195;136:9045", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505603790283203, + "x": 10669.9130859375, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10669.9130859375, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505603790283203, + "x": 116.91329956054688, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9046": { + "id": "I44:5195;136:9046", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 6.791267395019531, + "x": 10662.3056640625, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 6.791015625, + "x": 10662.3056640625, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 6.791267395019531, + "x": 109.3053970336914, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9047": { + "id": "I44:5195;136:9047", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 16.494831085205078, + "width": 12.439671516418455, + "x": 10646.689453125, + "y": 3671.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.494873046875, + "width": 12.439453125, + "x": 10646.689453125, + "y": 3671.5244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.494831085205078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.439671516418455, + "x": 93.68937683105467, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9048": { + "id": "I44:5195;136:9048", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 11.892135620117188, + "width": 11.560542106628418, + "x": 10633.029296875, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 11.89208984375, + "width": 11.560546875, + "x": 10633.029296875, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.892135620117188, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560542106628418, + "x": 80.02886962890625, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9049": { + "id": "I44:5195;136:9049", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 12.046292304992676, + "width": 12.505608558654783, + "x": 10618.3359375, + "y": 3675.972900390625 + }, + "absoluteRenderBounds": { + "height": 12.04638671875, + "width": 12.505859375, + "x": 10618.3359375, + "y": 3675.972900390625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 12.046292304992676, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 12.505608558654783, + "x": 65.33576965332031, + "y": 9.973018646240234 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9050": { + "id": "I44:5195;136:9050", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 16.340675354003906, + "width": 11.560545921325684, + "x": 10604.6748046875, + "y": 3671.5244140625 + }, + "absoluteRenderBounds": { + "height": 16.340576171875, + "width": 11.560546875, + "x": 10604.6748046875, + "y": 3671.5244140625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 16.340675354003906, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 11.560545921325684, + "x": 51.675262451171875, + "y": 5.524513244628906 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5195;136:9051": { + "id": "I44:5195;136:9051", + "type": "VECTOR", + "fields": { + "parentId": "I44:5195;136:9041", + "absoluteBoundingBox": { + "height": 15.85618019104004, + "width": 14.329800605773926, + "x": 10588.50390625, + "y": 3672.229248046875 + }, + "absoluteRenderBounds": { + "height": 15.856201171875, + "width": 14.330078125, + "x": 10588.50390625, + "y": 3672.229248046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.85618019104004, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 14.329800605773926, + "x": 35.5042724609375, + "y": 6.229228973388672 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:5197;43:1138": { + "id": "I44:5197;43:1138", + "type": "VECTOR", + "fields": { + "parentId": "44:5197", + "absoluteBoundingBox": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3672.6875 + }, + "absoluteRenderBounds": { + "height": 14.625, + "width": 19.5, + "x": 10862.25, + "y": 3672.6875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 14.625, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 19.5, + "x": 3.25, + "y": 5.6875 + }, + "extra": {}, + "fieldErrors": {} + }, + "I90:10317;40:437": { + "id": "I90:10317;40:437", + "type": "VECTOR", + "fields": { + "parentId": "90:10317", + "absoluteBoundingBox": { + "height": 21.147903442382812, + "width": 21.147903442382812, + "x": 10861.4150390625, + "y": 3584.9150390625 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.147903442382812, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 21.147903442382812, + "x": 2.4150514602661133, + "y": 2.4150514602661133 + }, + "extra": {}, + "fieldErrors": {} + }, + "I90:10324;40:437": { + "id": "I90:10324;40:437", + "type": "VECTOR", + "fields": { + "parentId": "90:10324", + "absoluteBoundingBox": { + "height": 21.147903442382812, + "width": 21.147903442382812, + "x": 10861.4150390625, + "y": 3669.4150390625 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.147903442382812, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 21.147903442382812, + "x": 2.4150514602661133, + "y": 2.4150514602661133 + }, + "extra": {}, + "fieldErrors": {} + }, + "I90:10393;40:437": { + "id": "I90:10393;40:437", + "type": "VECTOR", + "fields": { + "parentId": "90:10393", + "absoluteBoundingBox": { + "height": 21.147903442382812, + "width": 21.147903442382812, + "x": 10861.4150390625, + "y": 3751.4150390625 + }, + "absoluteRenderBounds": null, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 21.147903442382812, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 21.147903442382812, + "x": 2.4150514602661133, + "y": 2.4150514602661133 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_icon_button_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_icon_button_set.json new file mode 100644 index 00000000..d7b8463d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_icon_button_set.json @@ -0,0 +1,1386 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "20:1349" + ], + "nodes": { + "20:1321": { + "id": "20:1321", + "type": "TEXT", + "fields": { + "parentId": "20:1348", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 9024, + "y": 1123 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1333": { + "id": "20:1333", + "type": "INSTANCE", + "fields": { + "parentId": "20:1348", + "childrenIds": [ + "I20:1333;20:1304", + "I20:1333;20:1305" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 8992, + "y": 1123 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 8992, + "y": 1123 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "search" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "search" + }, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "20:1310", + "mainComponentName": "속성 1=search", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1348": { + "id": "20:1348", + "type": "COMPONENT", + "fields": { + "parentId": "20:1349", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "20:1333", + "20:1321" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 8980, + "y": 1111 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 48, + "x": 8980, + "y": 1111 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 48, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1349": { + "id": "20:1349", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "20:1348", + "20:1350", + "20:1355" + ], + "absoluteBoundingBox": { + "height": 91, + "width": 196, + "x": 8960, + "y": 1091 + }, + "absoluteRenderBounds": { + "height": 91, + "width": 196, + "x": 8960, + "y": 1091 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "hoevr", + "active" + ] + }, + "text#20:1": { + "defaultValue": false, + "type": "BOOLEAN" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "20:1348", + "$nodeType": "COMPONENT" + }, + "height": 91, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "iconButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 196, + "x": 290, + "y": 53 + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1350": { + "id": "20:1350", + "type": "COMPONENT", + "fields": { + "parentId": "20:1349", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "20:1351", + "20:1352" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 9034, + "y": 1111 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 48, + "x": 9034, + "y": 1111 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1672", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.07999999821186066, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hoevr", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "hoevr" + }, + "visible": true, + "width": 48, + "x": 74, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1351": { + "id": "20:1351", + "type": "INSTANCE", + "fields": { + "parentId": "20:1350", + "childrenIds": [ + "I20:1351;20:1304", + "I20:1351;20:1305" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 9046, + "y": 1123 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 9046, + "y": 1123 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "search" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "search" + }, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "20:1310", + "mainComponentName": "속성 1=search", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1352": { + "id": "20:1352", + "type": "TEXT", + "fields": { + "parentId": "20:1350", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 9078, + "y": 1123 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1355": { + "id": "20:1355", + "type": "COMPONENT", + "fields": { + "parentId": "20:1349", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "20:1356", + "20:1357" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 9088, + "y": 1111 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 48, + "x": 9088, + "y": 1111 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "boundVariables": { + "fills": [ + { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:24:1680", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.1599999964237213, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=active", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "active" + }, + "visible": true, + "width": 48, + "x": 128, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1356": { + "id": "20:1356", + "type": "INSTANCE", + "fields": { + "parentId": "20:1355", + "childrenIds": [ + "I20:1356;20:1304", + "I20:1356;20:1305" + ], + "absoluteBoundingBox": { + "height": 24, + "width": 24, + "x": 9100, + "y": 1123 + }, + "absoluteRenderBounds": { + "height": 24, + "width": 24, + "x": 9100, + "y": 1123 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "search" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 24, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "search" + }, + "visible": true, + "width": 24, + "x": 12, + "y": 12, + "mainComponentId": "20:1310", + "mainComponentName": "속성 1=search", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "20:1357": { + "id": "20:1357", + "type": "TEXT", + "fields": { + "parentId": "20:1355", + "absoluteBoundingBox": { + "height": 17, + "width": 37, + "x": 9132, + "y": 1123 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:44:5420", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "KOR", + "componentPropertyReferences": { + "visible": "text#20:1" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 17, + "height": 17, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 100 + }, + "maxHeight": null, + "maxWidth": null, + "name": "KOR", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475,", + "textTruncation": "DISABLED", + "visible": false, + "width": 37, + "x": 44, + "y": 12, + "styledTextSegments": [ + { + "characters": "KOR", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:ab9a4b96cc300838fb4b14185fdd981a07ac2475," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1333;20:1304": { + "id": "I20:1333;20:1304", + "type": "VECTOR", + "fields": { + "parentId": "20:1333", + "absoluteBoundingBox": { + "height": 18, + "width": 18, + "x": 8994, + "y": 1125 + }, + "absoluteRenderBounds": { + "height": 18, + "width": 18, + "x": 8994, + "y": 1125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 18, + "x": 2, + "y": 2 + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1333;20:1305": { + "id": "I20:1333;20:1305", + "type": "VECTOR", + "fields": { + "parentId": "20:1333", + "absoluteBoundingBox": { + "height": 5.99984884262085, + "width": 5.99984884262085, + "x": 9008, + "y": 1139.0001220703125 + }, + "absoluteRenderBounds": { + "height": 5.9998779296875, + "width": 6, + "x": 9008, + "y": 1139.0001220703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 5.99984884262085, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 5.99984884262085, + "x": 16.000076293945312, + "y": 16.000076293945312 + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1351;20:1304": { + "id": "I20:1351;20:1304", + "type": "VECTOR", + "fields": { + "parentId": "20:1351", + "absoluteBoundingBox": { + "height": 18, + "width": 18, + "x": 9048, + "y": 1125 + }, + "absoluteRenderBounds": { + "height": 18, + "width": 18, + "x": 9048, + "y": 1125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 18, + "x": 2, + "y": 2 + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1351;20:1305": { + "id": "I20:1351;20:1305", + "type": "VECTOR", + "fields": { + "parentId": "20:1351", + "absoluteBoundingBox": { + "height": 5.99984884262085, + "width": 5.99984884262085, + "x": 9062, + "y": 1139.0001220703125 + }, + "absoluteRenderBounds": { + "height": 5.9998779296875, + "width": 6, + "x": 9062, + "y": 1139.0001220703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 5.99984884262085, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 5.99984884262085, + "x": 16.000076293945312, + "y": 16.000076293945312 + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1356;20:1304": { + "id": "I20:1356;20:1304", + "type": "VECTOR", + "fields": { + "parentId": "20:1356", + "absoluteBoundingBox": { + "height": 18, + "width": 18, + "x": 9102, + "y": 1125 + }, + "absoluteRenderBounds": { + "height": 18, + "width": 18, + "x": 9102, + "y": 1125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 18, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 18, + "x": 2, + "y": 2 + }, + "extra": {}, + "fieldErrors": {} + }, + "I20:1356;20:1305": { + "id": "I20:1356;20:1305", + "type": "VECTOR", + "fields": { + "parentId": "20:1356", + "absoluteBoundingBox": { + "height": 5.99984884262085, + "width": 5.99984884262085, + "x": 9116, + "y": 1139.0001220703125 + }, + "absoluteRenderBounds": { + "height": 5.9998779296875, + "width": 6, + "x": 9116, + "y": 1139.0001220703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 5.99984884262085, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "visible": true, + "width": 5.99984884262085, + "x": 16.000076293945312, + "y": 16.000076293945312 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_list_type_button_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_list_type_button_set.json new file mode 100644 index 00000000..193daa9b --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_list_type_button_set.json @@ -0,0 +1,1178 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "73:6628" + ], + "nodes": { + "73:6628": { + "id": "73:6628", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "73:6629", + "73:6657", + "73:6633" + ], + "absoluteBoundingBox": { + "height": 80, + "width": 346, + "x": 8801, + "y": 8409 + }, + "absoluteRenderBounds": { + "height": 80, + "width": 346, + "x": 8801, + "y": 8409 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "selected", + "hover" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "73:6629", + "$nodeType": "COMPONENT" + }, + "height": 80, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ListTypeButton", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 346, + "x": 131, + "y": 7371 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6629": { + "id": "73:6629", + "type": "COMPONENT", + "fields": { + "parentId": "73:6628", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:6630", + "73:6631" + ], + "absoluteBoundingBox": { + "height": 40, + "width": 96, + "x": 8821, + "y": 8429 + }, + "absoluteRenderBounds": { + "height": 40, + "width": 96, + "x": 8821, + "y": 8429 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default", + "opacity": 0.699999988079071, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 96, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6630": { + "id": "73:6630", + "type": "INSTANCE", + "fields": { + "parentId": "73:6629", + "childrenIds": [ + "I73:6630;73:6543" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 8833, + "y": 8439 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 8833, + "y": 8439 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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": 4.375, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 4.375, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ListDashes", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 12, + "y": 10, + "mainComponentId": "73:6546", + "mainComponentName": "ListDashes", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6631": { + "id": "73:6631", + "type": "TEXT", + "fields": { + "parentId": "73:6629", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8859, + "y": 8437 + }, + "absoluteRenderBounds": { + "height": 14.3681640625, + "width": 39.216796875, + "x": 8859.5439453125, + "y": 8441.927734375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "목록형", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "최신순", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 38, + "y": 8, + "styledTextSegments": [ + { + "characters": "목록형", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6633": { + "id": "73:6633", + "type": "COMPONENT", + "fields": { + "parentId": "73:6628", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:6634", + "73:6635" + ], + "absoluteBoundingBox": { + "height": 40, + "width": 96, + "x": 8927, + "y": 8429 + }, + "absoluteRenderBounds": { + "height": 40, + "width": 96, + "x": 8927, + "y": 8429 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:2", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 0.9715099334716796, + "r": 0.9487178325653076 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=selected", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "selected" + }, + "visible": true, + "width": 96, + "x": 126, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6634": { + "id": "73:6634", + "type": "INSTANCE", + "fields": { + "parentId": "73:6633", + "childrenIds": [ + "I73:6634;73:6543" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 8939, + "y": 8439 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 8939, + "y": 8439 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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": 4.375, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 4.375, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ListDashes", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 12, + "y": 10, + "mainComponentId": "73:6546", + "mainComponentName": "ListDashes", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6635": { + "id": "73:6635", + "type": "TEXT", + "fields": { + "parentId": "73:6633", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 8965, + "y": 8437 + }, + "absoluteRenderBounds": { + "height": 14.3681640625, + "width": 39.216796875, + "x": 8965.5439453125, + "y": 8441.927734375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "목록형", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "최신순", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 38, + "y": 8, + "styledTextSegments": [ + { + "characters": "목록형", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6657": { + "id": "73:6657", + "type": "COMPONENT", + "fields": { + "parentId": "73:6628", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "73:6658", + "73:6659" + ], + "absoluteBoundingBox": { + "height": 40, + "width": 96, + "x": 9033, + "y": 8429 + }, + "absoluteRenderBounds": { + "height": 40, + "width": 96, + "x": 9033, + "y": 8429 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "counterAxisAlignItems": "CENTER", + "height": 40, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 6, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 6, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 8, + "paddingLeft": 12, + "paddingRight": 16, + "paddingTop": 8, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 8, + "topRightRadius": 8, + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "width": 96, + "x": 232, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6658": { + "id": "73:6658", + "type": "INSTANCE", + "fields": { + "parentId": "73:6657", + "childrenIds": [ + "I73:6658;73:6543" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 9045, + "y": 8439 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 9045, + "y": 8439 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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": 4.375, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 4.375, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ListDashes", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 12, + "y": 10, + "mainComponentId": "73:6546", + "mainComponentName": "ListDashes", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "73:6659": { + "id": "73:6659", + "type": "TEXT", + "fields": { + "parentId": "73:6657", + "absoluteBoundingBox": { + "height": 24, + "width": 42, + "x": 9071, + "y": 8437 + }, + "absoluteRenderBounds": { + "height": 14.3681640625, + "width": 39.216796875, + "x": 9071.5439453125, + "y": 8441.927734375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "목록형", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "최신순", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e,", + "textTruncation": "DISABLED", + "visible": true, + "width": 42, + "x": 38, + "y": 8, + "styledTextSegments": [ + { + "characters": "목록형", + "end": 3, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cbc02b7831f02c3b00e92d3114823bdda982464e," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6630;73:6543": { + "id": "I73:6630;73:6543", + "type": "VECTOR", + "fields": { + "parentId": "73:6630", + "absoluteBoundingBox": { + "height": 11.25, + "width": 15, + "x": 8835.5, + "y": 8443.375 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15, + "x": 8835.5, + "y": 8443.375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.25, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 4.375 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6634;73:6543": { + "id": "I73:6634;73:6543", + "type": "VECTOR", + "fields": { + "parentId": "73:6634", + "absoluteBoundingBox": { + "height": 11.25, + "width": 15, + "x": 8941.5, + "y": 8443.375 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15, + "x": 8941.5, + "y": 8443.375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.25, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 4.375 + }, + "extra": {}, + "fieldErrors": {} + }, + "I73:6658;73:6543": { + "id": "I73:6658;73:6543", + "type": "VECTOR", + "fields": { + "parentId": "73:6658", + "absoluteBoundingBox": { + "height": 11.25, + "width": 15, + "x": 9047.5, + "y": 8443.375 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15, + "x": 9047.5, + "y": 8443.375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 11.25, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 4.375 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_logo_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_logo_set.json new file mode 100644 index 00000000..3667226d --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_logo_set.json @@ -0,0 +1,3665 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "136:19763" + ], + "nodes": { + "136:19763": { + "id": "136:19763", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "37:217", + "136:19764" + ], + "absoluteBoundingBox": { + "height": 416, + "width": 1142, + "x": 10847, + "y": 1294 + }, + "absoluteRenderBounds": { + "height": 416, + "width": 1142, + "x": 10847, + "y": 1294 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "속성 1": { + "defaultValue": "기본", + "type": "VARIANT", + "variantOptions": [ + "기본", + "gray" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "37:217", + "$nodeType": "COMPONENT" + }, + "height": 416, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Logo", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1142, + "x": 2177, + "y": 256 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19764": { + "id": "136:19764", + "type": "COMPONENT", + "fields": { + "parentId": "136:19763", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "136:19765", + "136:19766", + "136:19779" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 1102, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 1102, + "x": 10867, + "y": 1512 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 178, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=gray", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "gray" + }, + "visible": true, + "width": 1102, + "x": 20, + "y": 218 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19765": { + "id": "136:19765", + "type": "VECTOR", + "fields": { + "parentId": "136:19764", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7843137383460999, + "g": 0.7686274647712708, + "r": 0.7490196228027344 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7647058963775635, + "g": 0.7490196228027344, + "r": 0.729411780834198 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7019608020782471, + "g": 0.686274528503418, + "r": 0.6666666865348816 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.686274528503418, + "g": 0.6705882549285889, + "r": 0.6509804129600525 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.6666666865348816, + "r": 0.6470588445663452 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19766": { + "id": "136:19766", + "type": "GROUP", + "fields": { + "parentId": "136:19764", + "childrenIds": [ + "136:19767", + "136:19769" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "height": 178, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19767": { + "id": "136:19767", + "type": "GROUP", + "fields": { + "parentId": "136:19766", + "childrenIds": [ + "136:19768" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": null, + "height": 178, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19768": { + "id": "136:19768", + "type": "VECTOR", + "fields": { + "parentId": "136:19767", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19769": { + "id": "136:19769", + "type": "GROUP", + "fields": { + "parentId": "136:19766", + "childrenIds": [ + "136:19770", + "136:19771", + "136:19772", + "136:19773", + "136:19774", + "136:19775", + "136:19776", + "136:19777", + "136:19778" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19770": { + "id": "136:19770", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.6705882549285889, + "g": 0.6549019813537598, + "r": 0.6352941393852234 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19771": { + "id": "136:19771", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1512 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8156862854957581, + "g": 0.800000011920929, + "r": 0.7803921699523926 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19772": { + "id": "136:19772", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 37.27400207519531, + "width": 72.59410095214844, + "x": 10963.125, + "y": 1638.8858642578125 + }, + "absoluteRenderBounds": { + "height": 37.2740478515625, + "width": 72.59375, + "x": 10963.125, + "y": 1638.8858642578125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 37.27400207519531, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 72.59410095214844, + "x": 96.12515258789062, + "y": 126.88589477539062 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19773": { + "id": "136:19773", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 101.65419006347656, + "width": 101.57887268066406, + "x": 10887.373046875, + "y": 1548.818115234375 + }, + "absoluteRenderBounds": { + "height": 101.6541748046875, + "width": 101.5791015625, + "x": 10887.373046875, + "y": 1548.818115234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8784313797950745, + "g": 0.8627451062202454, + "r": 0.843137264251709 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7803921699523926, + "g": 0.7647058963775635, + "r": 0.7450980544090271 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 101.65419006347656, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 101.57887268066406, + "x": 20.373069763183594, + "y": 36.818145751953125 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19774": { + "id": "136:19774", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 60.4782829284668, + "width": 60.47827911376953, + "x": 10905.2109375, + "y": 1569.554443359375 + }, + "absoluteRenderBounds": { + "height": 60.478271484375, + "width": 60.478515625, + "x": 10905.2109375, + "y": 1569.554443359375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.9647058844566344, + "r": 0.945098042488098 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 60.4782829284668, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 60.47827911376953, + "x": 38.210899353027344, + "y": 57.55449295043945 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19775": { + "id": "136:19775", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 32.88132858276367, + "width": 32.88132858276367, + "x": 10918.421875, + "y": 1582.765380859375 + }, + "absoluteRenderBounds": { + "height": 32.88134765625, + "width": 32.880859375, + "x": 10918.421875, + "y": 1582.765380859375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7529411911964417, + "g": 0.7372549176216125, + "r": 0.7176470756530762 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.729411780834198, + "g": 0.7137255072593689, + "r": 0.6941176652908325 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 32.88132858276367, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.88132858276367, + "x": 51.421836853027344, + "y": 70.76543426513672 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19776": { + "id": "136:19776", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 145.2490692138672, + "width": 151.74325561523438, + "x": 10867.23046875, + "y": 1528.1748046875 + }, + "absoluteRenderBounds": { + "height": 145.2490234375, + "width": 151.7431640625, + "x": 10867.23046875, + "y": 1528.1748046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9607843160629272, + "g": 0.945098042488098, + "r": 0.9254902005195618 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8823529481887817, + "g": 0.8666666746139526, + "r": 0.8470588326454163 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8509804010391235, + "g": 0.8352941274642944, + "r": 0.8156862854957581 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 145.2490692138672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 151.74325561523438, + "x": 0.23043431341648105, + "y": 16.174827575683594 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19777": { + "id": "136:19777", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 83.3648681640625, + "width": 151.09185791015625, + "x": 10886.0341796875, + "y": 1569.19287109375 + }, + "absoluteRenderBounds": { + "height": 83.3648681640625, + "width": 151.091796875, + "x": 10886.0341796875, + "y": 1569.19287109375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 83.3648681640625, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 151.09185791015625, + "x": 19.033720016479492, + "y": 57.192928314208984 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19778": { + "id": "136:19778", + "type": "VECTOR", + "fields": { + "parentId": "136:19769", + "absoluteBoundingBox": { + "height": 44.28451156616211, + "width": 98.18855285644533, + "x": 10887.1845703125, + "y": 1548.9384765625 + }, + "absoluteRenderBounds": { + "height": 44.2845458984375, + "width": 98.1884765625, + "x": 10887.1845703125, + "y": 1548.9384765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9960784316062928, + "g": 0.9803921580314636, + "r": 0.9607843160629272 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9647058844566344, + "g": 0.9490196108818054, + "r": 0.929411768913269 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9254902005195618, + "g": 0.9098039269447328, + "r": 0.8901960849761963 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8705882430076599, + "g": 0.8549019694328308, + "r": 0.8352941274642944 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.843137264251709, + "g": 0.8274509906768799, + "r": 0.8078431487083435 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8313725590705872, + "g": 0.8156862854957581, + "r": 0.7960784435272217 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 44.28451156616211, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 98.18855285644533, + "x": 20.18492317199707, + "y": 36.938419342041016 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19779": { + "id": "136:19779", + "type": "GROUP", + "fields": { + "parentId": "136:19764", + "childrenIds": [ + "136:19780", + "136:19781", + "136:19782", + "136:19783", + "136:19784", + "136:19785", + "136:19786", + "136:19787", + "136:19788", + "136:19789" + ], + "absoluteBoundingBox": { + "height": 105.2799835205078, + "width": 875.4388427734375, + "x": 11093.16015625, + "y": 1547.1201171875 + }, + "absoluteRenderBounds": { + "height": 105.280029296875, + "width": 875.4388427734375, + "x": 11093.16015625, + "y": 1547.1201171875 + }, + "height": 105.2799835205078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 875.4388427734375, + "x": 226.16015625, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19780": { + "id": "136:19780", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 73.6400146484375, + "x": 11894.958984375, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 73.6396484375, + "x": 11894.958984375, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.6400146484375, + "x": 1027.95947265625, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19781": { + "id": "136:19781", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 76.44000244140625, + "x": 11804.509765625, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 76.4404296875, + "x": 11804.509765625, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 76.44000244140625, + "x": 937.509765625, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19782": { + "id": "136:19782", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 100.8000030517578, + "width": 92.4000244140625, + "x": 11700.005859375, + "y": 1551.60009765625 + }, + "absoluteRenderBounds": { + "height": 100.800048828125, + "width": 92.400390625, + "x": 11700.005859375, + "y": 1551.60009765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7964744567871094, + "g": 0.7761158347129822, + "r": 0.7543532252311707 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100.8000030517578, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 92.4000244140625, + "x": 833.00537109375, + "y": 39.60009765625 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19783": { + "id": "136:19783", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 79.65997314453125, + "x": 11611.73046875, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 79.66015625, + "x": 11611.73046875, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.65997314453125, + "x": 744.73095703125, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19784": { + "id": "136:19784", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 43.259979248046875, + "x": 11563.26953125, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 43.259765625, + "x": 11563.26953125, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 43.259979248046875, + "x": 696.26904296875, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19785": { + "id": "136:19785", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 104.86000061035156, + "width": 79.239990234375, + "x": 11463.7958984375, + "y": 1547.1201171875 + }, + "absoluteRenderBounds": { + "height": 104.8599853515625, + "width": 79.240234375, + "x": 11463.7958984375, + "y": 1547.1201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 104.86000061035156, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.239990234375, + "x": 596.7958984375, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19786": { + "id": "136:19786", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 73.63998413085938, + "x": 11376.779296875, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 73.6396484375, + "x": 11376.779296875, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.63998413085938, + "x": 509.779296875, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19787": { + "id": "136:19787", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 79.66000366210938, + "x": 11283.185546875, + "y": 1575.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 79.66015625, + "x": 11283.185546875, + "y": 1575.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.66000366210938, + "x": 416.18505859375, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19788": { + "id": "136:19788", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 103.8800048828125, + "width": 73.64000701904297, + "x": 11196.16796875, + "y": 1547.1201171875 + }, + "absoluteRenderBounds": { + "height": 103.8800048828125, + "width": 73.6396484375, + "x": 11196.16796875, + "y": 1547.1201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 103.8800048828125, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.64000701904297, + "x": 329.16845703125, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:19789": { + "id": "136:19789", + "type": "VECTOR", + "fields": { + "parentId": "136:19779", + "absoluteBoundingBox": { + "height": 100.8000030517578, + "width": 91.27999877929688, + "x": 11093.16015625, + "y": 1551.60009765625 + }, + "absoluteRenderBounds": { + "height": 100.800048828125, + "width": 91.2802734375, + "x": 11093.16015625, + "y": 1551.60009765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.7291667461395264, + "g": 0.7133524417877197, + "r": 0.6952789425849915 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100.8000030517578, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 91.27999877929688, + "x": 226.16015625, + "y": 39.60009765625 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9027": { + "id": "136:9027", + "type": "VECTOR", + "fields": { + "parentId": "37:217", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7490196228027344, + "g": 0.5607843399047852, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6823529601097107, + "g": 0.5058823823928833, + "r": 0.007843137718737125 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5607843399047852, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 0.44999998807907104 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.46666666865348816, + "g": 0.2823529541492462, + "r": 0 + }, + "position": 0.6100000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.40784314274787903, + "g": 0.22745098173618317, + "r": 0 + }, + "position": 0.7599999904632568 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2078431397676468, + "r": 0.003921568859368563 + }, + "position": 0.9100000262260436 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.3843137323856354, + "g": 0.2117647081613541, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.6454866528511047, + 0, + 0.31524205207824707 + ], + [ + 0, + 0.6454866528511047, + 0.204462930560112 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9028": { + "id": "136:9028", + "type": "GROUP", + "fields": { + "parentId": "37:217", + "childrenIds": [ + "136:9029", + "136:9031" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "height": 178, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Clip path group", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9029": { + "id": "136:9029", + "type": "GROUP", + "fields": { + "parentId": "136:9028", + "childrenIds": [ + "136:9030" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": null, + "height": 178, + "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" + }, + "isMask": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "sphere-clip", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9030": { + "id": "136:9030", + "type": "VECTOR", + "fields": { + "parentId": "136:9029", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9031": { + "id": "136:9031", + "type": "GROUP", + "fields": { + "parentId": "136:9028", + "childrenIds": [ + "136:9032", + "136:9033", + "136:9034", + "136:9035", + "136:9036", + "136:9037", + "136:9038", + "136:9039", + "136:9040" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Group", + "opacity": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9032": { + "id": "136:9032", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.41999998688697815, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.20000000298023224, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 0.550000011920929 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.3333333432674408, + "g": 0.16470588743686676, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.252997875213623, + 0, + 0.08783221244812012 + ], + [ + 0, + 1.252997875213623, + -0.7154324054718018 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "shade-outside-orbit", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9033": { + "id": "136:9033", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 178, + "x": 10867, + "y": 1314 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0.14000000059604645, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.8470588326454163, + "g": 0.6509804129600525, + "r": 0.10588235408067705 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 1.9364598989486697, + 0, + 0.468456894159317 + ], + [ + 0, + 1.9364598989486697, + -0.5502269268035889 + ] + ], + "opacity": 1, + "type": "GRADIENT_RADIAL", + "visible": true + } + ], + "height": 178, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "light-left-overlay", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 178, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9034": { + "id": "136:9034", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 37.27400207519531, + "width": 72.59410095214844, + "x": 10963.125, + "y": 1440.8858642578125 + }, + "absoluteRenderBounds": { + "height": 37.2740478515625, + "width": 72.59375, + "x": 10963.125, + "y": 1440.8858642578125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 0.550000011920929, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.30000001192092896 + }, + { + "boundVariables": {}, + "color": { + "a": 0.5, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 0.75 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.5764706134796143, + "g": 0.3529411852359772, + "r": 0.04313725605607033 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8151227831840515, + -0.2092042565345764, + 0.19614684581756592 + ], + [ + 0.4074420928955078, + 0.41853103041648865, + 0.08879981189966202 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 37.27400207519531, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "rim-highlight (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 3.849999904632568, + "visible": true, + "width": 72.59410095214844, + "x": 96.12515258789062, + "y": 126.88589477539062 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9035": { + "id": "136:9035", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 101.65419006347656, + "width": 101.57887268066406, + "x": 10887.373046875, + "y": 1350.818115234375 + }, + "absoluteRenderBounds": { + "height": 101.6541748046875, + "width": 101.5791015625, + "x": 10887.373046875, + "y": 1350.818115234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8156862854957581, + "g": 0.7843137383460999, + "r": 0.03921568766236305 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.5882353186607361, + "g": 0.4313725531101227, + "r": 0 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8613659739494324, + 0.45280781388282776, + -0.1629999577999115 + ], + [ + -0.4524722993373871, + 0.8620046973228455, + 0.31514695286750793 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 101.65419006347656, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "core", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 101.57887268066406, + "x": 20.373069763183594, + "y": 36.818145751953125 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9036": { + "id": "136:9036", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 60.4782829284668, + "width": 60.47827911376953, + "x": 10905.2109375, + "y": 1371.554443359375 + }, + "absoluteRenderBounds": { + "height": 60.478271484375, + "width": 60.478515625, + "x": 10905.2109375, + "y": 1371.554443359375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8745098114013672, + "g": 0.9333333373069764, + "r": 0.6705882549285889 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.7607843279838562, + "g": 0.7215686440467834, + "r": 0.0235294122248888 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.8080573678016663, + 0.5874120593070984, + -0.19792257249355316 + ], + [ + -0.5874120593070984, + 0.8080573678016663, + 0.3895654380321502 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 60.4782829284668, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 60.47827911376953, + "x": 38.210899353027344, + "y": 57.55449295043945 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9037": { + "id": "136:9037", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 32.88132858276367, + "width": 32.88132858276367, + "x": 10918.421875, + "y": 1384.765380859375 + }, + "absoluteRenderBounds": { + "height": 32.88134765625, + "width": 32.880859375, + "x": 10918.421875, + "y": 1384.765380859375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.6196078658103943, + "g": 0.4745098054409027, + "r": 0.007843137718737125 + }, + "position": 0 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.545098066329956, + "g": 0.3764705955982208, + "r": 0.003921568859368563 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9339293241500854, + 0.3536636531352997, + -0.14337609708309174 + ], + [ + -0.3536636531352997, + 0.9339293241500854, + 0.2099337726831436 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 32.88132858276367, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ring-center", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 32.88132858276367, + "x": 51.421836853027344, + "y": 70.76543426513672 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9038": { + "id": "136:9038", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 145.2490692138672, + "width": 151.74325561523438, + "x": 10867.23046875, + "y": 1330.1748046875 + }, + "absoluteRenderBounds": { + "height": 145.2490234375, + "width": 151.7431640625, + "x": 10867.23046875, + "y": 1330.1748046875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9764705896377563, + "r": 0.9607843160629272 + }, + "position": 0.1899999976158142 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9803921580314636, + "g": 0.91372549533844, + "r": 0.7764706015586853 + }, + "position": 0.3799999952316284 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9725490212440492, + "g": 0.8588235378265381, + "r": 0.6039215922355652 + }, + "position": 0.5 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.95686274766922, + "g": 0.7843137383460999, + "r": 0.3843137323856354 + }, + "position": 0.6600000262260437 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9333333373069764, + "g": 0.729411780834198, + "r": 0.21960784494876864 + }, + "position": 0.8399999737739563 + } + ], + "gradientTransform": [ + [ + -1.6364001035690308, + 1.5055831670761108, + -0.08484271168708801 + ], + [ + -1.5728986263275146, + -1.5663667917251587, + 2.0555288791656494 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 145.2490692138672, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-outer (Stroke)", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 5.050000190734863, + "visible": true, + "width": 151.74325561523438, + "x": 0.23043431341648105, + "y": 16.174827575683594 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9039": { + "id": "136:9039", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 83.3648681640625, + "width": 151.09185791015625, + "x": 10886.0341796875, + "y": 1371.19287109375 + }, + "absoluteRenderBounds": { + "height": 83.3648681640625, + "width": 151.091796875, + "x": 10886.0341796875, + "y": 1371.19287109375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 83.3648681640625, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 151.09185791015625, + "x": 19.033720016479492, + "y": 57.192928314208984 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9040": { + "id": "136:9040", + "type": "VECTOR", + "fields": { + "parentId": "136:9031", + "absoluteBoundingBox": { + "height": 44.28451156616211, + "width": 98.18855285644533, + "x": 10887.1845703125, + "y": 1350.9384765625 + }, + "absoluteRenderBounds": { + "height": 44.2845458984375, + "width": 98.1884765625, + "x": 10887.1845703125, + "y": 1350.9384765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "gradientStops": [ + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9843137264251708, + "g": 0.9803921580314636, + "r": 0.9647058844566344 + }, + "position": 0.029999999329447743 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.9176470637321472, + "g": 0.9529411792755128, + "r": 0.7686274647712708 + }, + "position": 0.119999997317791 + }, + { + "boundVariables": {}, + "color": { + "a": 1, + "b": 0.8549019694328308, + "g": 0.8941176533699036, + "r": 0.5607843399047852 + }, + "position": 0.3499999940395355 + }, + { + "boundVariables": {}, + "color": { + "a": 0.8999999761581421, + "b": 0.8274509906768799, + "g": 0.8156862854957581, + "r": 0.2705882489681244 + }, + "position": 0.6200000047683716 + }, + { + "boundVariables": {}, + "color": { + "a": 0.6000000238418579, + "b": 0.8039215803146362, + "g": 0.7607843279838562, + "r": 0.14901961386203766 + }, + "position": 0.8600000143051147 + }, + { + "boundVariables": {}, + "color": { + "a": 0, + "b": 0.772549033164978, + "g": 0.7215686440467834, + "r": 0.11372549086809158 + }, + "position": 1 + } + ], + "gradientTransform": [ + [ + 0.9895601272583008, + -0.06226864457130432, + 0.0533602200448513 + ], + [ + 0.13806335628032684, + 0.446306437253952, + 0.05430806800723076 + ] + ], + "opacity": 1, + "type": "GRADIENT_LINEAR", + "visible": true + } + ], + "height": 44.28451156616211, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "orbit-inner-tail", + "opacity": 1, + "strokeWeight": 1, + "visible": true, + "width": 98.18855285644533, + "x": 20.18492317199707, + "y": 36.938419342041016 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9041": { + "id": "136:9041", + "type": "GROUP", + "fields": { + "parentId": "37:217", + "childrenIds": [ + "136:9042", + "136:9043", + "136:9044", + "136:9045", + "136:9046", + "136:9047", + "136:9048", + "136:9049", + "136:9050", + "136:9051" + ], + "absoluteBoundingBox": { + "height": 105.2799835205078, + "width": 875.4388427734375, + "x": 11093.16015625, + "y": 1349.1201171875 + }, + "absoluteRenderBounds": { + "height": 105.280029296875, + "width": 875.4388427734375, + "x": 11093.16015625, + "y": 1349.1201171875 + }, + "height": 105.2799835205078, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "ChondroGen", + "opacity": 1, + "visible": true, + "width": 875.4388427734375, + "x": 226.16015625, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9042": { + "id": "136:9042", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 73.6400146484375, + "x": 11894.958984375, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 73.6396484375, + "x": 11894.958984375, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.6400146484375, + "x": 1027.95947265625, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9043": { + "id": "136:9043", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 76.44000244140625, + "x": 11804.509765625, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 76.4404296875, + "x": 11804.509765625, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 76.44000244140625, + "x": 937.509765625, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9044": { + "id": "136:9044", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 100.8000030517578, + "width": 92.4000244140625, + "x": 11700.005859375, + "y": 1353.60009765625 + }, + "absoluteRenderBounds": { + "height": 100.800048828125, + "width": 92.400390625, + "x": 11700.005859375, + "y": 1353.60009765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.6980392336845398, + "g": 0.6117647290229797, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100.8000030517578, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 92.4000244140625, + "x": 833.00537109375, + "y": 39.60009765625 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9045": { + "id": "136:9045", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 79.65997314453125, + "x": 11611.73046875, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 79.66015625, + "x": 11611.73046875, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.65997314453125, + "x": 744.73095703125, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9046": { + "id": "136:9046", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 43.259979248046875, + "x": 11563.26953125, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 43.259765625, + "x": 11563.26953125, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 43.259979248046875, + "x": 696.26904296875, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9047": { + "id": "136:9047", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 104.86000061035156, + "width": 79.239990234375, + "x": 11463.7958984375, + "y": 1349.1201171875 + }, + "absoluteRenderBounds": { + "height": 104.8599853515625, + "width": 79.240234375, + "x": 11463.7958984375, + "y": 1349.1201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 104.86000061035156, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.239990234375, + "x": 596.7958984375, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9048": { + "id": "136:9048", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 75.60000610351562, + "width": 73.63998413085938, + "x": 11376.779296875, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 75.5999755859375, + "width": 73.6396484375, + "x": 11376.779296875, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 75.60000610351562, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.63998413085938, + "x": 509.779296875, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9049": { + "id": "136:9049", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 76.58000183105469, + "width": 79.66000366210938, + "x": 11283.185546875, + "y": 1377.39990234375 + }, + "absoluteRenderBounds": { + "height": 76.5799560546875, + "width": 79.66015625, + "x": 11283.185546875, + "y": 1377.39990234375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 76.58000183105469, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 79.66000366210938, + "x": 416.18505859375, + "y": 63.39990234375 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9050": { + "id": "136:9050", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 103.8800048828125, + "width": 73.64000701904297, + "x": 11196.16796875, + "y": 1349.1201171875 + }, + "absoluteRenderBounds": { + "height": 103.8800048828125, + "width": 73.6396484375, + "x": 11196.16796875, + "y": 1349.1201171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 103.8800048828125, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 73.64000701904297, + "x": 329.16845703125, + "y": 35.1201171875 + }, + "extra": {}, + "fieldErrors": {} + }, + "136:9051": { + "id": "136:9051", + "type": "VECTOR", + "fields": { + "parentId": "136:9041", + "absoluteBoundingBox": { + "height": 100.8000030517578, + "width": 91.27999877929688, + "x": 11093.16015625, + "y": 1353.60009765625 + }, + "absoluteRenderBounds": { + "height": 100.800048828125, + "width": 91.2802734375, + "x": 11093.16015625, + "y": 1353.60009765625 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3803921639919281, + "g": 0.2078431397676468, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100.8000030517578, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "visible": true, + "width": 91.27999877929688, + "x": 226.16015625, + "y": 39.60009765625 + }, + "extra": {}, + "fieldErrors": {} + }, + "37:217": { + "id": "37:217", + "type": "COMPONENT", + "fields": { + "parentId": "136:19763", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "136:9027", + "136:9028", + "136:9041" + ], + "absoluteBoundingBox": { + "height": 178, + "width": 1102, + "x": 10867, + "y": 1314 + }, + "absoluteRenderBounds": { + "height": 178, + "width": 1102, + "x": 10867, + "y": 1314 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 178, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "속성 1=기본", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "기본" + }, + "visible": true, + "width": 1102, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_page_title_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_page_title_set.json new file mode 100644 index 00000000..21ce158a --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_page_title_set.json @@ -0,0 +1,5557 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "43:1158" + ], + "nodes": { + "40:544": { + "id": "40:544", + "type": "FRAME", + "fields": { + "parentId": "40:558", + "childrenIds": [ + "40:545", + "40:546" + ], + "absoluteBoundingBox": { + "height": 108, + "width": 1280, + "x": 10646, + "y": 6231 + }, + "absoluteRenderBounds": { + "height": 108, + "width": 1280, + "x": 10646, + "y": 6231 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 108, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 24, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 479", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 100, + "y": 150 + }, + "extra": {}, + "fieldErrors": {} + }, + "40:545": { + "id": "40:545", + "type": "TEXT", + "fields": { + "parentId": "40:544", + "absoluteBoundingBox": { + "height": 63, + "width": 1280, + "x": 10646, + "y": 6231 + }, + "absoluteRenderBounds": { + "height": 43.34375, + "width": 119.234375, + "x": 11227.1982421875, + "y": 6240.83203125 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:23:1559", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "타이틀", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 48, + "height": 63, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "타이틀", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1280, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "타이틀", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "40:546": { + "id": "40:546", + "type": "INSTANCE", + "fields": { + "parentId": "40:544", + "childrenIds": [ + "I40:546;40:503", + "I40:546;40:504", + "I40:546;40:505", + "I40:546;40:506", + "I40:546;40:507", + "I40:546;40:508", + "I40:546;40:509" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 287, + "x": 11142.5, + "y": 6318 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 287, + "x": 11142.5, + "y": 6318 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "depth2#44:8": { + "type": "BOOLEAN", + "value": true + }, + "depth3#44:5": { + "type": "BOOLEAN", + "value": true + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "white" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 21, + "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" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Breadcurmb", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "white" + }, + "visible": true, + "width": 287, + "x": 496.5, + "y": 87, + "mainComponentId": "40:515", + "mainComponentName": "type=white", + "mainComponentSetId": "40:530" + }, + "extra": {}, + "fieldErrors": {} + }, + "40:558": { + "id": "40:558", + "type": "COMPONENT", + "fields": { + "parentId": "43:1158", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "40:544" + ], + "absoluteBoundingBox": { + "height": 360, + "width": 1480, + "x": 10546, + "y": 6081 + }, + "absoluteRenderBounds": { + "height": 360, + "width": 1480, + "x": 10546, + "y": 6081 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingTop": { + "id": "VariableID:30:632", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.6000000238418579, + "type": "SOLID", + "visible": true + } + ], + "height": 360, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 80, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Desktop, type=Image", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 80, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Image", + "viewport": "Desktop" + }, + "visible": true, + "width": 1480, + "x": 21, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1158": { + "id": "43:1158", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "40:558", + "43:1159", + "44:4929", + "44:4933" + ], + "absoluteBoundingBox": { + "height": 1260, + "width": 1522, + "x": 10525, + "y": 6060 + }, + "absoluteRenderBounds": { + "height": 1260, + "width": 1522, + "x": 10525, + "y": 6060 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "Slot#43:2": { + "description": null, + "preferredValues": [], + "type": "SLOT" + }, + "type": { + "defaultValue": "Image", + "type": "VARIANT", + "variantOptions": [ + "Image", + "White" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "40:558", + "$nodeType": "COMPONENT" + }, + "height": 1260, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "PageTitle", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1522, + "x": 1855, + "y": 5022 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1159": { + "id": "43:1159", + "type": "COMPONENT", + "fields": { + "parentId": "43:1158", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "43:1160" + ], + "absoluteBoundingBox": { + "height": 280, + "width": 360, + "x": 10546, + "y": 6461 + }, + "absoluteRenderBounds": { + "height": 280, + "width": 360, + "x": 10546, + "y": 6461 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingTop": { + "id": "VariableID:30:632", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "opacity": 0.6000000238418579, + "type": "SOLID", + "visible": true + } + ], + "height": 280, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 16, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Mobile, type=Image", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 16, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 40, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Image", + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 21, + "y": 401 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1160": { + "id": "43:1160", + "type": "FRAME", + "fields": { + "parentId": "43:1159", + "childrenIds": [ + "43:1161", + "43:1162" + ], + "absoluteBoundingBox": { + "height": 78, + "width": 320, + "x": 10566, + "y": 6574 + }, + "absoluteRenderBounds": { + "height": 78, + "width": 320, + "x": 10566, + "y": 6574 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 78, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 479", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 320, + "x": 20, + "y": 113 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1161": { + "id": "43:1161", + "type": "TEXT", + "fields": { + "parentId": "43:1160", + "absoluteBoundingBox": { + "height": 42, + "width": 320, + "x": 10566, + "y": 6574 + }, + "absoluteRenderBounds": { + "height": 28.89599609375, + "width": 79.4892578125, + "x": 10686.798828125, + "y": 6580.88818359375 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:23:1559", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "타이틀", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 32, + "height": 42, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "타이틀", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8,", + "textTruncation": "DISABLED", + "visible": true, + "width": 320, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "타이틀", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1162": { + "id": "43:1162", + "type": "INSTANCE", + "fields": { + "parentId": "43:1160", + "childrenIds": [ + "I43:1162;40:503", + "I43:1162;40:504", + "I43:1162;40:505", + "I43:1162;40:506", + "I43:1162;40:507", + "I43:1162;40:508", + "I43:1162;40:509" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 276, + "x": 10588, + "y": 6632 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 276, + "x": 10588, + "y": 6632 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "depth2#44:8": { + "type": "BOOLEAN", + "value": true + }, + "depth3#44:5": { + "type": "BOOLEAN", + "value": true + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "white" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 20, + "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" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Breadcurmb", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "white" + }, + "visible": true, + "width": 276, + "x": 22, + "y": 58, + "mainComponentId": "40:515", + "mainComponentName": "type=white", + "mainComponentSetId": "40:530" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4929": { + "id": "44:4929", + "type": "COMPONENT", + "fields": { + "parentId": "43:1158", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:4930" + ], + "absoluteBoundingBox": { + "height": 316, + "width": 1480, + "x": 10546, + "y": 6761 + }, + "absoluteRenderBounds": { + "height": 316, + "width": 1480, + "x": 10546, + "y": 6761 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + ], + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 316, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 64, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 144, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Desktop, type=White", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 64, + "paddingLeft": 40, + "paddingRight": 40, + "paddingTop": 144, + "primaryAxisAlignItems": "MAX", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "White", + "viewport": "Desktop" + }, + "visible": true, + "width": 1480, + "x": 21, + "y": 701 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4930": { + "id": "44:4930", + "type": "FRAME", + "fields": { + "parentId": "44:4929", + "childrenIds": [ + "44:4931", + "44:4932" + ], + "absoluteBoundingBox": { + "height": 108, + "width": 1280, + "x": 10646, + "y": 6905 + }, + "absoluteRenderBounds": { + "height": 108, + "width": 1280, + "x": 10646, + "y": 6905 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 108, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 24, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 479", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1280, + "x": 100, + "y": 144 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4931": { + "id": "44:4931", + "type": "TEXT", + "fields": { + "parentId": "44:4930", + "absoluteBoundingBox": { + "height": 63, + "width": 1280, + "x": 10646, + "y": 6905 + }, + "absoluteRenderBounds": { + "height": 43.34375, + "width": 119.234375, + "x": 11227.1982421875, + "y": 6914.83203125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:23:1559", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "타이틀", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 48, + "height": 63, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "타이틀", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1280, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "타이틀", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4932": { + "id": "44:4932", + "type": "INSTANCE", + "fields": { + "parentId": "44:4930", + "childrenIds": [ + "I44:4932;40:532", + "I44:4932;40:533", + "I44:4932;40:534", + "I44:4932;40:535", + "I44:4932;40:536", + "I44:4932;40:537", + "I44:4932;40:538" + ], + "absoluteBoundingBox": { + "height": 21, + "width": 287, + "x": 11142.5, + "y": 6992 + }, + "absoluteRenderBounds": { + "height": 21, + "width": 287, + "x": 11142.5, + "y": 6992 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "depth2#44:8": { + "type": "BOOLEAN", + "value": true + }, + "depth3#44:5": { + "type": "BOOLEAN", + "value": true + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "color" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 21, + "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" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Breadcurmb", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "color" + }, + "visible": true, + "width": 287, + "x": 496.5, + "y": 87, + "mainComponentId": "40:531", + "mainComponentName": "type=color", + "mainComponentSetId": "40:530" + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4933": { + "id": "44:4933", + "type": "COMPONENT", + "fields": { + "parentId": "43:1158", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:4934" + ], + "absoluteBoundingBox": { + "height": 202, + "width": 360, + "x": 10546, + "y": 7097 + }, + "absoluteRenderBounds": { + "height": 202, + "width": 360, + "x": 10546, + "y": 7097 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + ], + "paddingLeft": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + }, + "paddingRight": { + "id": "VariableID:30:628", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:350", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 202, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 92, + "primaryAxisAlignItems": "MAX", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "viewport=Mobile, type=White", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 92, + "primaryAxisAlignItems": "MAX", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "White", + "viewport": "Mobile" + }, + "visible": true, + "width": 360, + "x": 21, + "y": 1037 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4934": { + "id": "44:4934", + "type": "FRAME", + "fields": { + "parentId": "44:4933", + "childrenIds": [ + "44:4935", + "44:4936" + ], + "absoluteBoundingBox": { + "height": 78, + "width": 320, + "x": 10566, + "y": 7189 + }, + "absoluteRenderBounds": { + "height": 78, + "width": 320, + "x": 10566, + "y": 7189 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 78, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": 1280, + "name": "Frame 479", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 320, + "x": 20, + "y": 92 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4935": { + "id": "44:4935", + "type": "TEXT", + "fields": { + "parentId": "44:4934", + "absoluteBoundingBox": { + "height": 42, + "width": 320, + "x": 10566, + "y": 7189 + }, + "absoluteRenderBounds": { + "height": 28.89599609375, + "width": 79.4892578125, + "x": 10686.798828125, + "y": 7195.88818359375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:23:1559", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "타이틀", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 32, + "height": 42, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "타이틀", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8,", + "textTruncation": "DISABLED", + "visible": true, + "width": 320, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "타이틀", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:82867982bb8f7eff7b35bc2fef1bc1a06ee8a0c8," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "44:4936": { + "id": "44:4936", + "type": "INSTANCE", + "fields": { + "parentId": "44:4934", + "childrenIds": [ + "I44:4936;40:532", + "I44:4936;40:533", + "I44:4936;40:534", + "I44:4936;40:535", + "I44:4936;40:536", + "I44:4936;40:537", + "I44:4936;40:538" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 276, + "x": 10588, + "y": 7247 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 276, + "x": 10588, + "y": 7247 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "componentProperties": { + "depth2#44:8": { + "type": "BOOLEAN", + "value": true + }, + "depth3#44:5": { + "type": "BOOLEAN", + "value": true + }, + "type": { + "boundVariables": {}, + "type": "VARIANT", + "value": "color" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 20, + "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" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Breadcurmb", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "color" + }, + "visible": true, + "width": 276, + "x": 22, + "y": 58, + "mainComponentId": "40:531", + "mainComponentName": "type=color", + "mainComponentSetId": "40:530" + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:503": { + "id": "I40:546;40:503", + "type": "INSTANCE", + "fields": { + "parentId": "40:546", + "childrenIds": [ + "I40:546;40:503;40:453" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 11142.5, + "y": 6318.5 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 11142.5, + "y": 6318.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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.499999523162842, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 1.8755793571472168, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "House", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 0, + "y": 0.5, + "mainComponentId": "40:454", + "mainComponentName": "House", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:503;40:453": { + "id": "I40:546;40:503;40:453", + "type": "VECTOR", + "fields": { + "parentId": "I40:546;40:503", + "absoluteBoundingBox": { + "height": 15.62442111968994, + "width": 15, + "x": 11145, + "y": 6320.37548828125 + }, + "absoluteRenderBounds": { + "height": 15.62451171875, + "width": 15, + "x": 11145, + "y": 6320.37548828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.62442111968994, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 1.8755793571472168 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:504": { + "id": "I40:546;40:504", + "type": "INSTANCE", + "fields": { + "parentId": "40:546", + "childrenIds": [ + "I40:546;40:504;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11174.5, + "y": 6322.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11174.5, + "y": 6322.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 32, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:504;40:476": { + "id": "I40:546;40:504;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I40:546;40:504", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11178.625, + "y": 6324.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11178.625, + "y": 6324.37451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:505": { + "id": "I40:546;40:505", + "type": "TEXT", + "fields": { + "parentId": "40:546", + "absoluteBoundingBox": { + "height": 21, + "width": 51, + "x": 11198.5, + "y": 6318 + }, + "absoluteRenderBounds": { + "height": 13.30029296875, + "width": 48.4375, + "x": 11199.6337890625, + "y": 6323.77978515625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 51, + "x": 56, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth1", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:506": { + "id": "I40:546;40:506", + "type": "INSTANCE", + "fields": { + "parentId": "40:546", + "childrenIds": [ + "I40:546;40:506;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11261.5, + "y": 6322.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11261.5, + "y": 6322.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "depth2#44:8" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 119, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:506;40:476": { + "id": "I40:546;40:506;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I40:546;40:506", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11265.625, + "y": 6324.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11265.625, + "y": 6324.37451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:507": { + "id": "I40:546;40:507", + "type": "TEXT", + "fields": { + "parentId": "40:546", + "absoluteBoundingBox": { + "height": 21, + "width": 54, + "x": 11285.5, + "y": 6318 + }, + "absoluteRenderBounds": { + "height": 13.328125, + "width": 51.3359375, + "x": 11286.6337890625, + "y": 6323.751953125 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth2", + "componentPropertyReferences": { + "visible": "depth2#44:8" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth2", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 54, + "x": 143, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth2", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:508": { + "id": "I40:546;40:508", + "type": "INSTANCE", + "fields": { + "parentId": "40:546", + "childrenIds": [ + "I40:546;40:508;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11351.5, + "y": 6322.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11351.5, + "y": 6322.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "depth3#44:5" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 209, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:508;40:476": { + "id": "I40:546;40:508;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I40:546;40:508", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11355.625, + "y": 6324.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11355.625, + "y": 6324.37451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I40:546;40:509": { + "id": "I40:546;40:509", + "type": "TEXT", + "fields": { + "parentId": "40:546", + "absoluteBoundingBox": { + "height": 21, + "width": 54, + "x": 11375.5, + "y": 6318 + }, + "absoluteRenderBounds": { + "height": 13.31396484375, + "width": 51.5458984375, + "x": 11376.6337890625, + "y": 6323.76611328125 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth3", + "componentPropertyReferences": { + "visible": "depth3#44:5" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth3", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 54, + "x": 233, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth3", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:503": { + "id": "I43:1162;40:503", + "type": "INSTANCE", + "fields": { + "parentId": "43:1162", + "childrenIds": [ + "I43:1162;40:503;40:453" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 10588, + "y": 6632 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 10588, + "y": 6632 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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.499999523162842, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 1.8755793571472168, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "House", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 0, + "y": 0, + "mainComponentId": "40:454", + "mainComponentName": "House", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:503;40:453": { + "id": "I43:1162;40:503;40:453", + "type": "VECTOR", + "fields": { + "parentId": "I43:1162;40:503", + "absoluteBoundingBox": { + "height": 15.62442111968994, + "width": 15, + "x": 10590.5, + "y": 6633.87548828125 + }, + "absoluteRenderBounds": { + "height": 15.62451171875, + "width": 15, + "x": 10590.5, + "y": 6633.87548828125 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.62442111968994, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 1.8755793571472168 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:504": { + "id": "I43:1162;40:504", + "type": "INSTANCE", + "fields": { + "parentId": "43:1162", + "childrenIds": [ + "I43:1162;40:504;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10620, + "y": 6636 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10620, + "y": 6636 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 32, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:504;40:476": { + "id": "I43:1162;40:504;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I43:1162;40:504", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10624.125, + "y": 6637.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10624.125, + "y": 6637.87451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:505": { + "id": "I43:1162;40:505", + "type": "TEXT", + "fields": { + "parentId": "43:1162", + "absoluteBoundingBox": { + "height": 20, + "width": 48, + "x": 10644, + "y": 6632 + }, + "absoluteRenderBounds": { + "height": 12.35009765625, + "width": 44.9775390625, + "x": 10645.052734375, + "y": 6637.509765625 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 48, + "x": 56, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth1", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:506": { + "id": "I43:1162;40:506", + "type": "INSTANCE", + "fields": { + "parentId": "43:1162", + "childrenIds": [ + "I43:1162;40:506;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10704, + "y": 6636 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10704, + "y": 6636 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "depth2#44:8" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 116, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:506;40:476": { + "id": "I43:1162;40:506;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I43:1162;40:506", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10708.125, + "y": 6637.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10708.125, + "y": 6637.87451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:507": { + "id": "I43:1162;40:507", + "type": "TEXT", + "fields": { + "parentId": "43:1162", + "absoluteBoundingBox": { + "height": 20, + "width": 50, + "x": 10728, + "y": 6632 + }, + "absoluteRenderBounds": { + "height": 12.3759765625, + "width": 47.6689453125, + "x": 10729.052734375, + "y": 6637.48388671875 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth2", + "componentPropertyReferences": { + "visible": "depth2#44:8" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth2", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 50, + "x": 140, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth2", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:508": { + "id": "I43:1162;40:508", + "type": "INSTANCE", + "fields": { + "parentId": "43:1162", + "childrenIds": [ + "I43:1162;40:508;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10790, + "y": 6636 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10790, + "y": 6636 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "componentPropertyReferences": { + "visible": "depth3#44:5" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 202, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:508;40:476": { + "id": "I43:1162;40:508;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I43:1162;40:508", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10794.125, + "y": 6637.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10794.125, + "y": 6637.87451171875 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.75, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I43:1162;40:509": { + "id": "I43:1162;40:509", + "type": "TEXT", + "fields": { + "parentId": "43:1162", + "absoluteBoundingBox": { + "height": 20, + "width": 50, + "x": 10814, + "y": 6632 + }, + "absoluteRenderBounds": { + "height": 12.36279296875, + "width": 47.8642578125, + "x": 10815.052734375, + "y": 6637.4970703125 + }, + "boundVariables": { + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth3", + "componentPropertyReferences": { + "visible": "depth3#44:5" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth3", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 50, + "x": 226, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth3", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:532": { + "id": "I44:4932;40:532", + "type": "INSTANCE", + "fields": { + "parentId": "44:4932", + "childrenIds": [ + "I44:4932;40:532;40:453" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 11142.5, + "y": 6992.5 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 11142.5, + "y": 6992.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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.499999523162842, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 1.8755793571472168, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "House", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 0, + "y": 0.5, + "mainComponentId": "40:454", + "mainComponentName": "House", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:532;40:453": { + "id": "I44:4932;40:532;40:453", + "type": "VECTOR", + "fields": { + "parentId": "I44:4932;40:532", + "absoluteBoundingBox": { + "height": 15.62442111968994, + "width": 15, + "x": 11145, + "y": 6994.37548828125 + }, + "absoluteRenderBounds": { + "height": 15.62451171875, + "width": 15, + "x": 11145, + "y": 6994.37548828125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.62442111968994, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 1.8755793571472168 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:533": { + "id": "I44:4932;40:533", + "type": "INSTANCE", + "fields": { + "parentId": "44:4932", + "childrenIds": [ + "I44:4932;40:533;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11174.5, + "y": 6996.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11174.5, + "y": 6996.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 32, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:533;40:476": { + "id": "I44:4932;40:533;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4932;40:533", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11178.625, + "y": 6998.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11178.625, + "y": 6998.37451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:534": { + "id": "I44:4932;40:534", + "type": "TEXT", + "fields": { + "parentId": "44:4932", + "absoluteBoundingBox": { + "height": 21, + "width": 51, + "x": 11198.5, + "y": 6992 + }, + "absoluteRenderBounds": { + "height": 13.30029296875, + "width": 48.4375, + "x": 11199.6337890625, + "y": 6997.77978515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 51, + "x": 56, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth1", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:535": { + "id": "I44:4932;40:535", + "type": "INSTANCE", + "fields": { + "parentId": "44:4932", + "childrenIds": [ + "I44:4932;40:535;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11261.5, + "y": 6996.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11261.5, + "y": 6996.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 119, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:535;40:476": { + "id": "I44:4932;40:535;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4932;40:535", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11265.625, + "y": 6998.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11265.625, + "y": 6998.37451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:536": { + "id": "I44:4932;40:536", + "type": "TEXT", + "fields": { + "parentId": "44:4932", + "absoluteBoundingBox": { + "height": 21, + "width": 54, + "x": 11285.5, + "y": 6992 + }, + "absoluteRenderBounds": { + "height": 13.328125, + "width": 51.3359375, + "x": 11286.6337890625, + "y": 6997.751953125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth2", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth2", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 54, + "x": 143, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth2", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:537": { + "id": "I44:4932;40:537", + "type": "INSTANCE", + "fields": { + "parentId": "44:4932", + "childrenIds": [ + "I44:4932;40:537;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 11351.5, + "y": 6996.5 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 11351.5, + "y": 6996.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 209, + "y": 4.5, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:537;40:476": { + "id": "I44:4932;40:537;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4932;40:537", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 11355.625, + "y": 6998.37451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 11355.625, + "y": 6998.37451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4932;40:538": { + "id": "I44:4932;40:538", + "type": "TEXT", + "fields": { + "parentId": "44:4932", + "absoluteBoundingBox": { + "height": 21, + "width": 54, + "x": 11375.5, + "y": 6992 + }, + "absoluteRenderBounds": { + "height": 13.31396484375, + "width": 51.5458984375, + "x": 11376.6337890625, + "y": 6997.76611328125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth3", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth3", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 54, + "x": 233, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth3", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:532": { + "id": "I44:4936;40:532", + "type": "INSTANCE", + "fields": { + "parentId": "44:4936", + "childrenIds": [ + "I44:4936;40:532;40:453" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 10588, + "y": 7247 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 10588, + "y": 7247 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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.499999523162842, + "paddingLeft": 2.5, + "paddingRight": 2.5, + "paddingTop": 1.8755793571472168, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "House", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 20, + "x": 0, + "y": 0, + "mainComponentId": "40:454", + "mainComponentName": "House", + "mainComponentSetId": null + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:532;40:453": { + "id": "I44:4936;40:532;40:453", + "type": "VECTOR", + "fields": { + "parentId": "I44:4936;40:532", + "absoluteBoundingBox": { + "height": 15.62442111968994, + "width": 15, + "x": 10590.5, + "y": 7248.87548828125 + }, + "absoluteRenderBounds": { + "height": 15.62451171875, + "width": 15, + "x": 10590.5, + "y": 7248.87548828125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 15.62442111968994, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 15, + "x": 2.5, + "y": 1.8755793571472168 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:533": { + "id": "I44:4936;40:533", + "type": "INSTANCE", + "fields": { + "parentId": "44:4936", + "childrenIds": [ + "I44:4936;40:533;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10620, + "y": 7251 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10620, + "y": 7251 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 32, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:533;40:476": { + "id": "I44:4936;40:533;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4936;40:533", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10624.125, + "y": 7252.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10624.125, + "y": 7252.87451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:534": { + "id": "I44:4936;40:534", + "type": "TEXT", + "fields": { + "parentId": "44:4936", + "absoluteBoundingBox": { + "height": 20, + "width": 48, + "x": 10644, + "y": 7247 + }, + "absoluteRenderBounds": { + "height": 12.35009765625, + "width": 44.9775390625, + "x": 10645.052734375, + "y": 7252.509765625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth1", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth1", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 48, + "x": 56, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth1", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:535": { + "id": "I44:4936;40:535", + "type": "INSTANCE", + "fields": { + "parentId": "44:4936", + "childrenIds": [ + "I44:4936;40:535;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10704, + "y": 7251 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10704, + "y": 7251 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 116, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:535;40:476": { + "id": "I44:4936;40:535;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4936;40:535", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10708.125, + "y": 7252.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10708.125, + "y": 7252.87451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:536": { + "id": "I44:4936;40:536", + "type": "TEXT", + "fields": { + "parentId": "44:4936", + "absoluteBoundingBox": { + "height": 20, + "width": 50, + "x": 10728, + "y": 7247 + }, + "absoluteRenderBounds": { + "height": 12.3759765625, + "width": 47.6689453125, + "x": 10729.052734375, + "y": 7252.48388671875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth2", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth2", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 50, + "x": 140, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth2", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:537": { + "id": "I44:4936;40:537", + "type": "INSTANCE", + "fields": { + "parentId": "44:4936", + "childrenIds": [ + "I44:4936;40:537;40:476" + ], + "absoluteBoundingBox": { + "height": 12, + "width": 12, + "x": 10790, + "y": 7251 + }, + "absoluteRenderBounds": { + "height": 12, + "width": 12, + "x": 10790, + "y": 7251 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "CaretRight" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": false + } + ], + "height": 12, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "MIN", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 1.874704122543335, + "paddingLeft": 4.125, + "paddingRight": 3.3747053146362305, + "paddingTop": 1.8747045993804932, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Caret-fill", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 24, + "y": 24 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "CaretRight" + }, + "visible": true, + "width": 12, + "x": 202, + "y": 4, + "mainComponentId": "40:479", + "mainComponentName": "속성 1=CaretRight", + "mainComponentSetId": "40:483" + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:537;40:476": { + "id": "I44:4936;40:537;40:476", + "type": "VECTOR", + "fields": { + "parentId": "I44:4936;40:537", + "absoluteBoundingBox": { + "height": 8.250591278076172, + "width": 4.5002946853637695, + "x": 10794.125, + "y": 7252.87451171875 + }, + "absoluteRenderBounds": { + "height": 8.25048828125, + "width": 4.5, + "x": 10794.125, + "y": 7252.87451171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 8.250591278076172, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeWeight": 0.09375, + "visible": true, + "width": 4.5002946853637695, + "x": 4.125, + "y": 1.8747045993804932 + }, + "extra": {}, + "fieldErrors": {} + }, + "I44:4936;40:538": { + "id": "I44:4936;40:538", + "type": "TEXT", + "fields": { + "parentId": "44:4936", + "absoluteBoundingBox": { + "height": 20, + "width": 50, + "x": 10814, + "y": 7247 + }, + "absoluteRenderBounds": { + "height": 12.36279296875, + "width": 47.8642578125, + "x": 10815.052734375, + "y": 7252.4970703125 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "Deapth3", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 13, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "Deapth3", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 50, + "x": 226, + "y": 0, + "styledTextSegments": [ + { + "characters": "Deapth3", + "end": 7, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_profile_card_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_profile_card_set.json new file mode 100644 index 00000000..dd8024bd --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_profile_card_set.json @@ -0,0 +1,2208 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "41:750" + ], + "nodes": { + "41:727": { + "id": "41:727", + "type": "RECTANGLE", + "fields": { + "parentId": "41:733", + "absoluteBoundingBox": { + "height": 250, + "width": 200, + "x": 10541, + "y": 4810 + }, + "absoluteRenderBounds": { + "height": 250, + "width": 200, + "x": 10541, + "y": 4810 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 250, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Rectangle 3", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 4, + "y": 5 + }, + "topLeftRadius": 12, + "topRightRadius": 12, + "visible": true, + "width": 200, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:728": { + "id": "41:728", + "type": "FRAME", + "fields": { + "parentId": "41:733", + "childrenIds": [ + "41:729", + "41:732" + ], + "absoluteBoundingBox": { + "height": 240, + "width": 974, + "x": 10765, + "y": 4810 + }, + "absoluteRenderBounds": { + "height": 240, + "width": 974, + "x": 10765, + "y": 4810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 240, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 484", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 974, + "x": 224, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:729": { + "id": "41:729", + "type": "FRAME", + "fields": { + "parentId": "41:728", + "childrenIds": [ + "41:730", + "41:731" + ], + "absoluteBoundingBox": { + "height": 63, + "width": 974, + "x": 10765, + "y": 4810 + }, + "absoluteRenderBounds": { + "height": 63, + "width": 974, + "x": 10765, + "y": 4810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 63, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 486", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 974, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:730": { + "id": "41:730", + "type": "TEXT", + "fields": { + "parentId": "41:729", + "absoluteBoundingBox": { + "height": 21, + "width": 974, + "x": 10765, + "y": 4810 + }, + "absoluteRenderBounds": { + "height": 12.6416015625, + "width": 90.509765625, + "x": 10765.76953125, + "y": 4814.576171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "대표이사 (CEO)", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "대표이사 (CEO)", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:370e71e15f083213d6b6b56147987ae704a95d77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 974, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "대표이사 (CEO)", + "end": 10, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:370e71e15f083213d6b6b56147987ae704a95d77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:731": { + "id": "41:731", + "type": "TEXT", + "fields": { + "parentId": "41:729", + "absoluteBoundingBox": { + "height": 34, + "width": 974, + "x": 10765, + "y": 4839 + }, + "absoluteRenderBounds": { + "height": 21.3603515625, + "width": 59.185546875, + "x": 10766.0078125, + "y": 4845.4638671875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "임군일", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "임군일", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 974, + "x": 0, + "y": 29, + "styledTextSegments": [ + { + "characters": "임군일", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:732": { + "id": "41:732", + "type": "TEXT", + "fields": { + "parentId": "41:728", + "absoluteBoundingBox": { + "height": 161, + "width": 974, + "x": 10765, + "y": 4889 + }, + "absoluteRenderBounds": { + "height": 151.3203125, + "width": 301.94921875, + "x": 10767.7001953125, + "y": 4893.81982421875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "· 동국대학교 의과대학 정형외과 교수\n· 연골재생 및 골관절염 세포치료 연구 30년\n· 세포치료제 실용화, 치료·연구자 임상 경험\n· 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편)\n· 국내 특허 12건, 국제 특허 3건 등록\n· 세계골관절염연구학회장 역임 (아시아 최초)\n· 대한연골골관절염학회 설립", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 161, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "· 동국대학교 의과대학 정형외과 교수 · 연골재생 및 골관절염 세포치료 연구 30년 · 세포치료제 실용화, 치료·연구자 임상 경험 · 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편) · 국내 특허 12건, 국제 특허 3건 등록 · 세계골관절염연구학회장 역임 (아시아 최초) · 대한연골골관절염학회 설립", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 974, + "x": 0, + "y": 79, + "styledTextSegments": [ + { + "characters": "· 동국대학교 의과대학 정형외과 교수\n· 연골재생 및 골관절염 세포치료 연구 30년\n· 세포치료제 실용화, 치료·연구자 임상 경험\n· 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편)\n· 국내 특허 12건, 국제 특허 3건 등록\n· 세계골관절염연구학회장 역임 (아시아 최초)\n· 대한연골골관절염학회 설립", + "end": 177, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:733": { + "id": "41:733", + "type": "COMPONENT", + "fields": { + "parentId": "41:750", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "41:727", + "41:728" + ], + "absoluteBoundingBox": { + "height": 250, + "width": 1198, + "x": 10541, + "y": 4810 + }, + "absoluteRenderBounds": { + "height": 250, + "width": 1198, + "x": 10541, + "y": 4810 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 250, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 24, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "type=Leader, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Leader", + "viewport": "Desktop" + }, + "visible": true, + "width": 1198, + "x": 21, + "y": 21 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:750": { + "id": "41:750", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "41:733", + "41:751", + "44:1252", + "43:1212" + ], + "absoluteBoundingBox": { + "height": 1093, + "width": 1240, + "x": 10520, + "y": 4789 + }, + "absoluteRenderBounds": { + "height": 1093, + "width": 1240, + "x": 10520, + "y": 4789 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "type": { + "defaultValue": "Leader", + "type": "VARIANT", + "variantOptions": [ + "Leader", + "Team" + ] + }, + "viewport": { + "defaultValue": "Desktop", + "type": "VARIANT", + "variantOptions": [ + "Desktop", + "Mobile" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "41:733", + "$nodeType": "COMPONENT" + }, + "height": 1093, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 20, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 20, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "ProfileCard", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 20, + "paddingLeft": 20, + "paddingRight": 20, + "paddingTop": 20, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 1240, + "x": 1850, + "y": 3751 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:751": { + "id": "41:751", + "type": "COMPONENT", + "fields": { + "parentId": "41:750", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "41:752", + "41:754" + ], + "absoluteBoundingBox": { + "height": 364, + "width": 236, + "x": 10541, + "y": 5080 + }, + "absoluteRenderBounds": { + "height": 364, + "width": 236, + "x": 10541, + "y": 5080 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 364, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "type=Team, viewport=Desktop", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Team", + "viewport": "Desktop" + }, + "visible": true, + "width": 236, + "x": 21, + "y": 291 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:752": { + "id": "41:752", + "type": "RECTANGLE", + "fields": { + "parentId": "41:751", + "absoluteBoundingBox": { + "height": 295, + "width": 236, + "x": 10541, + "y": 5080 + }, + "absoluteRenderBounds": { + "height": 295, + "width": 236, + "x": 10541, + "y": 5080 + }, + "bottomLeftRadius": 12, + "bottomRightRadius": 12, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 12, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 295, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Rectangle 3", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 4, + "y": 5 + }, + "topLeftRadius": 12, + "topRightRadius": 12, + "visible": true, + "width": 236, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:754": { + "id": "41:754", + "type": "FRAME", + "fields": { + "parentId": "41:751", + "childrenIds": [ + "41:756", + "41:755" + ], + "absoluteBoundingBox": { + "height": 53, + "width": 236, + "x": 10541, + "y": 5391 + }, + "absoluteRenderBounds": { + "height": 53, + "width": 236, + "x": 10541, + "y": 5391 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 53, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 4, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 4, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 486", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 236, + "x": 0, + "y": 311 + }, + "extra": {}, + "fieldErrors": {} + }, + "41:755": { + "id": "41:755", + "type": "TEXT", + "fields": { + "parentId": "41:754", + "absoluteBoundingBox": { + "height": 21, + "width": 236, + "x": 10541, + "y": 5423 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 89.6240234375, + "x": 10613.884765625, + "y": 5427.64599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "대표이사 (CEO)", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "대표이사 (CEO)", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 236, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "대표이사 (CEO)", + "end": 10, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:756": { + "id": "41:756", + "type": "TEXT", + "fields": { + "parentId": "41:754", + "absoluteBoundingBox": { + "height": 28, + "width": 236, + "x": 10541, + "y": 5391 + }, + "absoluteRenderBounds": { + "height": 17.7998046875, + "width": 49.3203125, + "x": 10634.01953125, + "y": 5395.72021484375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "임군일", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "임군일", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 236, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "임군일", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1212": { + "id": "43:1212", + "type": "COMPONENT", + "fields": { + "parentId": "41:750", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:1241", + "43:1218" + ], + "absoluteBoundingBox": { + "height": 277, + "width": 1198, + "x": 10541, + "y": 5584 + }, + "absoluteRenderBounds": { + "height": 277, + "width": 1198, + "x": 10541, + "y": 5584 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 277, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "type=Leader, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Leader", + "viewport": "Mobile" + }, + "visible": true, + "width": 1198, + "x": 21, + "y": 795 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1213": { + "id": "43:1213", + "type": "RECTANGLE", + "fields": { + "parentId": "44:1241", + "absoluteBoundingBox": { + "height": 100, + "width": 80, + "x": 10541, + "y": 5584 + }, + "absoluteRenderBounds": { + "height": 100, + "width": 80, + "x": 10541, + "y": 5584 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Rectangle 3", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 4, + "y": 5 + }, + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 80, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1215": { + "id": "43:1215", + "type": "FRAME", + "fields": { + "parentId": "44:1241", + "childrenIds": [ + "43:1216", + "43:1217" + ], + "absoluteBoundingBox": { + "height": 87, + "width": 1102, + "x": 10637, + "y": 5584 + }, + "absoluteRenderBounds": { + "height": 87, + "width": 1102, + "x": 10637, + "y": 5584 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 87, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 486", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1102, + "x": 96, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1216": { + "id": "43:1216", + "type": "TEXT", + "fields": { + "parentId": "43:1215", + "absoluteBoundingBox": { + "height": 21, + "width": 1102, + "x": 10637, + "y": 5596 + }, + "absoluteRenderBounds": { + "height": 12.6416015625, + "width": 90.509765625, + "x": 10637.76953125, + "y": 5600.576171875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "대표이사 (CEO)", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "대표이사 (CEO)", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:370e71e15f083213d6b6b56147987ae704a95d77,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1102, + "x": 0, + "y": 12, + "styledTextSegments": [ + { + "characters": "대표이사 (CEO)", + "end": 10, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:370e71e15f083213d6b6b56147987ae704a95d77," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1217": { + "id": "43:1217", + "type": "TEXT", + "fields": { + "parentId": "43:1215", + "absoluteBoundingBox": { + "height": 34, + "width": 1102, + "x": 10637, + "y": 5625 + }, + "absoluteRenderBounds": { + "height": 21.3603515625, + "width": 59.185546875, + "x": 10638.0078125, + "y": 5631.4638671875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "임군일", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "임군일", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1102, + "x": 0, + "y": 41, + "styledTextSegments": [ + { + "characters": "임군일", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "43:1218": { + "id": "43:1218", + "type": "TEXT", + "fields": { + "parentId": "43:1212", + "absoluteBoundingBox": { + "height": 161, + "width": 1198, + "x": 10541, + "y": 5700 + }, + "absoluteRenderBounds": { + "height": 151.3203125, + "width": 301.94921875, + "x": 10543.7001953125, + "y": 5704.81982421875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:40:430", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "· 동국대학교 의과대학 정형외과 교수\n· 연골재생 및 골관절염 세포치료 연구 30년\n· 세포치료제 실용화, 치료·연구자 임상 경험\n· 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편)\n· 국내 특허 12건, 국제 특허 3건 등록\n· 세계골관절염연구학회장 역임 (아시아 최초)\n· 대한연골골관절염학회 설립", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Medium" + }, + "fontSize": 15, + "height": 161, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "· 동국대학교 의과대학 정형외과 교수 · 연골재생 및 골관절염 세포치료 연구 30년 · 세포치료제 실용화, 치료·연구자 임상 경험 · 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편) · 국내 특허 12건, 국제 특허 3건 등록 · 세계골관절염연구학회장 역임 (아시아 최초) · 대한연골골관절염학회 설립", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6,", + "textTruncation": "DISABLED", + "visible": true, + "width": 1198, + "x": 0, + "y": 116, + "styledTextSegments": [ + { + "characters": "· 동국대학교 의과대학 정형외과 교수\n· 연골재생 및 골관절염 세포치료 연구 30년\n· 세포치료제 실용화, 치료·연구자 임상 경험\n· 최근 10년 SCI 논문 120편 (피인용 100회 이상 4편)\n· 국내 특허 12건, 국제 특허 3건 등록\n· 세계골관절염연구학회장 역임 (아시아 최초)\n· 대한연골골관절염학회 설립", + "end": 177, + "fillStyleId": "", + "fontWeight": 500, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:a2319c6931a342fd831baf32b252756b15de72a6," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1241": { + "id": "44:1241", + "type": "FRAME", + "fields": { + "parentId": "43:1212", + "childrenIds": [ + "43:1213", + "43:1215" + ], + "absoluteBoundingBox": { + "height": 100, + "width": 1198, + "x": 10541, + "y": 5584 + }, + "absoluteRenderBounds": { + "height": 100, + "width": 1198, + "x": 10541, + "y": 5584 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 100, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 499", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 1198, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1252": { + "id": "44:1252", + "type": "COMPONENT", + "fields": { + "parentId": "41:750", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:1253", + "44:1254" + ], + "absoluteBoundingBox": { + "height": 100, + "width": 236, + "x": 10541, + "y": 5464 + }, + "absoluteRenderBounds": { + "height": 100, + "width": 236, + "x": 10541, + "y": 5464 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 100, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "type=Team, viewport=Mobile", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "type": "Team", + "viewport": "Mobile" + }, + "visible": true, + "width": 236, + "x": 21, + "y": 675 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1253": { + "id": "44:1253", + "type": "RECTANGLE", + "fields": { + "parentId": "44:1252", + "absoluteBoundingBox": { + "height": 100, + "width": 80, + "x": 10541, + "y": 5464 + }, + "absoluteRenderBounds": { + "height": 100, + "width": 80, + "x": 10541, + "y": 5464 + }, + "bottomLeftRadius": 8, + "bottomRightRadius": 8, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 8, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.8509804010391235, + "g": 0.8509804010391235, + "r": 0.8509804010391235 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 100, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Rectangle 3", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 4, + "y": 5 + }, + "topLeftRadius": 8, + "topRightRadius": 8, + "visible": true, + "width": 80, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1254": { + "id": "44:1254", + "type": "FRAME", + "fields": { + "parentId": "44:1252", + "childrenIds": [ + "44:1255", + "44:1256" + ], + "absoluteBoundingBox": { + "height": 77, + "width": 140, + "x": 10637, + "y": 5475.5 + }, + "absoluteRenderBounds": { + "height": 77, + "width": 140, + "x": 10637, + "y": 5475.5 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 77, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 4, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 4, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 486", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 140, + "x": 96, + "y": 11.5 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1255": { + "id": "44:1255", + "type": "TEXT", + "fields": { + "parentId": "44:1254", + "absoluteBoundingBox": { + "height": 28, + "width": 140, + "x": 10637, + "y": 5487.5 + }, + "absoluteRenderBounds": { + "height": 17.7998046875, + "width": 49.3212890625, + "x": 10637.83984375, + "y": 5492.22021484375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:950", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "임군일", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 20, + "height": 28, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "임군일", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a,", + "textTruncation": "DISABLED", + "visible": true, + "width": 140, + "x": 0, + "y": 12, + "styledTextSegments": [ + { + "characters": "임군일", + "end": 3, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:0b5158f29530255590daed174bb87c3a635c314a," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1256": { + "id": "44:1256", + "type": "TEXT", + "fields": { + "parentId": "44:1254", + "absoluteBoundingBox": { + "height": 21, + "width": 140, + "x": 10637, + "y": 5519.5 + }, + "absoluteRenderBounds": { + "height": 12.501953125, + "width": 89.6240234375, + "x": 10637.8681640625, + "y": 5524.14599609375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:956", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "대표이사 (CEO)", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:13:153", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.5160255432128906, + "g": 0.4530186951160431, + "r": 0.4333290457725525 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Bold" + }, + "fontSize": 14, + "height": 21, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "대표이사 (CEO)", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d,", + "textTruncation": "DISABLED", + "visible": true, + "width": 140, + "x": 0, + "y": 44, + "styledTextSegments": [ + { + "characters": "대표이사 (CEO)", + "end": 10, + "fillStyleId": "", + "fontWeight": 700, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:44614ba166a8fa9b3003396a689f04927b273a5d," + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_rnd_link_row_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_rnd_link_row_set.json new file mode 100644 index 00000000..6e08b6b7 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_rnd_link_row_set.json @@ -0,0 +1,1910 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "51:5754" + ], + "nodes": { + "51:5754": { + "id": "51:5754", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "51:5755", + "51:5761" + ], + "absoluteBoundingBox": { + "height": 350, + "width": 808, + "x": 9458, + "y": 4559 + }, + "absoluteRenderBounds": { + "height": 350, + "width": 808, + "x": 9458, + "y": 4559 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:19", + "type": "VARIABLE_ALIAS" + } + ] + }, + "clipsContent": true, + "componentPropertyDefinitions": { + "effect": { + "defaultValue": "default", + "type": "VARIANT", + "variantOptions": [ + "default", + "hover" + ] + }, + "번호#47:79": { + "defaultValue": "01", + "type": "TEXT" + }, + "설명#47:85": { + "defaultValue": "세포치료제와 3차원 공배양 모델, 두 축의 연구", + "type": "TEXT" + }, + "제목#47:82": { + "defaultValue": "연구개발 분야", + "type": "TEXT" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "51:5755", + "$nodeType": "COMPONENT" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:19", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.21960784494876864, + "g": 0.10196078568696976, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 350, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "RnDLinkRow", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 808, + "x": 788, + "y": 3521 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5755": { + "id": "51:5755", + "type": "COMPONENT", + "fields": { + "parentId": "51:5754", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "51:5800", + "51:5757", + "51:5807" + ], + "absoluteBoundingBox": { + "height": 139, + "width": 760, + "x": 9482, + "y": 4583 + }, + "absoluteRenderBounds": { + "height": 139, + "width": 760, + "x": 9482, + "y": 4583 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 139, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 36, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 36, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=default", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 36, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 36, + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 760, + "x": 24, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5756": { + "id": "51:5756", + "type": "TEXT", + "fields": { + "parentId": "51:5800", + "absoluteBoundingBox": { + "height": 20, + "width": 40, + "x": 9506, + "y": 4632 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15.8681640625, + "x": 9506.599609375, + "y": 4635.94482421875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "componentPropertyReferences": { + "characters": "번호#47:79" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8392156958580017, + "g": 0.8156862854957581, + "r": 0.40392157435417175 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 40, + "x": 0, + "y": 12, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5757": { + "id": "51:5757", + "type": "FRAME", + "fields": { + "parentId": "51:5755", + "childrenIds": [ + "51:5758", + "51:5759" + ], + "absoluteBoundingBox": { + "height": 66, + "width": 560, + "x": 9578, + "y": 4620 + }, + "absoluteRenderBounds": { + "height": 66, + "width": 560, + "x": 9578, + "y": 4620 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 66, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 560, + "x": 96, + "y": 37 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5758": { + "id": "51:5758", + "type": "TEXT", + "fields": { + "parentId": "51:5757", + "absoluteBoundingBox": { + "height": 34, + "width": 560, + "x": 9578, + "y": 4620 + }, + "absoluteRenderBounds": { + "height": 21.64794921875, + "width": 127.166015625, + "x": 9578.9599609375, + "y": 4626.43994140625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "연구개발 분야", + "componentPropertyReferences": { + "characters": "제목#47:82" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 560, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "연구개발 분야", + "end": 7, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5759": { + "id": "51:5759", + "type": "TEXT", + "fields": { + "parentId": "51:5757", + "absoluteBoundingBox": { + "height": 24, + "width": 560, + "x": 9578, + "y": 4662 + }, + "absoluteRenderBounds": { + "height": 14.65625, + "width": 278.2529296875, + "x": 9578.48046875, + "y": 4667.087890625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "세포치료제와 3차원 공배양 모델, 두 축의 연구", + "componentPropertyReferences": { + "characters": "설명#47:85" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "desc", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 560, + "x": 0, + "y": 42, + "styledTextSegments": [ + { + "characters": "세포치료제와 3차원 공배양 모델, 두 축의 연구", + "end": 26, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5760": { + "id": "51:5760", + "type": "INSTANCE", + "fields": { + "parentId": "51:5807", + "childrenIds": [ + "I51:5760;30:720" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 10170, + "y": 4629 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 48, + "x": 10170, + "y": 4629 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "default" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "effects": [ + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 4, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.07999999821186066, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "arrow", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 44, + "y": 44 + }, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "default" + }, + "visible": true, + "width": 48, + "x": 0, + "y": 9, + "mainComponentId": "30:723", + "mainComponentName": "effect=default", + "mainComponentSetId": "30:724" + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5761": { + "id": "51:5761", + "type": "COMPONENT", + "fields": { + "parentId": "51:5754", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "51:5762", + "51:5763", + "51:5820" + ], + "absoluteBoundingBox": { + "height": 139, + "width": 760, + "x": 9482, + "y": 4746 + }, + "absoluteRenderBounds": { + "height": 139, + "width": 760, + "x": 9482, + "y": 4746 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.05999999865889549, + "type": "SOLID", + "visible": true + } + ], + "height": 139, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 32, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 36, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 36, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 32, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "effect=hover", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 36, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 36, + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.4000000059604645, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "width": 760, + "x": 24, + "y": 187 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5762": { + "id": "51:5762", + "type": "TEXT", + "fields": { + "parentId": "51:5761", + "absoluteBoundingBox": { + "height": 20, + "width": 40, + "x": 9506, + "y": 4783 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15.8681640625, + "x": 9506.599609375, + "y": 4786.94482421875 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "componentPropertyReferences": { + "characters": "번호#47:79" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8392156958580017, + "g": 0.8156862854957581, + "r": 0.40392157435417175 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 40, + "x": 24, + "y": 37, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5763": { + "id": "51:5763", + "type": "FRAME", + "fields": { + "parentId": "51:5761", + "childrenIds": [ + "51:5764", + "51:5765" + ], + "absoluteBoundingBox": { + "height": 66, + "width": 560, + "x": 9578, + "y": 4783 + }, + "absoluteRenderBounds": { + "height": 66, + "width": 560, + "x": 9578, + "y": 4783 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 66, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 8, + "layoutAlign": "INHERIT", + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 8, + "layoutGrow": 1, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "text", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 560, + "x": 96, + "y": 37 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5764": { + "id": "51:5764", + "type": "TEXT", + "fields": { + "parentId": "51:5763", + "absoluteBoundingBox": { + "height": 34, + "width": 560, + "x": 9578, + "y": 4783 + }, + "absoluteRenderBounds": { + "height": 21.64794921875, + "width": 127.166015625, + "x": 9578.9599609375, + "y": 4789.43994140625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "연구개발 분야", + "componentPropertyReferences": { + "characters": "제목#47:82" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:27", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.8392156958580017, + "g": 0.8156862854957581, + "r": 0.40392157435417175 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 560, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "연구개발 분야", + "end": 7, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5765": { + "id": "51:5765", + "type": "TEXT", + "fields": { + "parentId": "51:5763", + "absoluteBoundingBox": { + "height": 24, + "width": 560, + "x": 9578, + "y": 4825 + }, + "absoluteRenderBounds": { + "height": 14.65625, + "width": 278.2529296875, + "x": 9578.48046875, + "y": 4830.087890625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:955", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "세포치료제와 3차원 공배양 모델, 두 축의 연구", + "componentPropertyReferences": { + "characters": "설명#47:85" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 16, + "height": 24, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 150 + }, + "maxHeight": null, + "maxWidth": null, + "name": "desc", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775,", + "textTruncation": "DISABLED", + "visible": true, + "width": 560, + "x": 0, + "y": 42, + "styledTextSegments": [ + { + "characters": "세포치료제와 3차원 공배양 모델, 두 축의 연구", + "end": 26, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:e4c7b7dacbd4e73f6c967cfc38e87b24df7d8775," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5800": { + "id": "51:5800", + "type": "FRAME", + "fields": { + "parentId": "51:5755", + "childrenIds": [ + "51:5756" + ], + "absoluteBoundingBox": { + "height": 44, + "width": 40, + "x": 9506, + "y": 4620 + }, + "absoluteRenderBounds": { + "height": 44, + "width": 40, + "x": 9506, + "y": 4620 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 44, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 549", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 40, + "x": 24, + "y": 37 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5807": { + "id": "51:5807", + "type": "FRAME", + "fields": { + "parentId": "51:5755", + "childrenIds": [ + "51:5760" + ], + "absoluteBoundingBox": { + "height": 66, + "width": 48, + "x": 10170, + "y": 4620 + }, + "absoluteRenderBounds": { + "height": 66, + "width": 48, + "x": 10170, + "y": 4620 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 66, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 550", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 48, + "x": 688, + "y": 37 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5820": { + "id": "51:5820", + "type": "FRAME", + "fields": { + "parentId": "51:5761", + "childrenIds": [ + "51:5821" + ], + "absoluteBoundingBox": { + "height": 66, + "width": 48, + "x": 10170, + "y": 4783 + }, + "absoluteRenderBounds": { + "height": 66, + "width": 48, + "x": 10170, + "y": 4783 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 66, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 550", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 48, + "x": 688, + "y": 37 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5821": { + "id": "51:5821", + "type": "INSTANCE", + "fields": { + "parentId": "51:5820", + "childrenIds": [ + "I51:5821;30:726" + ], + "absoluteBoundingBox": { + "height": 48, + "width": 48, + "x": 10170, + "y": 4792 + }, + "absoluteRenderBounds": { + "height": 48, + "width": 48, + "x": 10170, + "y": 4792 + }, + "bottomLeftRadius": 100, + "bottomRightRadius": 100, + "componentProperties": { + "effect": { + "boundVariables": {}, + "type": "VARIANT", + "value": "hover" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 100, + "counterAxisAlignItems": "CENTER", + "effects": [ + { + "blurType": "NORMAL", + "boundVariables": {}, + "radius": 4, + "type": "BACKGROUND_BLUR", + "visible": true + } + ], + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.20000000298023224, + "type": "SOLID", + "visible": true + } + ], + "height": 48, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 10, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 10, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "arrow", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 12, + "paddingLeft": 12, + "paddingRight": 12, + "paddingTop": 12, + "primaryAxisAlignItems": "CENTER", + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "targetAspectRatio": { + "x": 44, + "y": 44 + }, + "topLeftRadius": 100, + "topRightRadius": 100, + "variantProperties": { + "effect": "hover" + }, + "visible": true, + "width": 48, + "x": 0, + "y": 9, + "mainComponentId": "30:725", + "mainComponentName": "effect=hover", + "mainComponentSetId": "30:724" + }, + "extra": {}, + "fieldErrors": {} + }, + "I51:5760;30:720": { + "id": "I51:5760;30:720", + "type": "INSTANCE", + "fields": { + "parentId": "51:5760", + "childrenIds": [ + "I51:5760;30:720;23:1618" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 10184, + "y": 4643 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 10184, + "y": 4643 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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": 3.333333730697632, + "paddingLeft": 7.5, + "paddingRight": 5.833333492279053, + "paddingTop": 3.3333332538604736, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 20, + "x": 14, + "y": 14, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "I51:5760;30:720;23:1618": { + "id": "I51:5760;30:720;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "I51:5760;30:720", + "absoluteBoundingBox": { + "height": 13.333333015441896, + "width": 6.666666507720947, + "x": 10191.5, + "y": 4646.33349609375 + }, + "absoluteRenderBounds": { + "height": 15.33349609375, + "width": 8.6669921875, + "x": 10190.5, + "y": 4645.33349609375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 13.333333015441896, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6.666666507720947, + "x": 7.5, + "y": 3.3333332538604736 + }, + "extra": {}, + "fieldErrors": {} + }, + "I51:5821;30:726": { + "id": "I51:5821;30:726", + "type": "INSTANCE", + "fields": { + "parentId": "51:5821", + "childrenIds": [ + "I51:5821;30:726;23:1618" + ], + "absoluteBoundingBox": { + "height": 20, + "width": 20, + "x": 10184, + "y": 4806 + }, + "absoluteRenderBounds": { + "height": 20, + "width": 20, + "x": 10184, + "y": 4806 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "componentProperties": { + "속성 1": { + "boundVariables": {}, + "type": "VARIANT", + "value": "Right" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "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": 3.333333730697632, + "paddingLeft": 7.5, + "paddingRight": 5.833333492279053, + "paddingTop": 3.3333332538604736, + "primaryAxisAlignItems": "CENTER", + "primaryAxisSizingMode": "FIXED" + }, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "icon", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 0.125, + "strokeLeftWeight": 0.125, + "strokeRightWeight": 0.125, + "strokeTopWeight": 0.125, + "strokeWeight": 0.125, + "targetAspectRatio": { + "x": 32, + "y": 32 + }, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "속성 1": "Right" + }, + "visible": true, + "width": 20, + "x": 14, + "y": 14, + "mainComponentId": "23:1619", + "mainComponentName": "속성 1=Right", + "mainComponentSetId": "20:1312" + }, + "extra": {}, + "fieldErrors": {} + }, + "I51:5821;30:726;23:1618": { + "id": "I51:5821;30:726;23:1618", + "type": "VECTOR", + "fields": { + "parentId": "I51:5821;30:726", + "absoluteBoundingBox": { + "height": 13.333333015441896, + "width": 6.666666507720947, + "x": 10191.5, + "y": 4809.33349609375 + }, + "absoluteRenderBounds": { + "height": 15.33349609375, + "width": 8.6669921875, + "x": 10190.5, + "y": 4808.33349609375 + }, + "constraints": { + "horizontal": "SCALE", + "vertical": "SCALE" + }, + "height": 13.333333015441896, + "isAsset": true, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Vector", + "opacity": 1, + "strokeAlign": "CENTER", + "strokeWeight": 2, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "visible": true, + "width": 6.666666507720947, + "x": 7.5, + "y": 3.3333332538604736 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_section_title_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_section_title_set.json new file mode 100644 index 00000000..ef32d316 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_section_title_set.json @@ -0,0 +1,684 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "44:1949" + ], + "nodes": { + "41:706": { + "id": "41:706", + "type": "TEXT", + "fields": { + "parentId": "41:708", + "absoluteBoundingBox": { + "height": 20, + "width": 476, + "x": 11141, + "y": 4329 + }, + "absoluteRenderBounds": { + "height": 11.625, + "width": 128.025390625, + "x": 11141.900390625, + "y": 4332.77978515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "CEO MESSEAGE", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "CEO MESSEAGE", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 476, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "CEO MESSEAGE", + "end": 12, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:707": { + "id": "41:707", + "type": "TEXT", + "fields": { + "parentId": "41:708", + "absoluteBoundingBox": { + "height": 53, + "width": 476, + "x": 11141, + "y": 4361 + }, + "absoluteRenderBounds": { + "height": 36.0400390625, + "width": 391.52734375, + "x": 11141.6396484375, + "y": 4369.39990234375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:938", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "관절재생으로 새로운 삶을", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 40, + "height": 53, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "관절재생으로 새로운 삶을", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:7f649150dd922eb61a2b92d74e277e4a43e48ec4,", + "textTruncation": "DISABLED", + "visible": true, + "width": 476, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "관절재생으로 새로운 삶을", + "end": 13, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:7f649150dd922eb61a2b92d74e277e4a43e48ec4," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "41:708": { + "id": "41:708", + "type": "COMPONENT", + "fields": { + "parentId": "44:1949", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "41:706", + "41:707" + ], + "absoluteBoundingBox": { + "height": 85, + "width": 476, + "x": 11141, + "y": 4329 + }, + "absoluteRenderBounds": { + "height": 85, + "width": 476, + "x": 11141, + "y": 4329 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "itemSpacing": { + "id": "VariableID:30:615", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 85, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "align=left", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "align": "left" + }, + "visible": true, + "width": 476, + "x": 20, + "y": 20 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1949": { + "id": "44:1949", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "41:708", + "44:1950" + ], + "absoluteBoundingBox": { + "height": 230, + "width": 516, + "x": 11121, + "y": 4309 + }, + "absoluteRenderBounds": { + "height": 230, + "width": 516, + "x": 11121, + "y": 4309 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "align": { + "defaultValue": "left", + "type": "VARIANT", + "variantOptions": [ + "left", + "center" + ] + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "41:708", + "$nodeType": "COMPONENT" + }, + "height": 230, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "SectionTitle", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 0.27843138575553894, + "r": 0.5921568870544434 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 516, + "x": 2451, + "y": 3271 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1950": { + "id": "44:1950", + "type": "COMPONENT", + "fields": { + "parentId": "44:1949", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "44:1951", + "44:1952" + ], + "absoluteBoundingBox": { + "height": 85, + "width": 476, + "x": 11141, + "y": 4434 + }, + "absoluteRenderBounds": { + "height": 85, + "width": 476, + "x": 11141, + "y": 4434 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "itemSpacing": { + "id": "VariableID:30:615", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 85, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 12, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 12, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "align=center", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "align": "center" + }, + "visible": true, + "width": 476, + "x": 20, + "y": 125 + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1951": { + "id": "44:1951", + "type": "TEXT", + "fields": { + "parentId": "44:1950", + "absoluteBoundingBox": { + "height": 20, + "width": 476, + "x": 11141, + "y": 4434 + }, + "absoluteRenderBounds": { + "height": 11.625, + "width": 128.0263671875, + "x": 11315.0693359375, + "y": 4437.77978515625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "CEO MESSEAGE", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "CEO MESSEAGE", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 476, + "x": 0, + "y": 0, + "styledTextSegments": [ + { + "characters": "CEO MESSEAGE", + "end": 12, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "44:1952": { + "id": "44:1952", + "type": "TEXT", + "fields": { + "parentId": "44:1950", + "absoluteBoundingBox": { + "height": 53, + "width": 476, + "x": 11141, + "y": 4466 + }, + "absoluteRenderBounds": { + "height": 36.0400390625, + "width": 391.5263671875, + "x": 11182.9365234375, + "y": 4474.39990234375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:938", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "관절재생으로 새로운 삶을", + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:358", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.1529411822557449, + "g": 0.08627451211214066, + "r": 0.06666667014360428 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 40, + "height": 53, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "관절재생으로 새로운 삶을", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAlignHorizontal": "CENTER", + "textAutoResize": "HEIGHT", + "textStyleId": "S:7f649150dd922eb61a2b92d74e277e4a43e48ec4,", + "textTruncation": "DISABLED", + "visible": true, + "width": 476, + "x": 0, + "y": 32, + "styledTextSegments": [ + { + "characters": "관절재생으로 새로운 삶을", + "end": 13, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:7f649150dd922eb61a2b92d74e277e4a43e48ec4," + } + ] + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_tech_step_set.json b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_tech_step_set.json new file mode 100644 index 00000000..93d7b370 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/fixtures/chondrogen_tech_step_set.json @@ -0,0 +1,1448 @@ +{ + "fileKey": "K2kUnxGgvooAJwCQiVTb7g", + "version": null, + "roots": [ + "51:5495" + ], + "nodes": { + "51:5495": { + "id": "51:5495", + "type": "COMPONENT_SET", + "fields": { + "parentId": "19:963", + "parentType": "SECTION", + "parentName": "Components", + "childrenIds": [ + "51:5496", + "51:5503" + ], + "absoluteBoundingBox": { + "height": 364, + "width": 528, + "x": 10145, + "y": 1877 + }, + "absoluteRenderBounds": { + "height": 364, + "width": 528, + "x": 10145, + "y": 1877 + }, + "bottomLeftRadius": 5, + "bottomRightRadius": 5, + "clipsContent": true, + "componentPropertyDefinitions": { + "state": { + "defaultValue": "active", + "type": "VARIANT", + "variantOptions": [ + "active", + "default" + ] + }, + "번호#47:70": { + "defaultValue": "01", + "type": "TEXT" + }, + "설명#47:76": { + "defaultValue": "세포를 작은 공 모양으로 뭉쳐 관절 속 환경과 비슷하게 만들고, 오래 머물 수 있도록 설계했습니다.", + "type": "TEXT" + }, + "제목#47:73": { + "defaultValue": "스페로이드 형태", + "type": "TEXT" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 5, + "dashPattern": [ + 10, + 5 + ], + "defaultVariant": { + "$nodeId": "51:5496", + "$nodeType": "COMPONENT" + }, + "height": 364, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 24, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 24, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "TechStep", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 24, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 24, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 5, + "topRightRadius": 5, + "visible": true, + "width": 528, + "x": 1475, + "y": 839 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5496": { + "id": "51:5496", + "type": "COMPONENT", + "fields": { + "parentId": "51:5495", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "51:5497", + "51:5500", + "51:5618" + ], + "absoluteBoundingBox": { + "height": 193, + "width": 480, + "x": 10169, + "y": 1901 + }, + "absoluteRenderBounds": { + "height": 193, + "width": 480, + "x": 10169, + "y": 1901 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "paddingBottom": { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + }, + "paddingTop": { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 193, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "state=active", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.23999999463558197, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "state": "active" + }, + "visible": true, + "width": 480, + "x": 24, + "y": 24 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5497": { + "id": "51:5497", + "type": "FRAME", + "fields": { + "parentId": "51:5496", + "childrenIds": [ + "51:5498", + "51:5499" + ], + "absoluteBoundingBox": { + "height": 34, + "width": 480, + "x": 10169, + "y": 1934 + }, + "absoluteRenderBounds": { + "height": 34, + "width": 480, + "x": 10169, + "y": 1934 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 34, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "head", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 480, + "x": 0, + "y": 33 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5498": { + "id": "51:5498", + "type": "TEXT", + "fields": { + "parentId": "51:5497", + "absoluteBoundingBox": { + "height": 20, + "width": 18, + "x": 10169, + "y": 1941 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15.8681640625, + "x": 10169.599609375, + "y": 1944.9449462890625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "componentPropertyReferences": { + "characters": "번호#47:70" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 18, + "x": 0, + "y": 7, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5499": { + "id": "51:5499", + "type": "TEXT", + "fields": { + "parentId": "51:5497", + "absoluteBoundingBox": { + "height": 34, + "width": 446, + "x": 10203, + "y": 1934 + }, + "absoluteRenderBounds": { + "height": 21.8160400390625, + "width": 146.5830078125, + "x": 10203.7197265625, + "y": 1940.27197265625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "스페로이드 형태", + "componentPropertyReferences": { + "characters": "제목#47:73" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:345", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7323716878890991, + "g": 0.34177345037460327, + "r": 0 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 446, + "x": 34, + "y": 0, + "styledTextSegments": [ + { + "characters": "스페로이드 형태", + "end": 8, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5500": { + "id": "51:5500", + "type": "TEXT", + "fields": { + "parentId": "51:5496", + "absoluteBoundingBox": { + "height": 58, + "width": 480, + "x": 10169, + "y": 1984 + }, + "absoluteRenderBounds": { + "height": 44.840087890625, + "width": 474.3935546875, + "x": 10169.5400390625, + "y": 1990.491943359375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "세포를 작은 공 모양으로 뭉쳐 관절 속 환경과 비슷하게 만들고, 오래 머물 수 있도록 설계했습니다.", + "componentPropertyReferences": { + "characters": "설명#47:76" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 18, + "height": 58, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "desc", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3,", + "textTruncation": "DISABLED", + "visible": true, + "width": 480, + "x": 0, + "y": 83, + "styledTextSegments": [ + { + "characters": "세포를 작은 공 모양으로 뭉쳐 관절 속 환경과 비슷하게 만들고, 오래 머물 수 있도록 설계했습니다.", + "end": 55, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5503": { + "id": "51:5503", + "type": "COMPONENT", + "fields": { + "parentId": "51:5495", + "parentType": "COMPONENT_SET", + "childrenIds": [ + "51:5504", + "51:5507", + "51:5508" + ], + "absoluteBoundingBox": { + "height": 99, + "width": 480, + "x": 10169, + "y": 2118 + }, + "absoluteRenderBounds": { + "height": 99, + "width": 480, + "x": 10169, + "y": 2118 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "paddingBottom": { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + }, + "paddingTop": { + "id": "VariableID:18:942", + "type": "VARIABLE_ALIAS" + } + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "height": 99, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 16, + "layoutAlign": "INHERIT", + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutPositioning": "AUTO", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "AUTO" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "VERTICAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "state=default", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 32, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 32, + "strokeBottomWeight": 0, + "strokeLeftWeight": 0, + "strokeRightWeight": 0, + "strokeTopWeight": 1, + "strokeWeight": { + "$unsupported": "symbol" + }, + "strokes": [ + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 0.23999999463558197, + "type": "SOLID", + "visible": true + } + ], + "topLeftRadius": 0, + "topRightRadius": 0, + "variantProperties": { + "state": "default" + }, + "visible": true, + "width": 480, + "x": 24, + "y": 241 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5504": { + "id": "51:5504", + "type": "FRAME", + "fields": { + "parentId": "51:5503", + "childrenIds": [ + "51:5505", + "51:5506" + ], + "absoluteBoundingBox": { + "height": 34, + "width": 480, + "x": 10169, + "y": 2151 + }, + "absoluteRenderBounds": { + "height": 34, + "width": 480, + "x": 10169, + "y": 2151 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "counterAxisAlignItems": "CENTER", + "height": 34, + "inferredAutoLayout": { + "counterAxisAlignItems": "CENTER", + "counterAxisSizingMode": "AUTO", + "itemSpacing": 16, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 16, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "maxHeight": null, + "maxWidth": null, + "name": "head", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 480, + "x": 0, + "y": 33 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5505": { + "id": "51:5505", + "type": "TEXT", + "fields": { + "parentId": "51:5504", + "absoluteBoundingBox": { + "height": 20, + "width": 18, + "x": 10169, + "y": 2158 + }, + "absoluteRenderBounds": { + "height": 11.25, + "width": 15.8681640625, + "x": 10169.599609375, + "y": 2161.945068359375 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "01", + "componentPropertyReferences": { + "characters": "번호#47:70" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:359", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.6682692170143127, + "g": 0.6104382276535034, + "r": 0.5815227627754211 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Heavy" + }, + "fontSize": 15, + "height": 20, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "HUG", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": 4 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 132.00000524520874 + }, + "maxHeight": null, + "maxWidth": null, + "name": "number", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "WIDTH_AND_HEIGHT", + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222,", + "textTruncation": "DISABLED", + "visible": true, + "width": 18, + "x": 0, + "y": 7, + "styledTextSegments": [ + { + "characters": "01", + "end": 2, + "fillStyleId": "", + "fontWeight": 900, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:18adf49c362ab9c0a968104533e0a31e663f3222," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5506": { + "id": "51:5506", + "type": "TEXT", + "fields": { + "parentId": "51:5504", + "absoluteBoundingBox": { + "height": 34, + "width": 446, + "x": 10203, + "y": 2151 + }, + "absoluteRenderBounds": { + "height": 21.81591796875, + "width": 146.5830078125, + "x": 10203.7197265625, + "y": 2157.27197265625 + }, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:946", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "스페로이드 형태", + "componentPropertyReferences": { + "characters": "제목#47:73" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:348", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3176470696926117, + "g": 0.250980406999588, + "r": 0.21568627655506137 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "ExtraBold" + }, + "fontSize": 24, + "height": 34, + "layoutGrow": 1, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "HUG", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 139.9999976158142 + }, + "maxHeight": null, + "maxWidth": null, + "name": "title", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66,", + "textTruncation": "DISABLED", + "visible": true, + "width": 446, + "x": 34, + "y": 0, + "styledTextSegments": [ + { + "characters": "스페로이드 형태", + "end": 8, + "fillStyleId": "", + "fontWeight": 800, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:695d59044b4e4f7eea6a65d6dd08296043af8a66," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5507": { + "id": "51:5507", + "type": "TEXT", + "fields": { + "parentId": "51:5503", + "absoluteBoundingBox": { + "height": 58, + "width": 480, + "x": 10169, + "y": 2197 + }, + "absoluteRenderBounds": null, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ], + "fontSize": [ + { + "id": "VariableID:18:951", + "type": "VARIABLE_ALIAS" + } + ] + }, + "characters": "세포를 작은 공 모양으로 뭉쳐 관절 속 환경과 비슷하게 만들고, 오래 머물 수 있도록 설계했습니다.", + "componentPropertyReferences": { + "characters": "설명#47:76" + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "fontName": { + "family": "SUIT", + "style": "Regular" + }, + "fontSize": 18, + "height": 58, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "letterSpacing": { + "unit": "PERCENT", + "value": -2 + }, + "lineHeight": { + "unit": "PERCENT", + "value": 160.0000023841858 + }, + "maxHeight": null, + "maxWidth": null, + "name": "desc", + "opacity": 1, + "strokeAlign": "OUTSIDE", + "strokeWeight": 1, + "textAutoResize": "HEIGHT", + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3,", + "textTruncation": "DISABLED", + "visible": false, + "width": 480, + "x": 0, + "y": 79, + "styledTextSegments": [ + { + "characters": "세포를 작은 공 모양으로 뭉쳐 관절 속 환경과 비슷하게 만들고, 오래 머물 수 있도록 설계했습니다.", + "end": 55, + "fillStyleId": "", + "fontWeight": 400, + "hyperlink": null, + "indentation": 0, + "listOptions": { + "type": "NONE" + }, + "start": 0, + "textStyleId": "S:cfcbc71ecd9536404e6fe4dfeb971ce6261df4c3," + } + ] + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5508": { + "id": "51:5508", + "type": "FRAME", + "fields": { + "parentId": "51:5503", + "childrenIds": [ + "51:5509" + ], + "absoluteBoundingBox": { + "height": 2, + "width": 480, + "x": 10169, + "y": 2197 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:9:356", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 2, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "progress", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": false, + "width": 480, + "x": 0, + "y": 79 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5509": { + "id": "51:5509", + "type": "RECTANGLE", + "fields": { + "parentId": "51:5508", + "absoluteBoundingBox": { + "height": 2, + "width": 160, + "x": 10169, + "y": 2197 + }, + "absoluteRenderBounds": null, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:30", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:30", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7259615659713745, + "g": 0.6905941367149353, + "r": 0.018614115193486217 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 2, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "bar", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5618": { + "id": "51:5618", + "type": "FRAME", + "fields": { + "parentId": "51:5496", + "childrenIds": [ + "51:5619" + ], + "absoluteBoundingBox": { + "height": 4, + "width": 480, + "x": 10169, + "y": 2058 + }, + "absoluteRenderBounds": { + "height": 4, + "width": 480, + "x": 10169, + "y": 2058 + }, + "bottomLeftRadius": 1000, + "bottomRightRadius": 1000, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:3", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "cornerRadius": 1000, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:3", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9839743375778198, + "g": 0.9189276099205016, + "r": 0.8625540137290955 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 4, + "inferredAutoLayout": { + "counterAxisAlignItems": "MIN", + "counterAxisSizingMode": "FIXED", + "itemSpacing": 0, + "layoutAlign": "STRETCH", + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutPositioning": "AUTO", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "primaryAxisAlignItems": "MIN", + "primaryAxisSizingMode": "FIXED" + }, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "HORIZONTAL", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FILL", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "progress", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 1000, + "topRightRadius": 1000, + "visible": true, + "width": 480, + "x": 0, + "y": 157 + }, + "extra": {}, + "fieldErrors": {} + }, + "51:5619": { + "id": "51:5619", + "type": "RECTANGLE", + "fields": { + "parentId": "51:5618", + "absoluteBoundingBox": { + "height": 4, + "width": 160, + "x": 10169, + "y": 2058 + }, + "absoluteRenderBounds": { + "height": 4, + "width": 160, + "x": 10169, + "y": 2058 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "boundVariables": { + "fills": [ + { + "id": "VariableID:11:10", + "type": "VARIABLE_ALIAS" + } + ] + }, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:11:10", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.7843137383460999, + "g": 0.4745098054409027, + "r": 0.20000000298023224 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "height": 4, + "layoutGrow": 0, + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FILL", + "maxHeight": null, + "maxWidth": null, + "name": "bar", + "opacity": 1, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 160, + "x": 0, + "y": 0 + }, + "extra": {}, + "fieldErrors": {} + } + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/crates/devup-mcp-devup-ui/tests/folded_asset_size.rs b/crates/devup-mcp-devup-ui/tests/folded_asset_size.rs index 406eda17..018afc5b 100644 --- a/crates/devup-mcp-devup-ui/tests/folded_asset_size.rs +++ b/crates/devup-mcp-devup-ui/tests/folded_asset_size.rs @@ -53,7 +53,10 @@ fn fixed_non_square_frame_folded_into_mask_keeps_its_size() { .expect("codegen") .tsx; - assert!(tsx.contains("maskImage=\"url('/icons/BI Logo.svg')\"")); + assert!( + tsx.contains("maskImage=\"url(/icons/bi-logo.svg)\""), + "{tsx}" + ); assert!( tsx.contains("h=\"9px\"") && tsx.contains("w=\"24px\""), "folded mask lost its fixed dimensions:\n{tsx}" diff --git a/crates/devup-mcp-devup-ui/tests/free_placement_anchor.rs b/crates/devup-mcp-devup-ui/tests/free_placement_anchor.rs index 8f57b682..50b83a4d 100644 --- a/crates/devup-mcp-devup-ui/tests/free_placement_anchor.rs +++ b/crates/devup-mcp-devup-ui/tests/free_placement_anchor.rs @@ -405,7 +405,7 @@ fn an_asset_is_not_given_the_opacity_its_export_already_carries() { ); let picture = tsx .lines() - .find(|line| line.contains("/images/picture")) + .find(|line| line.contains("/images/card-picture")) .expect("the picture is an image"); assert!( !picture.contains("opacity="), diff --git a/crates/devup-mcp-devup-ui/tests/image_asset_names.rs b/crates/devup-mcp-devup-ui/tests/image_asset_names.rs index da2b63f9..cfa857ab 100644 --- a/crates/devup-mcp-devup-ui/tests/image_asset_names.rs +++ b/crates/devup-mcp-devup-ui/tests/image_asset_names.rs @@ -77,3 +77,45 @@ fn raster_instances_with_same_variant_name_and_different_images_have_distinct_co ); } } + +#[test] +fn html_entities_in_layer_names_do_not_leak_into_asset_paths() { + let snapshot: Snapshot = serde_json::from_value(json!({"fileKey":"fixture","version":null,"roots":["root"],"diagnostics":[], + "nodes":{"root":{"id":"root","type":"FRAME","fields":{"name":"Page","width":100,"height":100,"childrenIds":["img"]}}, + "img":{"id":"img","type":"RECTANGLE","fields":{"name":"R&D","parentId":"root","isAsset":true,"width":40,"height":50, + "fills":[{"type":"IMAGE","imageHash":"a","scaleMode":"CROP"}]}}}})).unwrap(); + let path = image_fill_path(&snapshot, "img", 0, false).unwrap(); + assert_eq!(path, "/images/r-d.png"); + assert!(!path.contains("amp")); +} + +#[test] +fn readable_names_reuse_image_hash_across_roles_and_number_only_collisions() { + let snapshot: Snapshot = serde_json::from_value(json!({"fileKey":"fixture","roots":["root"],"diagnostics":[],"nodes":{ + "root":{"id":"root","type":"FRAME","fields":{"name":"Main","childrenIds":["1:1","1:2","1:3"]}}, + "1:1":{"id":"1:1","type":"RECTANGLE","fields":{"name":"R&D Lab","parentId":"root","isAsset":true,"fills":[{"type":"IMAGE","imageHash":"same"}]}}, + "1:2":{"id":"1:2","type":"RECTANGLE","fields":{"name":"Mobile Photo","parentId":"root","isAsset":true,"fills":[{"type":"IMAGE","imageHash":"same"}]}}, + "1:3":{"id":"1:3","type":"RECTANGLE","fields":{"name":"R&D Lab","parentId":"root","isAsset":true,"fills":[{"type":"IMAGE","imageHash":"different"}]}} + }})).unwrap(); + let paths = ["1:1", "1:2", "1:3"].map(|id| image_fill_path(&snapshot, id, 0, true).unwrap()); + assert_eq!( + paths, + [ + "/images/r-d-lab.png", + "/images/r-d-lab.png", + "/images/r-d-lab-2.png" + ] + ); +} + +#[test] +fn distinct_svg_variants_do_not_share_a_filename_when_per_node_is_off() { + let snapshot: Snapshot = serde_json::from_value(json!({"fileKey":"fixture","roots":["a","b"],"diagnostics":[],"nodes":{ + "a":{"id":"a","type":"VECTOR","fields":{"name":"Icon","width":24,"height":24,"isAsset":true,"variantProperties":{"Kind":"clock"}}}, + "b":{"id":"b","type":"VECTOR","fields":{"name":"Icon","width":24,"height":24,"isAsset":true,"variantProperties":{"Kind":"chart"}}} + }})).unwrap(); + assert_ne!( + asset_path(&snapshot, "a", false), + asset_path(&snapshot, "b", false) + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/polymorphic_props.rs b/crates/devup-mcp-devup-ui/tests/polymorphic_props.rs index 14a68d92..62d02d33 100644 --- a/crates/devup-mcp-devup-ui/tests/polymorphic_props.rs +++ b/crates/devup-mcp-devup-ui/tests/polymorphic_props.rs @@ -3,9 +3,9 @@ use devup_mcp_devup_ui::ui_validate::validate_devup_ui_tsx; #[test] fn r12_intrinsic_as_accepts_the_rendered_elements_attributes() { for tsx in [ - r#""#, - r#""#, - r#""#, + r#""#, + r#""#, + r#""#, r#""#, r#""#, r#""#, diff --git a/crates/devup-mcp-devup-ui/tests/responsive_discovery.rs b/crates/devup-mcp-devup-ui/tests/responsive_discovery.rs index 18d5e119..c1a0461a 100644 --- a/crates/devup-mcp-devup-ui/tests/responsive_discovery.rs +++ b/crates/devup-mcp-devup-ui/tests/responsive_discovery.rs @@ -134,3 +134,27 @@ fn unrelated_numbered_screens_are_not_breakpoint_labels() { None ); } + +#[test] +fn r36_device_names_with_width_labels_merge_as_one_family() { + let frames = [ + ("73:8149", "Desktop 1440", 1440.0), + ("73:8302", "Mobile 390", 390.0), + ]; + assert!( + devup_mcp_devup_ui::codegen::responsive::breakpoint_family_is_possible( + &frames + .iter() + .map(|(_, name, width)| (*name, *width)) + .collect::>() + ) + ); + assert_eq!(merged_slots(&frames), Some(vec![0, 4])); + assert_eq!( + merged_slots(&[ + ("a", "Desktop 1440", 1440.0), + ("b", "Profile Mobile 390", 390.0) + ]), + None + ); +} diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap index 09482def..df0e41a8 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui.snap @@ -84,7 +84,7 @@ export function AStoryFProofread() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -109,7 +109,7 @@ export function AStoryFProofread() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -182,7 +182,7 @@ export function AStoryFProofread() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap index ba6cd88f..e738d7e0 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_devup_ui_embedded.snap @@ -78,7 +78,7 @@ export function AStoryFProofread() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -103,7 +103,7 @@ export function AStoryFProofread() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -176,7 +176,7 @@ export function AStoryFProofread() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap index 464a58f8..8fa1a3f2 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_diagnostics.snap @@ -1,6 +1,5 @@ --- source: crates/devup-mcp-devup-ui/tests/wquw_151.rs -assertion_line: 231 expression: json!(output.diagnostics) --- [ @@ -210,9 +209,9 @@ expression: json!(output.diagnostics) } }, "color": { - "b": 0.9244915843009949, - "g": 0.9529501795768738, - "r": 0.9695512056350708 + "b": 0.924491584301, + "g": 0.952950179577, + "r": 0.969551205635 }, "opacity": 1, "type": "SOLID", @@ -287,7 +286,7 @@ expression: json!(output.diagnostics) "originalResourceId": null, "appliedValue": { "generatedSource": [ - " \n \n " + " \n \n " ], "fallback": null, "heightPreservation": { @@ -550,9 +549,9 @@ expression: json!(output.diagnostics) } }, "color": { - "b": 0.9586742520332336, - "g": 0.96465665102005, - "r": 0.9695513844490051 + "b": 0.958674252033, + "g": 0.96465665102, + "r": 0.969551384449 }, "opacity": 1, "type": "SOLID", @@ -717,9 +716,9 @@ expression: json!(output.diagnostics) } }, "color": { - "b": 0.1764705926179886, - "g": 0.1764705926179886, - "r": 0.4588235318660736 + "b": 0.176470592618, + "g": 0.176470592618, + "r": 0.458823531866 }, "opacity": 1, "type": "SOLID", diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap index cd412993..f11b2f46 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151__wquw_151_proofread_source_map.snap @@ -767,7 +767,7 @@ expression: output.source_map "elementIndex": 13 }, { - "generatedProperty": "maskImage=\"url(/icons/Icons.svg)\"", + "generatedProperty": "maskImage=\"url(/icons/icons.svg)\"", "nodeId": "3879:35530", "property": "node", "assetId": "3879:35530:node", @@ -933,7 +933,7 @@ expression: output.source_map "elementIndex": 16 }, { - "generatedProperty": "maskImage=\"url(/icons/icons.svg)\"", + "generatedProperty": "maskImage=\"url(/icons/icons-2.svg)\"", "nodeId": "3879:35534", "property": "node", "assetId": "3879:35534:node", @@ -1486,7 +1486,7 @@ expression: output.source_map "elementIndex": 28 }, { - "generatedProperty": "maskImage=\"url(/icons/Icons.svg)\"", + "generatedProperty": "maskImage=\"url(/icons/icons.svg)\"", "nodeId": "3879:35541", "property": "node", "assetId": "3879:35541:node", diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap index add00ae6..76846968 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35503.snap @@ -25,7 +25,7 @@ export function Wquw151Frame387935503() { aspectRatio="1.9" bg="#752E2E" h="34px" - maskImage="url('/icons/BI - 아이콘.svg')" + maskImage="url(/icons/bi.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -77,7 +77,7 @@ export function Wquw151Frame387935503() { minW="0" objectFit="cover" objectPos="center" - src="/images/Frame 26086022.png" + src="/images/loading-frame-26086022.png" /> diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap index ea175cb8..df3691b5 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35518.snap @@ -86,7 +86,7 @@ export function Wquw151Frame387935518() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -111,7 +111,7 @@ export function Wquw151Frame387935518() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -190,7 +190,7 @@ export function Wquw151Frame387935518() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap index 5f8e74ab..0b2a9e57 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35569.snap @@ -148,7 +148,7 @@ export function Wquw151Frame387935569() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -173,7 +173,7 @@ export function Wquw151Frame387935569() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -252,7 +252,7 @@ export function Wquw151Frame387935569() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -614,7 +614,7 @@ export function Wquw151Frame387935569() { aspectRatio="1" bg="$text" boxSize="24px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap index b0da753f..4214318a 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35652.snap @@ -148,7 +148,7 @@ export function Wquw151Frame387935652() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -173,7 +173,7 @@ export function Wquw151Frame387935652() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -252,7 +252,7 @@ export function Wquw151Frame387935652() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -614,7 +614,7 @@ export function Wquw151Frame387935652() { aspectRatio="1" bg="$text" boxSize="24px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap index cfae75d1..21a960e9 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35729.snap @@ -148,7 +148,7 @@ export function Wquw151Frame387935729() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -173,7 +173,7 @@ export function Wquw151Frame387935729() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -252,7 +252,7 @@ export function Wquw151Frame387935729() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -614,7 +614,7 @@ export function Wquw151Frame387935729() { aspectRatio="1" bg="$text" boxSize="24px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap index 6fadaad5..e4900a3d 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35887.snap @@ -148,7 +148,7 @@ export function Wquw151Frame387935887() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -173,7 +173,7 @@ export function Wquw151Frame387935887() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -252,7 +252,7 @@ export function Wquw151Frame387935887() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -611,7 +611,7 @@ export function Wquw151Frame387935887() { aspectRatio="1" bg="$text" boxSize="24px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap index f90c41fd..15097227 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_35973.snap @@ -148,7 +148,7 @@ export function Wquw151Frame387935973() { aspectRatio="1" bg="$caption" boxSize="16px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -173,7 +173,7 @@ export function Wquw151Frame387935973() { bg="$captionLight" boxSize="40px" flexShrink="0" - maskImage="url(/icons/icons.svg)" + maskImage="url(/icons/icons-2.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -252,7 +252,7 @@ export function Wquw151Frame387935973() { aspectRatio="1" bg="$text" boxSize="20px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -611,7 +611,7 @@ export function Wquw151Frame387935973() { aspectRatio="1" bg="$text" boxSize="24px" - maskImage="url(/icons/Icons.svg)" + maskImage="url(/icons/icons.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" diff --git a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap index abd026e0..86cc64e4 100644 --- a/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap +++ b/crates/devup-mcp-devup-ui/tests/snapshots/wquw_151_frames__wquw_151_frame_3879_36059.snap @@ -25,7 +25,7 @@ export function Wquw151Frame387936059() { aspectRatio="1" bg="$caption" h="100%" - maskImage="url('/icons/Frame 26086041.svg')" + maskImage="url(/icons/header-frame-26086041.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -37,7 +37,7 @@ export function Wquw151Frame387936059() { aspectRatio="1" bg="$captionLight" boxSize="20px" - maskImage="url('/icons/arrow_7134700 1.svg')" + maskImage="url(/icons/arrow-7134700-1.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -87,7 +87,7 @@ export function Wquw151Frame387936059() { aspectRatio="1" bg="$secondary" boxSize="16px" - maskImage="url('/icons/information-button_1176 1.svg')" + maskImage="url(/icons/information-button-1176-1.svg)" maskPos="center" maskRepeat="no-repeat" maskSize="contain" @@ -129,7 +129,7 @@ export function Wquw151Frame387936059() { > 직접 입력 - +
녹음하기 - +
작성 완료 - +
직접 입력 - +
녹음하기 - +
작성 완료 - +
, height: Option) -> Value { } fn filename_part(name: &str) -> String { + let decoded = name + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace(""", "\"") + .replace("'", "'"); let mut slug = String::new(); - for c in name.nfc() { + for c in decoded.nfc() { if c.is_alphanumeric() { slug.extend(c.to_lowercase()); } else if !slug.is_empty() && !slug.ends_with('-') { diff --git a/crates/devup-mcp-figma/src/assets/asset_manifest.rs b/crates/devup-mcp-figma/src/assets/asset_manifest.rs index 4b1c2093..b92c7369 100644 --- a/crates/devup-mcp-figma/src/assets/asset_manifest.rs +++ b/crates/devup-mcp-figma/src/assets/asset_manifest.rs @@ -48,9 +48,11 @@ pub struct AssetExportStage { pub elapsed_ms: u64, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum AssetFormat { + #[default] + Auto, Png, Webp, Jpg, @@ -61,6 +63,7 @@ pub enum AssetFormat { impl AssetFormat { pub fn mime_type(self) -> &'static str { match self { + Self::Auto => "application/octet-stream", Self::Png => "image/png", Self::Webp => "image/webp", Self::Jpg => "image/jpeg", @@ -71,6 +74,7 @@ impl AssetFormat { pub fn extension(self) -> &'static str { match self { + Self::Auto => "", Self::Png => "png", Self::Webp => "webp", Self::Jpg => "jpg", @@ -137,6 +141,7 @@ pub struct AssetSelection { #[serde(default)] pub render_mode: AssetRenderMode, pub asset_id: String, + #[serde(default)] pub format: AssetFormat, pub scale: f64, } @@ -425,7 +430,7 @@ pub fn validate_asset_options( } if max_width.is_some_and(|w| w == 0 || w > crate::MAX_WEBP_DIMENSION) || ((max_width.is_some() || srcset) - && (format != AssetFormat::Webp + && (!matches!(format, AssetFormat::Webp | AssetFormat::Auto) || !mode.is_original() || mode == AssetRenderMode::Fill)) { @@ -922,7 +927,12 @@ pub fn resolve_asset_selections( }) .flatten(); let asset = source_fill.unwrap_or(asset); - let render_mode = if source_fill.is_some() { + let format = if selection.format == AssetFormat::Auto { + if asset.image_hash.is_some() { AssetFormat::Webp } else { AssetFormat::Svg } + } else { selection.format }; + let render_mode = if format == AssetFormat::Svg && selection.format == AssetFormat::Auto { + AssetRenderMode::Node + } else if source_fill.is_some() { AssetRenderMode::OriginalSource } else { selection.render_mode @@ -945,10 +955,10 @@ pub fn resolve_asset_selections( node_id: asset.node_id.clone(), field: asset.field.clone(), image_hash: asset.image_hash.clone(), - format: selection.format, + format, scale: selection.scale, render_mode, - quality: selection.quality, + quality: selection.quality.or((selection.format == AssetFormat::Auto && format == AssetFormat::Webp).then_some(85)), lossless: selection.lossless, }) }) diff --git a/crates/devup-mcp-figma/src/collector/advance.rs b/crates/devup-mcp-figma/src/collector/advance.rs index 97a2b3c5..8653df1e 100644 --- a/crates/devup-mcp-figma/src/collector/advance.rs +++ b/crates/devup-mcp-figma/src/collector/advance.rs @@ -152,7 +152,7 @@ impl CollectorSession { scale: 2.0, render_mode: crate::AssetRenderMode::OriginalSource, quality: Some(85), - lossless: Some(false), + lossless: None, }) .collect(); for (index, asset) in census.iter().enumerate() { @@ -175,7 +175,7 @@ impl CollectorSession { failure.scale = Some(2.0); failure.max_width = self.request.asset_selections[index].max_width; failure.quality = Some(85); - failure.lossless = Some(false); + failure.lossless = None; self.asset_results.push(failure); } } @@ -407,4 +407,4 @@ impl CollectorSession { } Ok(CollectorStep::AwaitingResults) } -} \ No newline at end of file +} diff --git a/crates/devup-mcp-figma/src/collector/w5_tests.rs b/crates/devup-mcp-figma/src/collector/w5_tests.rs index 721d7e50..5a78ad1b 100644 --- a/crates/devup-mcp-figma/src/collector/w5_tests.rs +++ b/crates/devup-mcp-figma/src/collector/w5_tests.rs @@ -207,6 +207,17 @@ mod w5_tests { } } + #[test] + fn r12_page_inventory_stops_at_screen_frames_instead_of_walking_their_contents() { + let setup = format!("{TREE}\nfigma.getNodeByIdAsync = async () => page;\nfor(let index=0;index<2000;index++) node('deep:'+index, 'GROUP', 'Decorative', frame);\n"); + let output = run_script(include_str!("../scripts/explore.js"), &setup, + "__DEVUP_EXPLORE__", json!({"projectionLimit":200,"textPreviewLimit":0})); + let nodes = output["nodes"].as_array().unwrap(); + assert!(nodes.iter().any(|node| node["id"] == "3:1")); + assert!(!nodes.iter().any(|node| node["id"].as_str().unwrap().starts_with("deep:"))); + assert_eq!(nodes[0]["fields"]["projectionTruncated"], false); + } + #[test] fn w5_previews_are_retained_when_the_envelope_has_room() { let setup = @@ -235,6 +246,14 @@ mod w5_tests { assert_eq!(ids, BTreeSet::from(["1:1", "2:1"])); } + #[test] + fn feedback50_page_search_loads_descendants_without_changing_the_viewer_page() { + let setup = format!("{TREE}\nlet loaded = false;\npage.loadAsync = async () => {{ loaded = true; }};\npage.findAll = predicate => {{ if (!loaded) return []; return page.children.flatMap(child => [child, ...child.findAll(predicate)]).filter(predicate); }};\nfigma.getNodeByIdAsync = async () => page;\nfigma.setCurrentPageAsync = async () => {{ throw new Error('search changed viewer page'); }};"); + let output = run_script(include_str!("../scripts/search.js"), &setup, + "__DEVUP_SEARCH__", json!({"query":"", "nodeTypes":["SECTION"], "matchKind":"normalized", "limit":5})); + assert!(output["nodes"].as_array().unwrap().iter().any(|node| node["id"] == "2:1")); + } + fn page_output(ids: &[String]) -> UpstreamResult { UpstreamResult { raw: json!({ diff --git a/crates/devup-mcp-figma/src/lib.rs b/crates/devup-mcp-figma/src/lib.rs index 7a3f3bf5..7b02413f 100644 --- a/crates/devup-mcp-figma/src/lib.rs +++ b/crates/devup-mcp-figma/src/lib.rs @@ -63,7 +63,9 @@ pub use payload::{ pub use resources::{ ResourceKind, ResourceOccurrence, ResourceScope, UsedResourceRefs, collect_used_resource_refs, }; -pub use search::{SearchOptions, SearchResult, search_snapshot}; +pub use search::{ + SearchOptions, SearchResult, excluded_duplicate_warnings, node_excluded_reason, search_snapshot, +}; pub use section::{ BatchLimits, SectionBatch, SectionCandidate, SectionIndex, SectionSummary, build_section_index, plan_batches, screen_owners, diff --git a/crates/devup-mcp-figma/src/scripts/explore.js b/crates/devup-mcp-figma/src/scripts/explore.js index 0fc94bcc..3f44a79d 100644 --- a/crates/devup-mcp-figma/src/scripts/explore.js +++ b/crates/devup-mcp-figma/src/scripts/explore.js @@ -206,6 +206,7 @@ if (descendantScope && "children" in scopeAnchor) { } if ("children" in node) { for (const child of node.children) { + if (requestedPage && ["FRAME", "COMPONENT", "INSTANCE", "COMPONENT_SET"].includes(node.type)) continue; nestedQueue.push({ node: child, ancestors: [...ancestors, node] }); } } @@ -230,7 +231,7 @@ const compact = [...included.values()] childCount: "children" in node ? node.children.length : 0, // Select the structural projection before spending space on previews. textPreview: "", - ...navigationSummary(node), + ...(requestedPage ? {} : navigationSummary(node)), pageChildIndex: pageChildIndex >= 0 ? pageChildIndex : null, // A page or the document itself has no `visible`, and Figma throws on // reading a property a node does not have rather than returning diff --git a/crates/devup-mcp-figma/src/scripts/search.js b/crates/devup-mcp-figma/src/scripts/search.js index 34b5bd6f..64510aac 100644 --- a/crates/devup-mcp-figma/src/scripts/search.js +++ b/crates/devup-mcp-figma/src/scripts/search.js @@ -7,7 +7,7 @@ if (!root) throw new Error("DEVUP_NODE_NOT_FOUND"); let page = root; while (page && page.type !== "PAGE") page = page.parent; if (!page || page.type !== "PAGE") throw new Error("DEVUP_PAGE_NOT_FOUND"); -await figma.setCurrentPageAsync(page); +await page.loadAsync(); const options = "__DEVUP_SEARCH__"; const defaultTypes = ["PAGE", "SECTION", "FRAME", "COMPONENT_SET", "COMPONENT"]; @@ -38,6 +38,8 @@ function levenshtein(left, right) { } function score(name) { + const trimmed = options.query.trim(); + if (trimmed === "" || trimmed === "*") return 100; if (name === options.query) return 400; if (options.matchKind === "exact") return null; const candidate = normalize(name); @@ -51,19 +53,29 @@ function score(name) { return distance <= threshold ? Math.max(0, 50 - distance) : null; } +function excluded(node) { + for (let current = node; current && current.type !== "DOCUMENT"; current = current.parent) { + if (current.visible === false || current.opacity === 0) return true; + const name = (current.name || "").toLowerCase(); + if (["trash", "archive", "draft", "copy", "hidden", "휴지통", "보관", "초안", "복사", "pdf", "저장용", "export", "출력"].some(keyword => name.includes(keyword))) return true; + } + return false; +} + const descendants = root === page ? page.findAll(() => true) : "findAll" in root ? root.findAll(() => true) : []; -const candidates = [root, ...descendants] +const ranked = [root, ...descendants] .filter((node) => allowedTypes.has(node.type) && typeof node.name === "string") .map((node) => ({ node, score: score(node.name) })) .filter((entry) => entry.score !== null) .sort((left, right) => + Number(excluded(left.node)) - Number(excluded(right.node)) || right.score - left.score || left.node.name.localeCompare(right.node.name) || left.node.id.localeCompare(right.node.id), - ) - .slice(0, options.limit); + ); +const candidates = ranked.slice(0, options.limit); const included = new Map([[page.id, page]]); // Keep the anchor and its ancestry even when nothing matches. Consumers @@ -85,6 +97,9 @@ return { type: node.type, fields: { name: node.name, + visible: node.visible !== false, + opacity: typeof node.opacity === "number" ? node.opacity : 1, + searchCandidatesTruncated: node === root && ranked.length > candidates.length, parentId: node.parent && node.parent.type !== "DOCUMENT" ? node.parent.id : null, childrenIds: "children" in node ? node.children.map((child) => child.id) : [], }, diff --git a/crates/devup-mcp-figma/src/search.rs b/crates/devup-mcp-figma/src/search.rs index 198ce0e3..448d68c4 100644 --- a/crates/devup-mcp-figma/src/search.rs +++ b/crates/devup-mcp-figma/src/search.rs @@ -30,6 +30,66 @@ pub struct SearchResult { pub canonical_url: String, pub match_kind: String, pub score: u32, + /// Set when the page or an ancestor name marks the node as trash, + /// archive, draft or copy: the keyword that matched. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub excluded: Option, +} + +const EXCLUDED_KEYWORDS: &[&str] = &[ + "trash", + "archive", + "draft", + "copy", + "hidden", + "휴지통", + "보관", + "초안", + "복사", + "pdf", + "저장용", + "export", + "출력", +]; + +fn excluded_reason(breadcrumb: &[String], page_name: Option<&str>) -> Option { + page_name + .into_iter() + .chain(breadcrumb.iter().map(String::as_str)) + .find_map(|name| { + let lowered = name.to_lowercase(); + EXCLUDED_KEYWORDS + .iter() + .find(|keyword| lowered.contains(*keyword)) + .map(|keyword| format!("{keyword} ({name})")) + }) +} + +pub fn node_excluded_reason(snapshot: &Snapshot, node_id: &str) -> Option { + let parents = parent_index(snapshot); + let mut current = Some(node_id); + let mut visited = std::collections::BTreeSet::new(); + while let Some(id) = current { + if !visited.insert(id) { + break; + } + let node = snapshot.nodes.get(id)?; + let name = node.typed_view().name().unwrap_or(id); + if node.fields.get("visible") == Some(&serde_json::Value::Bool(false)) + || node + .fields + .get("opacity") + .and_then(serde_json::Value::as_f64) + == Some(0.0) + { + return Some(format!("hidden ({name})")); + } + if let Some(reason) = excluded_reason(&[], Some(name)) { + return Some(reason); + } + current = parents.get(id).map(String::as_str); + } + None } pub fn search_snapshot( @@ -38,16 +98,17 @@ pub fn search_snapshot( options: &SearchOptions, ) -> Result, DevupError> { let query = options.query.trim(); - if query.is_empty() { + let list_by_type = query.is_empty() || query == "*"; + if list_by_type && options.node_types.is_empty() { return Err(DevupError::new( - ErrorCode::DevupFigmaNodeNotFound, - "Search query cannot be empty.", + ErrorCode::DevupInvalidInput, + "Search query cannot be empty unless nodeTypes is given. Pass nodeTypes (for example [\"SECTION\"]) with an empty query or \"*\" to list every node of those types.", false, )); } if options.limit == 0 || options.limit > 100 { return Err(DevupError::new( - ErrorCode::DevupFigmaResponseTooLarge, + ErrorCode::DevupInvalidInput, "Search limit must be between 1 and 100.", false, )); @@ -57,7 +118,7 @@ pub fn search_snapshot( "exact" | "normalized" | "fuzzy" ) { return Err(DevupError::new( - ErrorCode::DevupFigmaNodeNotFound, + ErrorCode::DevupInvalidInput, "match must be exact, normalized, or fuzzy.", false, )); @@ -82,11 +143,16 @@ pub fn search_snapshot( .filter(|node| types.iter().any(|node_type| node_type == &node.node_type)) .filter_map(|node| { let name = node.typed_view().name()?; - let (kind, score) = - match_score(name, query, &normalized_query, options.match_kind.as_str())?; + let (kind, score) = if list_by_type { + ("type", 100) + } else { + match_score(name, query, &normalized_query, options.match_kind.as_str())? + }; let breadcrumb = breadcrumb(snapshot, &parents, &node.id); let page_name = ancestor_page(snapshot, &parents, &node.id); + let excluded = node_excluded_reason(snapshot, &node.id); Some(SearchResult { + excluded, node_id: node.id.clone(), name: name.to_owned(), node_type: node.node_type.clone(), @@ -99,9 +165,10 @@ pub fn search_snapshot( }) .collect::>(); results.sort_by(|left, right| { - right - .score - .cmp(&left.score) + left.excluded + .is_some() + .cmp(&right.excluded.is_some()) + .then_with(|| right.score.cmp(&left.score)) .then_with(|| left.name.cmp(&right.name)) .then_with(|| left.node_id.cmp(&right.node_id)) }); @@ -109,6 +176,32 @@ pub fn search_snapshot( Ok(results) } +/// One warning per name that appears both on an excluded page (trash, archive, +/// PDF copy...) and on a normal page, so callers do not pick the discarded copy. +pub fn excluded_duplicate_warnings(results: &[SearchResult]) -> Vec { + let mut warnings = Vec::new(); + let mut seen = std::collections::BTreeSet::new(); + for excluded in results.iter().filter(|result| result.excluded.is_some()) { + let key = normalize(&excluded.name); + let normal = results + .iter() + .find(|other| other.excluded.is_none() && normalize(&other.name) == key); + if let Some(normal) = normal + && seen.insert(key) + { + warnings.push(format!( + "\"{}\" exists on a normal page ({}, node {}) and on an excluded page ({}, node {}). Prefer the normal one; the excluded copy is trash, archive, draft or an export copy.", + excluded.name, + normal.page_name.as_deref().unwrap_or("?"), + normal.node_id, + excluded.excluded.as_deref().unwrap_or("excluded"), + excluded.node_id, + )); + } + } + warnings +} + fn match_score<'a>( name: &str, query: &str, @@ -292,6 +385,185 @@ mod tests { assert!(results[0].canonical_url.ends_with("node-id=1-1")); } + fn typed_snapshot() -> (Snapshot, FigmaTarget) { + let nodes = [ + ("0:1", "PAGE", "Screens", vec!["1:1", "1:2"]), + ("1:1", "SECTION", "About", vec![]), + ("1:2", "FRAME", "Home", vec![]), + ] + .into_iter() + .map(|(id, node_type, name, children)| { + ( + id.to_owned(), + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(json!({ + "name": name, + "childrenIds": children, + })) + .unwrap(), + extra: Default::default(), + field_errors: Default::default(), + }, + ) + }) + .collect(); + let snapshot = Snapshot { + file_key: "key".to_owned(), + version: None, + roots: vec!["0:1".to_owned()], + nodes, + diagnostics: Vec::new(), + }; + let target = FigmaTarget { + file_key: snapshot.file_key.clone(), + node_id: None, + branch_key: None, + }; + (snapshot, target) + } + + fn options(query: &str, node_types: &[&str]) -> SearchOptions { + SearchOptions { + query: query.to_owned(), + node_types: node_types.iter().map(|t| (*t).to_owned()).collect(), + match_kind: "normalized".to_owned(), + limit: 20, + } + } + + #[test] + fn an_empty_or_star_query_with_node_types_lists_every_node_of_that_type() { + let (snapshot, target) = typed_snapshot(); + for query in ["", " ", "*"] { + let results = + search_snapshot(&snapshot, &target, &options(query, &["section"])).unwrap(); + assert_eq!(results.len(), 1, "query {query:?}"); + assert_eq!(results[0].node_id, "1:1"); + assert_eq!(results[0].match_kind, "type"); + } + } + + #[test] + fn matches_under_a_trash_page_are_flagged_and_sorted_last() { + let nodes = [ + ("0:1", "PAGE", "휴지통", vec!["1:1"]), + ("0:2", "PAGE", "디자인 시스템", vec!["1:2"]), + ("1:1", "FRAME", "특허", vec![]), + ("1:2", "FRAME", "특허", vec![]), + ] + .into_iter() + .map(|(id, node_type, name, children)| { + ( + id.to_owned(), + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(json!({ + "name": name, + "childrenIds": children, + })) + .unwrap(), + extra: Default::default(), + field_errors: Default::default(), + }, + ) + }) + .collect(); + let snapshot = Snapshot { + file_key: "key".to_owned(), + version: None, + roots: vec!["0:1".to_owned(), "0:2".to_owned()], + nodes, + diagnostics: Vec::new(), + }; + let target = FigmaTarget { + file_key: "key".to_owned(), + node_id: None, + branch_key: None, + }; + let results = search_snapshot(&snapshot, &target, &options("특허", &[])).unwrap(); + assert_eq!(results.len(), 2); + assert_eq!(results[0].node_id, "1:2"); + assert!(results[0].excluded.is_none()); + assert_eq!(results[1].node_id, "1:1"); + assert!(results[1].excluded.as_deref().unwrap().contains("휴지통")); + } + + #[test] + fn a_name_on_both_an_excluded_and_a_normal_page_gets_one_warning() { + let make = |id: &str, page: &str, excluded: Option<&str>| SearchResult { + node_id: id.to_owned(), + name: "특허".to_owned(), + node_type: "FRAME".to_owned(), + page_name: Some(page.to_owned()), + breadcrumb: Vec::new(), + canonical_url: String::new(), + match_kind: "exact".to_owned(), + score: 400, + excluded: excluded.map(str::to_owned), + }; + let results = [ + make("1:2", "디자인 시스템", None), + make("1:1", "휴지통", Some("휴지통 (휴지통)")), + make("1:3", "PDF", Some("pdf (PDF)")), + ]; + let warnings = excluded_duplicate_warnings(&results); + assert_eq!(warnings.len(), 1); + assert!(warnings[0].contains("1:2") && warnings[0].contains("1:1")); + assert!(excluded_duplicate_warnings(&results[..1]).is_empty()); + assert!(excluded_duplicate_warnings(&results[1..]).is_empty()); + } + + #[test] + fn pdf_and_export_pages_are_flagged_as_excluded() { + for page in ["PDF", "저장용", "Export", "출력본"] { + assert!(excluded_reason(&[], Some(page)).is_some(), "{page}"); + } + assert!(excluded_reason(&[], Some("디자인 시스템")).is_none()); + } + + #[test] + fn feedback08_hidden_ancestors_are_excluded() { + let (mut snapshot, target) = typed_snapshot(); + snapshot + .nodes + .get_mut("0:1") + .unwrap() + .fields + .insert("visible".into(), json!(false)); + let results = search_snapshot(&snapshot, &target, &options("Home", &[])).unwrap(); + assert!( + results[0] + .excluded + .as_deref() + .is_some_and(|reason| reason.contains("hidden")) + ); + } + + #[test] + fn an_empty_query_without_node_types_is_invalid_input() { + let (snapshot, target) = typed_snapshot(); + let error = search_snapshot(&snapshot, &target, &options("", &[])).unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupInvalidInput); + } + + #[test] + fn a_bad_limit_or_match_kind_is_invalid_input() { + let (snapshot, target) = typed_snapshot(); + for limit in [0, 101] { + let mut bad = options("a", &[]); + bad.limit = limit; + let error = search_snapshot(&snapshot, &target, &bad).unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupInvalidInput, "limit {limit}"); + } + let mut bad = options("a", &[]); + bad.match_kind = "regex".to_owned(); + let error = search_snapshot(&snapshot, &target, &bad).unwrap_err(); + assert_eq!(error.code, ErrorCode::DevupInvalidInput); + } + #[test] fn fuzzy_matching_is_opt_in() { assert!(match_score("Proofread", "Proofred", "proofred", "normalized").is_none()); diff --git a/crates/devup-mcp-figma/src/text/collector-w5_tests_TREE-ae8d8ae7.md b/crates/devup-mcp-figma/src/text/collector-w5_tests_TREE-ae8d8ae7.md index 398bd04b..31aadc36 100644 --- a/crates/devup-mcp-figma/src/text/collector-w5_tests_TREE-ae8d8ae7.md +++ b/crates/devup-mcp-figma/src/text/collector-w5_tests_TREE-ae8d8ae7.md @@ -1,6 +1,7 @@ const doc = {id:'0:0', type:'DOCUMENT'}; const page = {id:'1:1', type:'PAGE', name:'Page', parent:doc, children:[]}; +page.loadAsync = async () => {}; function node(id, type, name, parent) { const n = {id, type, name, parent, children:[], x:0, y:0, width:390, height:844, visible:true}; n.findAll = predicate => n.children.flatMap(c => [c, ...c.findAll(predicate)]).filter(predicate); diff --git a/crates/devup-mcp-figma/src/webp.rs b/crates/devup-mcp-figma/src/webp.rs index 13de5076..f7e194eb 100644 --- a/crates/devup-mcp-figma/src/webp.rs +++ b/crates/devup-mcp-figma/src/webp.rs @@ -28,7 +28,9 @@ pub fn validate_webp_options( if quality.is_some_and(|q| q > 100) { return Err(invalid("WebP quality must be an integer from 0 to 100.")); } - if format != AssetFormat::Webp && (quality.is_some() || lossless.is_some()) { + if !matches!(format, AssetFormat::Webp | AssetFormat::Auto) + && (quality.is_some() || lossless.is_some()) + { return Err(invalid( "quality and lossless apply only to format webp; remove them or request webp.", )); @@ -296,7 +298,18 @@ pub(crate) fn finish( "srcset requires a known positive node display width.", )); } - let cap = request.max_width.unwrap_or(width).min(width); + let default_cap = if request.render_mode == crate::AssetRenderMode::OriginalSource + && request.format == AssetFormat::Webp + { + display_width.map(|display| (display * 2.0).ceil().clamp(1.0, f64::from(width)) as u32) + } else { + None + }; + let cap = request + .max_width + .or(default_cap) + .unwrap_or(width) + .min(width); let base_width = if request.srcset { (display_width.unwrap().ceil() as u32).max(1).min(cap) } else { @@ -305,7 +318,14 @@ pub(crate) fn finish( let rgba = resized(&source_rgba, base_width); let resized_source = rgba.width() != width || rgba.height() != height; let quality = request.quality.unwrap_or(85); - let lossless = request.lossless.unwrap_or(false); + let lossless = request.lossless.unwrap_or_else(|| { + let mut colors = std::collections::BTreeSet::new(); + source_rgba.pixels().any(|pixel| pixel[3] != 255) + && source_rgba.pixels().all(|pixel| { + colors.insert(pixel.0); + colors.len() <= 256 + }) + }); let encoded = if request.format == AssetFormat::Webp { encode_webp(&rgba, quality, lossless)? } else { diff --git a/crates/devup-mcp-figma/tests/hero_source_selection.rs b/crates/devup-mcp-figma/tests/hero_source_selection.rs index c5115009..5d40b6f8 100644 --- a/crates/devup-mcp-figma/tests/hero_source_selection.rs +++ b/crates/devup-mcp-figma/tests/hero_source_selection.rs @@ -4,6 +4,34 @@ use devup_mcp_figma::{ }; use serde_json::json; +#[test] +fn omitted_source_format_resolves_vector_svg_and_photo_webp() { + let snapshot: Snapshot = serde_json::from_value(json!({ + "fileKey":"defaults", "roots":["icon","photo"], "diagnostics":[], "nodes":{ + "icon":{"id":"icon","type":"VECTOR","fields":{"name":"Icon","width":24,"height":24,"fills":[{"type":"SOLID","color":{"r":0,"g":0,"b":0}}]}}, + "photo":{"id":"photo","type":"RECTANGLE","fields":{"name":"Photo","width":300,"height":200,"fills":[{"type":"IMAGE","imageHash":"photo","scaleMode":"FILL"}]}} + } + })).unwrap(); + for (node, extension) in [("icon", "svg"), ("photo", "webp")] { + let selection: AssetSelection = serde_json::from_value(json!({ + "assetId":format!("{node}:node"),"scale":2 + })) + .unwrap(); + let request = resolve_asset_selections(&snapshot, &[selection]) + .unwrap() + .remove(0); + assert_eq!(request.format.extension(), extension); + assert_eq!( + request.render_mode, + if node == "icon" { + AssetRenderMode::Node + } else { + AssetRenderMode::OriginalSource + } + ); + } +} + #[test] fn hero_node_target_selects_original_photo_without_baking_text_or_buttons() { let snapshot: Snapshot = serde_json::from_value(json!({ diff --git a/crates/devup-mcp-figma/tests/manifest_covers_readers.rs b/crates/devup-mcp-figma/tests/manifest_covers_readers.rs index 8e9f02c3..43c02109 100644 --- a/crates/devup-mcp-figma/tests/manifest_covers_readers.rs +++ b/crates/devup-mcp-figma/tests/manifest_covers_readers.rs @@ -18,6 +18,9 @@ const NOT_NODE_FIELDS: &[&str] = &[ "parentType", "childrenIds", "styledTextSegments", + "mainComponentId", // Written by component_identity_helpers.js using getMainComponentAsync. + "mainComponentSetId", // Written by component_identity_helpers.js from the main component parent. + "componentId", // REST snapshot identity alias; not a synchronous plugin node property. "nodeScreenIds", // Computed by section_index.js from visited ancestry, not a Figma property. "navigationContentWidth", // Computed from visible child widths by explore.js/section_index.js; not a Figma property. // Envelope, pagination and probe records, not nodes. diff --git a/crates/devup-mcp-figma/tests/upstream_contract.rs b/crates/devup-mcp-figma/tests/upstream_contract.rs index 441a40db..71826c07 100644 --- a/crates/devup-mcp-figma/tests/upstream_contract.rs +++ b/crates/devup-mcp-figma/tests/upstream_contract.rs @@ -214,7 +214,8 @@ fn search_uses_a_compiled_read_only_page_projection() { let code = call.arguments()["code"].as_str().unwrap().to_owned(); assert_eq!(call.tool_name(), "use_figma"); - assert!(code.contains("figma.setCurrentPageAsync(page)")); + assert!(code.contains("page.loadAsync()")); + assert!(!code.contains("figma.setCurrentPageAsync(page)")); assert!(code.contains("page.findAll")); assert!(code.contains("Essence")); assert!(!code.contains("eval(")); diff --git a/crates/devup-mcp-figma/tests/web_ready_collector.rs b/crates/devup-mcp-figma/tests/web_ready_collector.rs index 630f8ea6..38c6780e 100644 --- a/crates/devup-mcp-figma/tests/web_ready_collector.rs +++ b/crates/devup-mcp-figma/tests/web_ready_collector.rs @@ -199,11 +199,11 @@ fn preset_schedules_bounded_batches_and_retains_nested_hidden_and_multifill_rows } for asset in parts.assets { assert_eq!(asset.quality, Some(85)); - assert_eq!(asset.lossless, Some(false)); + assert_eq!(asset.lossless, None); if asset.status == AssetStatus::Exported { let info = asset.render_info.unwrap(); assert_eq!(info["representation"], "original-fill-transcoded"); - assert_eq!(info["fidelity"], "approximate"); + assert_eq!(info["fidelity"], "lossless-pixels"); assert_eq!(info["byteEvidence"]["sha256"], asset.sha256.unwrap()); assert!(info["compression"]["referencePNG"].is_object()); } @@ -260,7 +260,7 @@ fn malformed_fragmented_native_png_fails_one_asset_and_keeps_the_entire_preset() Some("DEVUP_ASSET_WEBP_POSTPROCESS_FAILED") ); assert_eq!(failed.quality, Some(85)); - assert_eq!(failed.lossless, Some(false)); + assert_eq!(failed.lossless, None); assert!(failed.data_base64.is_none()); assert!( parts diff --git a/crates/devup-mcp-figma/tests/webp.rs b/crates/devup-mcp-figma/tests/webp.rs index ef037e66..12aa9561 100644 --- a/crates/devup-mcp-figma/tests/webp.rs +++ b/crates/devup-mcp-figma/tests/webp.rs @@ -63,6 +63,30 @@ fn lossless_preserves_every_rgba_pixel_including_transparent_rgb_and_actual_iden assert_eq!(info["outputSize"]["width"], 93.0); } } + +#[test] +fn flat_alpha_graphics_default_to_lossless_webp_without_overriding_explicit_lossy() { + let rgba = RgbaImage::from_fn(16, 16, |x, _| { + if x < 8 { + Rgba([203, 17, 91, 0]) + } else { + Rgba([11, 201, 43, 127]) + } + }); + let png = encode(rgba.clone(), ImageFormat::Png); + let mut req = request(85, false); + req.lossless = None; + let entry = exported_asset_from_bytes(&req, &png).unwrap(); + let bytes = STANDARD.decode(entry.data_base64.unwrap()).unwrap(); + assert_eq!(image::load_from_memory(&bytes).unwrap().to_rgba8(), rgba); + assert_eq!(entry.render_info.unwrap()["compression"]["lossless"], true); + req.lossless = Some(false); + let explicit = exported_asset_from_bytes(&req, &png).unwrap(); + assert_eq!( + explicit.render_info.unwrap()["compression"]["lossless"], + false + ); +} #[test] fn lossy_quality_changes_rgb_and_bytes_but_preserves_alpha_and_uses_honest_savings() { let rgba = pixels(128, 96); diff --git a/crates/devup-mcp/Cargo.toml b/crates/devup-mcp/Cargo.toml index d498ce32..f318acaa 100644 --- a/crates/devup-mcp/Cargo.toml +++ b/crates/devup-mcp/Cargo.toml @@ -35,6 +35,7 @@ serde_json.workspace = true sha2.workspace = true syn.workspace = true tokio.workspace = true +toml_edit = { version = "0.25.15", default-features = false, features = ["parse"] } tracing-subscriber.workspace = true url.workspace = true diff --git a/crates/devup-mcp/src/server/asset_guard.rs b/crates/devup-mcp/src/server/asset_guard.rs index 5f0d9394..6fcd599c 100644 --- a/crates/devup-mcp/src/server/asset_guard.rs +++ b/crates/devup-mcp/src/server/asset_guard.rs @@ -155,7 +155,9 @@ pub(super) fn export_coverage( { continue; } - if depth <= 1 || node.node_type == "SECTION" || assets.contains(id) { + if node.node_type != "COMPONENT_SET" + && (depth <= 1 || node.node_type == "SECTION" || assets.contains(id)) + { wanted.insert(id.to_owned()); } // Leaf assets (including a flattened wrapper) represent all their children. @@ -290,6 +292,12 @@ pub(super) fn violations(sources: &[(&str, &str)], project_root: Option<&str>) - let mut context = Map::new(); context.insert("assetUrl".into(), json!(url)); context.insert("publicDirs".into(), json!(looked_in)); + context.insert("nextAction".into(), json!({ + "tool": "devup_figma_export", + "how": "Use the original Figma URL and the discovered icon nodeId in assetRequests; set outputPath under public/ to serve this assetUrl. Do not invent node IDs or replace the missing icon with a placeholder.", + "assetUrl": url, + "requiredInputs": ["url", "assetRequests[].nodeId", "assetRequests[].outputPath"] + })); if !name.is_empty() { context.insert("sourceName".into(), json!(name)); } @@ -331,7 +339,7 @@ fn served(dirs: &[PathBuf], url: &str) -> bool { /// Root-relative asset URLs with their byte ranges: the quoted value of a /// `src` prop or property, and the inside of every `url(...)`. -fn asset_urls(source: &str) -> Vec<(String, [usize; 2])> { +pub(super) fn asset_urls(source: &str) -> Vec<(String, [usize; 2])> { #[derive(Default)] struct Literals { src: Vec<[usize; 2]>, diff --git a/crates/devup-mcp/src/server/asset_job_progress.rs b/crates/devup-mcp/src/server/asset_job_progress.rs new file mode 100644 index 00000000..67ee75de --- /dev/null +++ b/crates/devup-mcp/src/server/asset_job_progress.rs @@ -0,0 +1,31 @@ +use std::collections::BTreeMap; +use serde_json::Value; + +pub(super) fn request_key(asset_id: &str) -> &str { + let id = asset_id.split(":fills:").next().unwrap_or(asset_id); + ["node", "visible", "fill"] + .iter() + .find_map(|suffix| id.strip_suffix(&format!(":{suffix}"))) + .unwrap_or(id) +} + +pub(super) fn request_progress(assets: &[Value]) -> (usize, usize, usize, usize) { + let mut groups: BTreeMap<&str, Vec<&str>> = BTreeMap::new(); + for asset in assets { + groups + .entry(request_key(asset["assetId"].as_str().unwrap_or(""))) + .or_default() + .push(asset["status"].as_str().unwrap_or("")); + } + let mut counts = (groups.len(), 0, 0, 0); + for rows in groups.values() { + if rows.contains(&"exported") { + counts.1 += 1; + } else if rows.contains(&"failed") { + counts.2 += 1; + } else if rows.contains(&"pending") { + counts.3 += 1; + } + } + counts +} diff --git a/crates/devup-mcp/src/server/asset_jobs.rs b/crates/devup-mcp/src/server/asset_jobs.rs index b4b546a1..433656fe 100644 --- a/crates/devup-mcp/src/server/asset_jobs.rs +++ b/crates/devup-mcp/src/server/asset_jobs.rs @@ -10,6 +10,8 @@ use devup_mcp_figma::{ CollectionRequest, CollectorSession, DevupError, ErrorCode, ReadToolCall, UpstreamResult, }; use serde_json::{Value, json}; + +use super::asset_job_progress::{request_key, request_progress}; use sha2::{Digest, Sha256}; use tokio::{sync::Notify, time::Instant}; @@ -36,6 +38,7 @@ const COMPACT_ASSET_FIELDS: &[&str] = &[ "fileState", "fileStateReason", "suggestedFilename", + "duplicateOf", ]; #[derive(Clone, Default)] @@ -51,6 +54,8 @@ pub(super) struct AssetJob { resume: Notify, cancellation: Notify, cancelled: std::sync::atomic::AtomicBool, + /// The delivery the first call asked for; every poll keeps it. + delivery: super::delivery::DeliveryMode, } struct JobState { @@ -122,7 +127,9 @@ impl AssetJobs { } } let PendingOperation::Export { - asset_output_paths, .. + asset_output_paths, + delivery, + .. } = operation else { unreachable!() @@ -152,6 +159,7 @@ impl AssetJobs { resume: Notify::new(), cancellation: Notify::new(), cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: *delivery, state: Mutex::new(JobState { state: "running", stage: "acquisition", @@ -316,7 +324,12 @@ impl AssetJob { ) .collect::>(); for progress in &mut state.assets { - if let Some(asset) = assets.iter().find(|a| a["assetId"] == progress["assetId"]) { + if let Some(asset) = assets.iter().find(|a| a["assetId"] == progress["assetId"]) + .or_else(|| assets.iter().find(|a| { + progress["assetId"].as_str().is_some_and(|id| id.ends_with(":node")) + && a["assetId"].as_str().zip(progress["assetId"].as_str()) + .is_some_and(|(actual, requested)| request_key(actual) == request_key(requested)) + })) { for field in [ "status", "byteLength", @@ -383,8 +396,12 @@ impl AssetJob { }; // A terminal job cannot leave acquisition rows promising future work. // Preserve successfully acquired rows if a later projection/write failed. + let mut left_unattempted = false; for asset in &mut state.assets { - if asset["status"] == "pending" { + if asset["status"] == "pending" && asset["fileState"] == "written" { + asset["status"] = json!("exported"); + } else if asset["status"] == "pending" { + left_unattempted = result.is_ok(); asset["status"] = json!("failed"); asset["acquisitionState"] = json!("not-attempted"); asset["errorCode"] = result @@ -399,12 +416,23 @@ impl AssetJob { .unwrap_or_else(|| json!("The job finished before this asset was acquired.")); } } + if left_unattempted && state.state == "complete" { + state.state = "partial"; + } state.stage = "finished"; state.error = result.as_ref().err().cloned(); state.result = Some(result); state.finished = Some(Instant::now()); } + /// A poll keeps the delivery the first call asked for. + fn poll_arguments(&self, mut arguments: Value) -> Value { + if self.delivery != super::delivery::DeliveryMode::Auto { + arguments["delivery"] = json!(self.delivery); + } + arguments + } + #[cfg(test)] fn response(&self) -> Result { self.response_with(false) @@ -426,11 +454,31 @@ impl AssetJob { ); } } + let mut first_by_hash: BTreeMap = BTreeMap::new(); + let mut duplicates: BTreeMap = BTreeMap::new(); + for asset in &state.assets { + let (Some(id), Some(hash)) = (asset["assetId"].as_str(), asset["sha256"].as_str()) + else { + continue; + }; + match first_by_hash.get(hash) { + Some(first) => { + duplicates.insert(id.to_owned(), first.clone()); + } + None => { + first_by_hash.insert(hash.to_owned(), id.to_owned()); + } + } + } let assets: Vec<_> = state .assets .iter() .map(|asset| { let mut asset = asset.clone(); + if let Some(first) = asset["assetId"].as_str().and_then(|id| duplicates.get(id)) + .filter(|first| asset["assetId"].as_str().is_some_and(|id| request_key(id) != request_key(first))) { + asset["duplicateOf"] = json!(first); + } let path = asset["assetId"].as_str().and_then(|id| self.paths.get(id)); asset["requestedOutputPath"] = json!(path); if asset.get("fileState").is_none() { @@ -474,7 +522,15 @@ impl AssetJob { let terminal = state.finished.is_some() || state.stage == "finished" || matches!(state.state, "failed" | "complete" | "finished"); - let next_action = if terminal { + let remaining: Vec<&str> = state + .assets + .iter() + .filter(|a| a["acquisitionState"] == "not-attempted") + .filter_map(|a| a["assetId"].as_str()) + .collect(); + let next_action = if state.state == "partial" { + json!({"tool":"devup_figma_export","arguments":self.poll_arguments(json!({"jobId":self.id,"jobAction":"resume","remainingAssetIds":remaining}))}) + } else if terminal { state .error .as_ref() @@ -491,11 +547,11 @@ impl AssetJob { .filter(|v| v["arguments"]["jobId"].is_null()) .unwrap_or(Value::Null) } else { - json!({"tool":"devup_figma_export","arguments":{"jobId":self.id,"jobAction":if state.state=="paused" {"resume"} else {"status"}}}) + json!({"tool":"devup_figma_export","arguments":self.poll_arguments(json!({"jobId":self.id,"jobAction":if state.state=="paused" {"resume"} else {"status"}}))}) }; let mut job = json!({"jobId":self.id,"budget":self.budget,"state":state.state,"stage":state.stage,"assets":assets, - "assetProgress":{"total":state.assets.len(),"exported":state.assets.iter().filter(|a|a["status"]=="exported").count(),"failed":state.assets.iter().filter(|a|a["status"]=="failed").count(), - "pending":state.assets.iter().filter(|a|a["status"]=="pending").count(),"maxAssetsPerBatch":6,"maxRetainedAssetBytes":devup_mcp_figma::MAX_COLLECTED_ASSET_BYTES, + "assetProgress":{"total":request_progress(&state.assets).0,"exported":request_progress(&state.assets).1,"failed":request_progress(&state.assets).2, + "pending":request_progress(&state.assets).3,"substeps":state.assets.len(),"maxAssetsPerBatch":6,"maxRetainedAssetBytes":devup_mcp_figma::MAX_COLLECTED_ASSET_BYTES, "observations":if state.assets.len()>32 {"summarized; full observations in completed manifest/audit resources"}else{"full"}}, "completedCalls":state.completed_calls,"calls":calls,"elapsedMs":self.started.elapsed().as_millis() as u64, "lastError":state.error,"checkpointScope":"server-process","retentionSeconds":JOB_LIFETIME.as_secs(), @@ -601,324 +657,5 @@ impl DevupServer { } #[cfg(test)] -mod tests { - use super::*; - - #[test] - fn image_modes_have_distinct_jobs_and_same_mode_recovers_its_job() { - let selection = devup_mcp_figma::AssetSelection { - usage_aspect_ratio: None, - max_width: None, - srcset: false, - visible_scope_node_id: None, - asset_id: "sample:fills:0".into(), - format: devup_mcp_figma::AssetFormat::Png, - scale: 1.0, - render_mode: devup_mcp_figma::AssetRenderMode::Node, - quality: None, - lossless: None, - }; - let mut request = CollectionRequest::new( - devup_mcp_figma::FigmaTarget::parse( - "https://www.figma.com/design/Fixture/Example?node-id=1-1", - ) - .unwrap(), - devup_mcp_figma::CollectionScope::Node, - ); - request.asset_selections = vec![selection]; - let operation = PendingOperation::Export { - outputs: vec!["assetManifest".into()], - previous_design_fingerprints: None, - component_name: None, - include_diagnostics: false, - root_layout: devup_mcp_devup_ui::codegen::RootLayout::default(), - asset_names_per_node: true, - scope: "node".into(), - theme_options: Default::default(), - strict: false, - output_paths: Default::default(), - page_scaffold: None, - frame_ids: vec![], - all_screens: false, - asset_captures: request.asset_selections.clone(), - web_ready_images: false, - asset_output_paths: Default::default(), - asset_public_root: None, - fields: vec![], - response_selection: Default::default(), - delivery: super::super::delivery::DeliveryMode::Auto, - width_policy: None, - }; - let jobs = AssetJobs::default(); - let (node, created) = jobs.acquire(&operation, &request, false).unwrap(); - assert!(created); - let (same, created) = jobs.acquire(&operation, &request, false).unwrap(); - assert!(!created); - assert_eq!(node.id, same.id); - request.asset_selections[0].render_mode = devup_mcp_figma::AssetRenderMode::Fill; - let (fill, created) = jobs.acquire(&operation, &request, false).unwrap(); - assert!(created); - assert_ne!(node.id, fill.id); - request.asset_selections[0].render_mode = devup_mcp_figma::AssetRenderMode::Auto; - let (automatic, created) = jobs.acquire(&operation, &request, false).unwrap(); - assert!(created); - assert_ne!(automatic.id, node.id); - assert_ne!(automatic.id, fill.id); - request.asset_selections[0].format = devup_mcp_figma::AssetFormat::Webp; - request.asset_selections[0].quality = Some(20); - request.asset_selections[0].lossless = Some(false); - let (quality20, _) = jobs.acquire(&operation, &request, false).unwrap(); - request.asset_selections[0].quality = Some(21); - let (quality21, _) = jobs.acquire(&operation, &request, false).unwrap(); - assert_ne!(quality20.id, quality21.id); - request.asset_selections[0].lossless = Some(true); - let (lossless, _) = jobs.acquire(&operation, &request, false).unwrap(); - assert_ne!(lossless.id, quality21.id); - let variant_jobs = AssetJobs::default(); - let mut ids = std::collections::BTreeSet::new(); - for variant in 0..6 { - let mut changed = request.clone(); - match variant { - 0 => changed.asset_selections[0].max_width = Some(240), - 1 => changed.asset_selections[0].srcset = true, - 2 => changed.asset_selections[0].scale = 1.5, - 3 => changed.asset_selections[0].visible_scope_node_id = Some("parent".into()), - 4 => changed.asset_selections[0].usage_aspect_ratio = Some(1.25), - _ => { - changed.asset_selections[0].render_mode = - devup_mcp_figma::AssetRenderMode::OriginalSource - } - } - let (job, created) = variant_jobs.acquire(&operation, &changed, false).unwrap(); - assert!(created); - assert!(ids.insert(job.id.clone())); - let (same, created) = variant_jobs.acquire(&operation, &changed, false).unwrap(); - assert!(!created); - assert_eq!(same.id, job.id); - } - request.asset_selections.clear(); - request.web_ready_images = true; - let (cached_preset, _) = jobs.acquire(&operation, &request, false).unwrap(); - cached_preset.captured(&[serde_json::from_value(json!({"assetId":"cached:fills:0","nodeId":"cached","field":"fills/0","sourceKind":"image-fill", - "format":"webp","scale":1,"quality":80,"lossless":false,"status":"failed","errorCode":"DEVUP_ASSET_NODE_HIDDEN"})).unwrap()]); - let cached = cached_preset.response_with(true).unwrap(); - assert_eq!(cached["exportJob"]["assets"].as_array().unwrap().len(), 1); - assert_eq!(cached["exportJob"]["assets"][0]["quality"], 80); - cached_preset.state.lock().unwrap().state = "paused"; - cached_preset.resume(); - assert_eq!(cached_preset.state.lock().unwrap().state, "running"); - cached_preset.cancel(); - cached_preset.finish(Err(DevupError::new( - ErrorCode::DevupInvalidInput, - "cancelled synthetic pending preset", - false, - ))); - let cancelled = cached_preset.response().unwrap_err(); - assert_eq!(cancelled.details["exportJob"]["state"], "cancelled"); - assert_eq!(cancelled.details["assetJob"]["state"], "cancelled"); - assert!(cancelled.details["exportJob"]["nextAction"].is_null()); - assert_eq!( - automatic.state.lock().unwrap().assets[0]["renderMode"], - "auto" - ); - assert_eq!(fill.state.lock().unwrap().assets[0]["renderMode"], "fill"); - fill.finish(Ok( - json!({"resources":[{"assetMetadata":{"assets":[{"assetId":"sample:fills:0", - "renderMode":"fill","renderInfo":{"outputSize":{"width":32,"height":16}}, - "suggestedFilename":"gallery-picture-fill.png"}]}}]}), - )); - let progress = fill.response_with(true).unwrap(); - assert_eq!( - progress["exportJob"]["assets"][0]["renderInfo"]["outputSize"]["width"], - 32 - ); - assert_eq!( - progress["exportJob"]["assets"][0]["suggestedFilename"], - "gallery-picture-fill.png" - ); - } - - #[test] - fn r10_terminal_jobs_never_offer_repeated_status_as_next_action() { - for correction in [false, true] { - let job = AssetJob { - id: "r10".into(), - key: "r10".into(), - budget: json!({}), - started: Instant::now(), - resume: Notify::new(), - cancellation: Notify::new(), - cancelled: std::sync::atomic::AtomicBool::new(false), - paths: BTreeMap::new(), - state: Mutex::new(JobState { - state: "running", - stage: "snapshot", - calls: vec![], - completed_calls: 0, - error: None, - result: None, - finished: None, - assets: vec![json!({"assetId":"pending:fills:0","status":"pending"})], - }), - }; - assert_eq!( - job.response().unwrap()["exportJob"]["nextAction"]["arguments"]["jobAction"], - "status" - ); - job.state - .lock() - .unwrap() - .calls - .push(json!({"stage":"asset-export","state":"running","startedMs":0})); - let progress = job.response().unwrap(); - assert!(progress["exportJob"]["calls"][0]["elapsedMs"].is_u64()); - assert!(progress["exportJob"]["assetTimeoutMs"].is_u64()); - let next = if correction { - json!({"tool":"devup_figma_export","arguments":{"url":"https://www.figma.com/design/test?node-id=1-1","frameIds":["2:1"]}}) - } else { - Value::Null - }; - job.finish(Err(DevupError::with_details( - ErrorCode::DevupFigmaNodeNotFound, - "test", - false, - json!({"nextAction":next}), - ))); - let error = job.response().unwrap_err(); - assert_eq!(error.details["exportJob"]["nextAction"], next); - assert_eq!(error.details["assetJob"]["aliasOf"], "exportJob"); - assert_eq!(error.details["exportJob"]["assets"][0]["status"], "failed"); - assert_eq!( - error.details["exportJob"]["assets"][0]["acquisitionState"], - "not-attempted" - ); - assert_eq!(error.details["exportJob"]["assetProgress"]["pending"], 0); - assert_eq!(error.details["exportJob"]["assetProgress"]["failed"], 1); - assert_eq!( - error.details["exportJob"]["assetProgress"]["maxRetainedAssetBytes"], - devup_mcp_figma::MAX_COLLECTED_ASSET_BYTES - ); - if !correction { - assert!(error.details["exportJob"]["nextActionReason"].is_string()); - } - job.finish(Ok(json!({"status":"complete"}))); - assert!(job.response().unwrap()["exportJob"]["nextAction"].is_null()); - } - } - - #[test] - fn r3_shared_path_reports_only_matching_bytes_as_written() { - let path = - std::env::temp_dir().join(format!("devup-r3-collision-{}.bin", rand::random::())); - std::fs::write(&path, b"first").unwrap(); - let hash = |bytes: &[u8]| { - Sha256::digest(bytes) - .iter() - .map(|b| format!("{b:02x}")) - .collect::() - }; - let path_text = path.to_string_lossy().to_string(); - let job = AssetJob { - id: "test".into(), - key: "test".into(), - budget: json!({}), - started: Instant::now(), - resume: Notify::new(), - cancellation: Notify::new(), - cancelled: std::sync::atomic::AtomicBool::new(false), - paths: BTreeMap::from([ - ("a".into(), path_text.clone()), - ("b".into(), path_text.clone()), - ]), - state: Mutex::new(JobState { - state: "running", - stage: "projection-and-write", - calls: vec![], - completed_calls: 0, - error: None, - result: None, - finished: None, - assets: vec![ - json!({"assetId":"a","status":"exported","sha256":hash(b"first")}), - json!({"assetId":"b","status":"exported","sha256":hash(b"second")}), - ], - }), - }; - job.finish(Ok( - json!({"outputPaths":{"asset:a":path_text,"asset:b":path_text}}), - )); - let response = job.response().unwrap(); - assert_eq!(response["exportJob"]["assets"][0]["fileState"], "written"); - assert_eq!( - response["exportJob"]["assets"][1]["fileState"], - "not-written" - ); - std::fs::remove_file(path).unwrap(); - } - - #[test] - fn polls_answer_compact_rows_and_reference_the_alias() { - let job = AssetJob { - id: "compact".into(), - key: "compact".into(), - budget: json!({}), - started: Instant::now(), - resume: Notify::new(), - cancellation: Notify::new(), - cancelled: std::sync::atomic::AtomicBool::new(false), - paths: BTreeMap::from([ - ("a".into(), "/out/a.svg".into()), - ("b".into(), "/out/b.svg".into()), - ]), - state: Mutex::new(JobState { - state: "running", - stage: "asset-export", - calls: vec![], - completed_calls: 1, - error: None, - result: None, - finished: None, - assets: vec![ - json!({"assetId":"a","status":"exported","byteLength":10,"sha256":"0".repeat(64), - "exportDiagnostics":{"large":"x".repeat(4096)},"renderInfo":{"large":"y".repeat(4096)}}), - json!({"assetId":"b","status":"pending"}), - ], - }), - }; - - let compact = job.response().unwrap(); - let rows = compact["exportJob"]["assets"].as_array().unwrap(); - assert_eq!(compact["exportJob"]["assetRows"], "compact"); - assert!(rows[0].get("exportDiagnostics").is_none(), "{compact}"); - assert!(rows[0].get("renderInfo").is_none(), "{compact}"); - assert_eq!(rows[0]["sha256"], "0".repeat(64)); - assert_eq!(rows[0]["requestedOutputPath"], "/out/a.svg"); - // Exported but not yet written: the state says why. - assert_eq!(rows[0]["fileState"], "pending"); - assert!( - rows[0]["fileStateReason"] - .as_str() - .unwrap() - .contains("projection-and-write") - ); - assert_eq!(rows[1]["fileStateReason"], "Not acquired yet."); - assert_eq!( - compact["exportJob"]["assetDetail"]["arguments"]["responseFields"], - json!(["exportJob.assets"]) - ); - // The alias names the job; it no longer repeats it. - assert_eq!( - compact["assetJob"], - json!({"aliasOf":"exportJob","jobId":"compact","state":"running"}) - ); - assert!( - serde_json::to_vec(&compact).unwrap().len() < 4096, - "{compact}" - ); - - let full = job.response_with(true).unwrap(); - assert_eq!(full["exportJob"]["assetRows"], "full"); - assert!(full["exportJob"]["assets"][0]["renderInfo"].is_object()); - assert!(full["exportJob"].get("assetDetail").is_none()); - } -} +#[path = "asset_jobs_tests.rs"] +mod tests; diff --git a/crates/devup-mcp/src/server/asset_jobs_tests.rs b/crates/devup-mcp/src/server/asset_jobs_tests.rs new file mode 100644 index 00000000..4275857b --- /dev/null +++ b/crates/devup-mcp/src/server/asset_jobs_tests.rs @@ -0,0 +1,453 @@ +use super::*; + +#[test] +fn image_modes_have_distinct_jobs_and_same_mode_recovers_its_job() { + let selection = devup_mcp_figma::AssetSelection { + usage_aspect_ratio: None, + max_width: None, + srcset: false, + visible_scope_node_id: None, + asset_id: "sample:fills:0".into(), + format: devup_mcp_figma::AssetFormat::Png, + scale: 1.0, + render_mode: devup_mcp_figma::AssetRenderMode::Node, + quality: None, + lossless: None, + }; + let mut request = CollectionRequest::new( + devup_mcp_figma::FigmaTarget::parse( + "https://www.figma.com/design/Fixture/Example?node-id=1-1", + ) + .unwrap(), + devup_mcp_figma::CollectionScope::Node, + ); + request.asset_selections = vec![selection]; + let operation = PendingOperation::Export { + outputs: vec!["assetManifest".into()], + previous_design_fingerprints: None, + component_name: None, + include_diagnostics: false, + root_layout: devup_mcp_devup_ui::codegen::RootLayout::default(), + asset_names_per_node: true, + scope: "node".into(), + theme_options: Default::default(), + strict: false, + output_paths: Default::default(), + page_scaffold: None, + frame_ids: vec![], + all_screens: false, + asset_captures: request.asset_selections.clone(), + web_ready_images: false, + asset_output_paths: Default::default(), + asset_public_root: None, + fields: vec![], + response_selection: Default::default(), + delivery: super::super::delivery::DeliveryMode::Auto, + width_policy: None, + }; + let jobs = AssetJobs::default(); + let (node, created) = jobs.acquire(&operation, &request, false).unwrap(); + assert!(created); + let (same, created) = jobs.acquire(&operation, &request, false).unwrap(); + assert!(!created); + assert_eq!(node.id, same.id); + request.asset_selections[0].render_mode = devup_mcp_figma::AssetRenderMode::Fill; + let (fill, created) = jobs.acquire(&operation, &request, false).unwrap(); + assert!(created); + assert_ne!(node.id, fill.id); + request.asset_selections[0].render_mode = devup_mcp_figma::AssetRenderMode::Auto; + let (automatic, created) = jobs.acquire(&operation, &request, false).unwrap(); + assert!(created); + assert_ne!(automatic.id, node.id); + assert_ne!(automatic.id, fill.id); + request.asset_selections[0].format = devup_mcp_figma::AssetFormat::Webp; + request.asset_selections[0].quality = Some(20); + request.asset_selections[0].lossless = Some(false); + let (quality20, _) = jobs.acquire(&operation, &request, false).unwrap(); + request.asset_selections[0].quality = Some(21); + let (quality21, _) = jobs.acquire(&operation, &request, false).unwrap(); + assert_ne!(quality20.id, quality21.id); + request.asset_selections[0].lossless = Some(true); + let (lossless, _) = jobs.acquire(&operation, &request, false).unwrap(); + assert_ne!(lossless.id, quality21.id); + let variant_jobs = AssetJobs::default(); + let mut ids = std::collections::BTreeSet::new(); + for variant in 0..6 { + let mut changed = request.clone(); + match variant { + 0 => changed.asset_selections[0].max_width = Some(240), + 1 => changed.asset_selections[0].srcset = true, + 2 => changed.asset_selections[0].scale = 1.5, + 3 => changed.asset_selections[0].visible_scope_node_id = Some("parent".into()), + 4 => changed.asset_selections[0].usage_aspect_ratio = Some(1.25), + _ => { + changed.asset_selections[0].render_mode = + devup_mcp_figma::AssetRenderMode::OriginalSource + } + } + let (job, created) = variant_jobs.acquire(&operation, &changed, false).unwrap(); + assert!(created); + assert!(ids.insert(job.id.clone())); + let (same, created) = variant_jobs.acquire(&operation, &changed, false).unwrap(); + assert!(!created); + assert_eq!(same.id, job.id); + } + request.asset_selections.clear(); + request.web_ready_images = true; + let (cached_preset, _) = jobs.acquire(&operation, &request, false).unwrap(); + cached_preset.captured(&[serde_json::from_value(json!({"assetId":"cached:fills:0","nodeId":"cached","field":"fills/0","sourceKind":"image-fill", + "format":"webp","scale":1,"quality":80,"lossless":false,"status":"failed","errorCode":"DEVUP_ASSET_NODE_HIDDEN"})).unwrap()]); + let cached = cached_preset.response_with(true).unwrap(); + assert_eq!(cached["exportJob"]["assets"].as_array().unwrap().len(), 1); + assert_eq!(cached["exportJob"]["assets"][0]["quality"], 80); + cached_preset.state.lock().unwrap().state = "paused"; + cached_preset.resume(); + assert_eq!(cached_preset.state.lock().unwrap().state, "running"); + cached_preset.cancel(); + cached_preset.finish(Err(DevupError::new( + ErrorCode::DevupInvalidInput, + "cancelled synthetic pending preset", + false, + ))); + let cancelled = cached_preset.response().unwrap_err(); + assert_eq!(cancelled.details["exportJob"]["state"], "cancelled"); + assert_eq!(cancelled.details["assetJob"]["state"], "cancelled"); + assert!(cancelled.details["exportJob"]["nextAction"].is_null()); + assert_eq!( + automatic.state.lock().unwrap().assets[0]["renderMode"], + "auto" + ); + assert_eq!(fill.state.lock().unwrap().assets[0]["renderMode"], "fill"); + fill.finish(Ok( + json!({"resources":[{"assetMetadata":{"assets":[{"assetId":"sample:fills:0", + "renderMode":"fill","renderInfo":{"outputSize":{"width":32,"height":16}}, + "suggestedFilename":"gallery-picture-fill.png"}]}}]}), + )); + let progress = fill.response_with(true).unwrap(); + assert_eq!( + progress["exportJob"]["assets"][0]["renderInfo"]["outputSize"]["width"], + 32 + ); + assert_eq!( + progress["exportJob"]["assets"][0]["suggestedFilename"], + "gallery-picture-fill.png" + ); +} + +#[test] +fn r10_terminal_jobs_never_offer_repeated_status_as_next_action() { + for correction in [false, true] { + let job = AssetJob { + id: "r10".into(), + key: "r10".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: Default::default(), + paths: BTreeMap::new(), + state: Mutex::new(JobState { + state: "running", + stage: "snapshot", + calls: vec![], + completed_calls: 0, + error: None, + result: None, + finished: None, + assets: vec![json!({"assetId":"pending:fills:0","status":"pending"})], + }), + }; + assert_eq!( + job.response().unwrap()["exportJob"]["nextAction"]["arguments"]["jobAction"], + "status" + ); + job.state + .lock() + .unwrap() + .calls + .push(json!({"stage":"asset-export","state":"running","startedMs":0})); + let progress = job.response().unwrap(); + assert!(progress["exportJob"]["calls"][0]["elapsedMs"].is_u64()); + assert!(progress["exportJob"]["assetTimeoutMs"].is_u64()); + let next = if correction { + json!({"tool":"devup_figma_export","arguments":{"url":"https://www.figma.com/design/test?node-id=1-1","frameIds":["2:1"]}}) + } else { + Value::Null + }; + job.finish(Err(DevupError::with_details( + ErrorCode::DevupFigmaNodeNotFound, + "test", + false, + json!({"nextAction":next}), + ))); + let error = job.response().unwrap_err(); + assert_eq!(error.details["exportJob"]["nextAction"], next); + assert_eq!(error.details["assetJob"]["aliasOf"], "exportJob"); + assert_eq!(error.details["exportJob"]["assets"][0]["status"], "failed"); + assert_eq!( + error.details["exportJob"]["assets"][0]["acquisitionState"], + "not-attempted" + ); + assert_eq!(error.details["exportJob"]["assetProgress"]["pending"], 0); + assert_eq!(error.details["exportJob"]["assetProgress"]["failed"], 1); + assert_eq!( + error.details["exportJob"]["assetProgress"]["maxRetainedAssetBytes"], + devup_mcp_figma::MAX_COLLECTED_ASSET_BYTES + ); + if !correction { + assert!(error.details["exportJob"]["nextActionReason"].is_string()); + } + job.finish(Ok(json!({"status":"complete"}))); + assert!(job.response().unwrap()["exportJob"]["nextAction"].is_null()); + } +} + +#[test] +fn r3_shared_path_reports_only_matching_bytes_as_written() { + let path = + std::env::temp_dir().join(format!("devup-r3-collision-{}.bin", rand::random::())); + std::fs::write(&path, b"first").unwrap(); + let hash = |bytes: &[u8]| { + Sha256::digest(bytes) + .iter() + .map(|b| format!("{b:02x}")) + .collect::() + }; + let path_text = path.to_string_lossy().to_string(); + let job = AssetJob { + id: "test".into(), + key: "test".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: Default::default(), + paths: BTreeMap::from([ + ("a".into(), path_text.clone()), + ("b".into(), path_text.clone()), + ]), + state: Mutex::new(JobState { + state: "running", + stage: "projection-and-write", + calls: vec![], + completed_calls: 0, + error: None, + result: None, + finished: None, + assets: vec![ + json!({"assetId":"a","status":"exported","sha256":hash(b"first")}), + json!({"assetId":"b","status":"exported","sha256":hash(b"second")}), + ], + }), + }; + job.finish(Ok( + json!({"outputPaths":{"asset:a":path_text,"asset:b":path_text}}), + )); + let response = job.response().unwrap(); + assert_eq!(response["exportJob"]["assets"][0]["fileState"], "written"); + assert_eq!( + response["exportJob"]["assets"][1]["fileState"], + "not-written" + ); + std::fs::remove_file(path).unwrap(); +} + +#[test] +fn polls_answer_compact_rows_and_reference_the_alias() { + let job = AssetJob { + id: "compact".into(), + key: "compact".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: Default::default(), + paths: BTreeMap::from([ + ("a".into(), "/out/a.svg".into()), + ("b".into(), "/out/b.svg".into()), + ]), + state: Mutex::new(JobState { + state: "running", + stage: "asset-export", + calls: vec![], + completed_calls: 1, + error: None, + result: None, + finished: None, + assets: vec![ + json!({"assetId":"a","status":"exported","byteLength":10,"sha256":"0".repeat(64), + "exportDiagnostics":{"large":"x".repeat(4096)},"renderInfo":{"large":"y".repeat(4096)}}), + json!({"assetId":"b","status":"pending"}), + ], + }), + }; + + let compact = job.response().unwrap(); + let rows = compact["exportJob"]["assets"].as_array().unwrap(); + assert_eq!(compact["exportJob"]["assetRows"], "compact"); + assert!(rows[0].get("exportDiagnostics").is_none(), "{compact}"); + assert!(rows[0].get("renderInfo").is_none(), "{compact}"); + assert_eq!(rows[0]["sha256"], "0".repeat(64)); + assert_eq!(rows[0]["requestedOutputPath"], "/out/a.svg"); + // Exported but not yet written: the state says why. + assert_eq!(rows[0]["fileState"], "pending"); + assert!( + rows[0]["fileStateReason"] + .as_str() + .unwrap() + .contains("projection-and-write") + ); + assert_eq!(rows[1]["fileStateReason"], "Not acquired yet."); + assert_eq!( + compact["exportJob"]["assetDetail"]["arguments"]["responseFields"], + json!(["exportJob.assets"]) + ); + // The alias names the job; it no longer repeats it. + assert_eq!( + compact["assetJob"], + json!({"aliasOf":"exportJob","jobId":"compact","state":"running"}) + ); + assert!( + serde_json::to_vec(&compact).unwrap().len() < 4096, + "{compact}" + ); + + let full = job.response_with(true).unwrap(); + assert_eq!(full["exportJob"]["assetRows"], "full"); + assert!(full["exportJob"]["assets"][0]["renderInfo"].is_object()); + assert!(full["exportJob"].get("assetDetail").is_none()); +} + +#[test] +fn r26_polls_keep_the_delivery_of_the_first_call() { + let job = |delivery| AssetJob { + id: "p26".into(), + key: "p26".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery, + paths: BTreeMap::new(), + state: Mutex::new(JobState { + state: "running", + stage: "acquisition", + calls: vec![], + completed_calls: 0, + error: None, + result: None, + finished: None, + assets: vec![], + }), + }; + let resource = job(super::super::delivery::DeliveryMode::Resource); + let next = resource.response().unwrap()["exportJob"]["nextAction"].clone(); + assert_eq!(next["arguments"]["delivery"], "resource"); + assert_eq!(next["arguments"]["jobAction"], "status"); + let auto = job(super::super::delivery::DeliveryMode::Auto); + let next = auto.response().unwrap()["exportJob"]["nextAction"].clone(); + assert!(next["arguments"].get("delivery").is_none()); +} + +#[test] +fn r39_unattempted_assets_make_a_partial_job_with_resume_and_one_count_per_request() { + let job = AssetJob { + id: "p39".into(), + key: "p39".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: Default::default(), + paths: BTreeMap::new(), + state: Mutex::new(JobState { + state: "running", + stage: "projection-and-write", + calls: vec![], + completed_calls: 0, + error: None, + result: None, + finished: None, + assets: vec![ + json!({"assetId":"1:1:node","status":"exported"}), + json!({"assetId":"1:2:node","status":"pending"}), + json!({"assetId":"1:2:fills:0","status":"pending"}), + ], + }), + }; + job.finish(Ok(json!({"status":"complete"}))); + let job_json = job.response().unwrap()["exportJob"].clone(); + assert_eq!(job_json["state"], "partial"); + assert_eq!(job_json["nextAction"]["arguments"]["jobAction"], "resume"); + assert_eq!(job_json["assetProgress"]["total"], 2); + assert_eq!(job_json["assetProgress"]["exported"], 1); + assert_eq!(job_json["assetProgress"]["failed"], 1); + assert_eq!(job_json["assetProgress"]["substeps"], 3); +} + +#[test] +fn r39_identical_bytes_are_marked_duplicate_and_substeps_count_once() { + let job = AssetJob { + id: "dup".into(), + key: "dup".into(), + budget: json!({}), + started: Instant::now(), + resume: Notify::new(), + cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), + delivery: Default::default(), + paths: BTreeMap::new(), + state: Mutex::new(JobState { + state: "running", + stage: "asset-export", + calls: vec![], + completed_calls: 1, + error: None, + result: None, + finished: None, + assets: vec![ + json!({"assetId":"1:2:node","status":"exported","sha256":"aa"}), + json!({"assetId":"1:2:fills:0","status":"exported","sha256":"aa"}), + json!({"assetId":"1:3","status":"exported","sha256":"bb"}), + json!({"assetId":"1:4","status":"exported","sha256":"aa"}), + ], + }), + }; + let response = job.response().unwrap(); + let rows = response["exportJob"]["assets"].as_array().unwrap(); + assert!(rows[0].get("duplicateOf").is_none()); + assert!(rows[1].get("duplicateOf").is_none()); + assert!(rows[2].get("duplicateOf").is_none()); + assert_eq!(rows[3]["duplicateOf"], "1:2:node"); + assert_eq!(response["exportJob"]["assetProgress"]["total"], 3); + assert_eq!(response["exportJob"]["assetProgress"]["substeps"], 4); +} + +#[test] +fn r39_node_request_adopts_written_source_fill_evidence() { + let path = std::env::temp_dir().join(format!("devup-r39-{}.webp", rand::random::())); + std::fs::write(&path, b"source").unwrap(); + let hash = Sha256::digest(b"source").iter().map(|byte| format!("{byte:02x}")).collect::(); + let job = AssetJob { + id: "source".into(), key: "source".into(), budget: json!({}), started: Instant::now(), + resume: Notify::new(), cancellation: Notify::new(), + cancelled: std::sync::atomic::AtomicBool::new(false), delivery: Default::default(), + paths: BTreeMap::new(), + state: Mutex::new(JobState { state: "running", stage: "projection-and-write", calls: vec![], + completed_calls: 0, error: None, result: None, finished: None, + assets: vec![json!({"assetId":"44:1558:node","status":"pending"})] }), + }; + job.finish(Ok(json!({"assetManifest":{"assets":[{"assetId":"44:1558:fills:0","status":"exported","sha256":hash}]}, + "outputPaths":{"asset:44:1558:node":path}}))); + let response = job.response().unwrap(); + assert_eq!(response["exportJob"]["state"], "complete"); + assert_eq!(response["exportJob"]["assets"][0]["status"], "exported"); + assert_eq!(response["exportJob"]["assets"][0]["fileState"], "written"); + assert_eq!(response["exportJob"]["assetProgress"]["total"], 1); + std::fs::remove_file(path).unwrap(); +} diff --git a/crates/devup-mcp/src/server/audit_plan.rs b/crates/devup-mcp/src/server/audit_plan.rs index 8705e28e..04f980bf 100644 --- a/crates/devup-mcp/src/server/audit_plan.rs +++ b/crates/devup-mcp/src/server/audit_plan.rs @@ -11,3 +11,4 @@ // Source sections share this module to preserve privacy and test names. include!("audit_plan/planning_and_capture.rs"); include!("audit_plan/static_params.rs"); +include!("audit_plan/prerequisites.rs"); diff --git a/crates/devup-mcp/src/server/audit_plan/planning_and_capture.rs b/crates/devup-mcp/src/server/audit_plan/planning_and_capture.rs index e50960d6..9532de9c 100644 --- a/crates/devup-mcp/src/server/audit_plan/planning_and_capture.rs +++ b/crates/devup-mcp/src/server/audit_plan/planning_and_capture.rs @@ -327,6 +327,7 @@ pub(super) fn url_plan( let mut nav_checked = false; for (width, frame_id, _) in &target.frames { let Some((artifact_id, payload)) = sources.frame(frame_id) else { + checks.push(check(json!({"kind": "page-health", "label": "design reference unavailable", "widths": [width], "unavailableReason": "Design comparison inconclusive: frame artifact missing or expired; export the frame again."}))); missing.push(json!({"kind": "frame", "nodeId": frame_id, "width": width, "why": "No artifact passed holds this frame; section, asset and geometry checks for this width are missing.", "call": {"tool": "devup_figma_export", "arguments": {"url": format!(""), "outputs": ["tsx", "referencePng"], "projectRoot": ""}}})); @@ -335,6 +336,7 @@ pub(super) fn url_plan( }; let reference = sources.reference_png(frame_id); if reference.is_none() { + checks.push(check(json!({"kind": "page-health", "label": "design reference unavailable", "widths": [width], "unavailableReason": "Design comparison inconclusive: referencePng missing or expired; export the frame again."}))); missing.push(json!({"kind": "referencePng", "nodeId": frame_id, "width": width, "why": format!("No referencePng for the frame drawn at {width}px, so its page comparison cannot run."), "call": {"tool": "devup_figma_export", "arguments": {"url": format!(""), "outputs": ["referencePng"]}}})); @@ -651,18 +653,15 @@ pub(super) fn slug(url: &str) -> String { .collect() } -/// What auditPlan was asked for. pub(super) struct AuditRequest<'a> { pub root: &'a str, pub base_url: &'a str, pub base_urls: &'a BTreeMap, - /// Only these URLs; empty means every confirmed URL. pub only: &'a [String], pub artifact_ids: &'a [String], pub thresholds: &'a VisualThresholds, } -/// Writes every URL's plan, the runner once, and returns what to run. pub(super) async fn write( plan: &Value, request: &AuditRequest<'_>, @@ -679,15 +678,11 @@ pub(super) async fn write( } = *request; let (sources, expired) = Sources::load(artifact_ids, store).await; let evidence = super::screen_plan::project_evidence(root).await?; - let routes = plan["routes"] - .as_array() - .into_iter() - .flatten() + let audit_routes = super::screen_plan::audit_routes(plan); + let routes = audit_routes.iter() .filter(|route| route["implementation"] == "page" && route["url"].is_string()) .collect::>(); let records = super::export_record::records(Path::new(root)); - // Every route as the concrete URLs it is audited at: a dynamic route at - // the URLs its params, the site's links or its Figma frame give. let mut concrete = Vec::<(usize, String, Option)>::new(); let mut not_audited = Vec::new(); for (index, route) in routes.iter().enumerate() { @@ -751,11 +746,14 @@ pub(super) async fn write( let route = routes[*index]; let url = url.as_str(); let app = route["app"].as_str().unwrap_or_default(); - let screen = if several_apps && !app.is_empty() { + let mut screen = if several_apps && !app.is_empty() { format!("{}-{}", slug(app), slug(url)) } else { slug(url) }; + if let Some(node) = route["state"]["nodeId"].as_str() { + screen.push_str(&format!("-state-{}", slug(node))); + } let frames = route["nodeIds"] .as_array() .into_iter() @@ -782,16 +780,20 @@ pub(super) async fn write( }; let base = base_urls.get(app).map_or(base_url, String::as_str); let mut built = url_plan(&target, base, &sources, thresholds)?; + gate_source_anchors(&mut built, &Path::new(root).join(app)); + if let Some(node) = route["state"]["nodeId"].as_str() { + built.notes.push(format!("State {} ({node}) on {url}: configure the runtime screen's steps to reach this state before running; no interaction is inferred from the frame name.", route["state"]["name"].as_str().unwrap_or_default())); + for check in &mut built.plan.screens[0].checks { + check.label = Some(format!("State {node}: {}", check.label.as_deref().unwrap_or(&check.kind))); + } + } for check in &mut built.plan.screens[0].checks { if check.kind == "links-resolve" { check.planned_targets = routes.iter().filter_map(|route| route["url"].as_str().map(str::to_owned)).collect(); check.existing_routes = evidence.routes.iter().map(|(route, _)| route.clone()).collect(); } } - let plan_path = Path::new(root) - .join(AUDIT_DIR) - .join(&screen) - .join("plan.json"); + let plan_path = Path::new(root).join(AUDIT_DIR).join(&screen).join("plan.json"); let report_dir = Path::new(root).join(AUDIT_DIR).join(&screen).join("report"); let counts = built.plan.screens[0].checks.iter().fold( BTreeMap::::new(), @@ -817,6 +819,7 @@ pub(super) async fn write( written.push(json!({ "url": url, "screen": screen, + "state": route["state"], "planPath": created["writtenTo"], "planId": created["planId"], "reportDirectory": report_dir.display().to_string(), @@ -826,6 +829,7 @@ pub(super) async fn write( "notes": built.notes, "dynamic": dynamic, "run": ["node", "run.mjs", "--plan", plan_path.display().to_string(), "--out", report_dir.display().to_string()], + "startServer": dev_server_command(Path::new(root), app, base), })); } let missing = written diff --git a/crates/devup-mcp/src/server/audit_plan/prerequisites.rs b/crates/devup-mcp/src/server/audit_plan/prerequisites.rs new file mode 100644 index 00000000..e4f18d33 --- /dev/null +++ b/crates/devup-mcp/src/server/audit_plan/prerequisites.rs @@ -0,0 +1,68 @@ +fn gate_source_anchors(built: &mut UrlPlan, app: &Path) { + fn scan(path: &Path, text: &mut String) { + let Ok(entries) = std::fs::read_dir(path) else { return }; + for entry in entries.flatten() { + let path = entry.path(); + if entry.file_type().is_ok_and(|kind| kind.is_symlink()) { continue; } + if path.is_dir() { scan(&path, text); } + else if matches!(path.extension().and_then(|ext| ext.to_str()), Some("tsx" | "jsx" | "ts" | "js")) + && let Ok(source) = std::fs::read_to_string(path) { + text.push_str(&source); + text.push('\n'); + } + } + } + let mut source = String::new(); + scan(&app.join("src"), &mut source); + if !app.join("src").exists() { + scan(&app.join("app"), &mut source); + scan(&app.join("components"), &mut source); + } + let mut anchors = BTreeSet::new(); + for tail in source.split("data-figma-node-id").skip(1) { + let (plural, tail) = tail.strip_prefix('s').map_or((false, tail), |tail| (true, tail)); + let Some(tail) = tail.trim_start().strip_prefix('=') else { continue }; + let tail = tail.trim_start(); + let Some(quote @ ('\'' | '"')) = tail.chars().next() else { continue }; + if let Some(value) = tail[1..].split(quote).next() { + for value in value.split_whitespace() { + let id = if plural { value.split_once(':').map_or(value, |(_, id)| id) } else { value }; + anchors.insert(id.to_owned()); + } + } + } + for check in &mut built.plan.screens[0].checks { + let anchored = [&check.subject, &check.container].into_iter().flatten() + .filter_map(|locator| locator.css.as_deref()).any(|css| css.contains("data-figma-node-id")); + let missing = [&check.subject, &check.container].into_iter().flatten().filter_map(|locator| locator.css.as_deref()).any(|css| { + css.split('"').enumerate().filter(|(index, _)| index % 2 == 1) + .all(|(_, id)| !anchors.contains(id) && !id.split_once(':').is_some_and(|(_, node)| anchors.contains(node))) + }); + let completeness_missing = check.completeness.as_ref().is_some_and(|complete| complete.sections.iter().chain(&complete.images).any(|id| !anchors.contains(id))); + if (anchored && missing) || completeness_missing { + check.unavailable_reason = Some("not-run: source anchors absent; data-figma-node-id is off by default. Export with figmaNodeIds:true and preserve anchors, or use explicit role/testId locators.".into()); + check.subject = None; + check.container = None; + } + } +} + +fn dev_server_command(root: &Path, app: &str, base_url: &str) -> Value { + let cwd = root.join(app); + let package = std::fs::read(cwd.join("package.json")).ok().and_then(|bytes| serde_json::from_slice::(&bytes).ok()); + let Some(script) = package.as_ref().and_then(|package| package["scripts"]["dev"].as_str()) else { + return json!({"available": false, "cwd": cwd, "reason": "The route app has no package.json dev script; no start command was guessed."}); + }; + let manager = package.as_ref().and_then(|package| package["packageManager"].as_str()) + .and_then(|value| value.split('@').next()).filter(|manager| matches!(*manager, "bun" | "npm" | "pnpm" | "yarn")) + .unwrap_or_else(|| { + if ["bun.lock", "bun.lockb"].iter().any(|name| cwd.join(name).exists() || root.join(name).exists()) { "bun" } + else if cwd.join("pnpm-lock.yaml").exists() || root.join("pnpm-lock.yaml").exists() { "pnpm" } + else if cwd.join("yarn.lock").exists() || root.join("yarn.lock").exists() { "yarn" } + else { "npm" } + }); + json!({"available": true, "command": [manager, "run", "dev"], "cwd": cwd, "script": script, + "windowsCommand": format!("cmd.exe /d /s /c \"{manager} run dev\""), + "readyUrl": base_url, "readyTimeoutMs": 120000, "reuseExisting": true, + "instructions": "Run command in cwd only when readyUrl is unreachable; wait for HTTP 200 before the runner. Stop only the process tree you started after the audit."}) +} diff --git a/crates/devup-mcp/src/server/audit_plan_tests.rs b/crates/devup-mcp/src/server/audit_plan_tests.rs index 28c83ff4..2fd09232 100644 --- a/crates/devup-mcp/src/server/audit_plan_tests.rs +++ b/crates/devup-mcp/src/server/audit_plan_tests.rs @@ -1,5 +1,39 @@ use super::*; +#[test] +fn dev_server_command_uses_the_route_app_and_its_package_manager() { + let project = Project::new("dev-command"); + project.write("bun.lock", ""); + project.write("apps/front/package.json", r#"{"scripts":{"dev":"vinext dev"}}"#); + let command = dev_server_command(Path::new(project.root()), "apps/front", "http://localhost:3000"); + assert_eq!(command["command"], json!(["bun", "run", "dev"])); + assert!(command["cwd"].as_str().unwrap().ends_with("apps\\front") || command["cwd"].as_str().unwrap().ends_with("apps/front")); + assert_eq!(command["script"], "vinext dev"); + assert!(command["windowsCommand"].as_str().unwrap().contains("cmd.exe /d /s /c")); +} + +#[test] +fn absent_source_anchors_leave_design_checks_not_run() { + let project = Project::new("missing-anchors"); + project.write("src/app/page.tsx", "export default function Page() { return
}"); + let mut built = url_plan(&home(), "http://localhost:3000", &sources(), &VisualThresholds::default()).unwrap(); + gate_source_anchors(&mut built, Path::new(project.root())); + let checks = &built.plan.screens[0].checks; + assert!(checks.iter().any(|check| check.kind == "bounds" && check.unavailable_reason.as_deref().is_some_and(|reason| reason.contains("anchors absent")))); + assert!(checks.iter().filter(|check| check.unavailable_reason.is_some()).all(|check| check.subject.is_none() && check.container.is_none())); + assert!(checks.iter().any(|check| check.kind == "page-health" && check.unavailable_reason.is_none())); +} + +#[test] +fn partial_source_anchors_do_not_enable_unmatched_nodes() { + let project = Project::new("partial-anchors"); + project.write("src/app/page.tsx", "
"); + let mut built = url_plan(&home(), "http://localhost:3000", &sources(), &VisualThresholds::default()).unwrap(); + gate_source_anchors(&mut built, Path::new(project.root())); + assert!(built.plan.screens[0].checks.iter().any(|check| check.kind == "bounds" && check.node_id.as_deref() == Some("10:12") && check.unavailable_reason.is_none())); + assert!(built.plan.screens[0].checks.iter().filter(|check| check.node_id.as_deref() == Some("10:131")).all(|check| check.unavailable_reason.is_some())); +} + fn payload(target: &str, nodes: Value, assets: Value, reference: bool) -> CollectedPayload { let mut value = json!({ "target": {"fileKey": "audit", "nodeId": target}, diff --git a/crates/devup-mcp/src/server/commands/opencode-devup.md b/crates/devup-mcp/src/server/commands/opencode-devup.md index 4c4be15d..149bebf8 100644 --- a/crates/devup-mcp/src/server/commands/opencode-devup.md +++ b/crates/devup-mcp/src/server/commands/opencode-devup.md @@ -100,13 +100,16 @@ items; never claim completion from split or command generation alone. For Figma work, continue with the following branch after project intake: -1. `devup_figma_auth` status. +1. `devup_figma_auth` status. If disconnected, out of view or on a mismatched + relay host, load `figma-bridge-setup`, perform its computer-use setup yourself, + then verify status and a small read. Don't ask the user to click routine menus. 2. `devup_skills` status, then install what is missing, and load the skills. 3. `devup_project_context` with scope theme and scope routes. 4. `devup_screen_plan` draft with projectRoot, the link, the notes and extraQuestions for anything you would otherwise guess later. 5. Ask every question now with the `question` tool: the flat `questions` list - in one call. Never in prose, never during implementation. + in one call. Never in prose. New user-owned decisions after confirm still + use the question tool; workers escalate to the supervisor. 6. `devup_screen_plan` confirm with every answer that applies. 7. Latest first, without asking: at the repository root run `bunx @dependency-check-updates/cli -d -u --rm` - it updates every @@ -116,7 +119,15 @@ For Figma work, continue with the following branch after project intake: to the new APIs, pin only when no fix exists, and record it with `devup_screen_plan` assume (dependencyUpdate). Check current docs before using any library API. -8. Implement URL by URL without asking anything: `devup_figma_export` with +8. Extract components before pages: the first implementation unit after confirm + exports used COMPONENT_SET/COMPONENT nodes with `outputs: ["componentTsx"]` + to components/common or components/layout. Record mainComponent id -> generated + file and artifact identity in `.devup/component-map.json`. Assemble pages by + screen-plan section (a direct child of the screen frame root), starting from + generated TSX and mapped imports. Never hand-write TSX from Figma nodes. + Audit through the component/section file mapping and explicit rendered targets, + not DOM Figma attributes. Report unsupported exports/overrides as limitations. + Implement URL by URL: `devup_figma_export` with projectRoot and frameIds, plus the plan's defaults - each element's role recipe (hover, pressed, focus ring, current page, expanded, disabled, loading; restrained), one shared transition, reduced motion, view @@ -137,14 +148,26 @@ For Figma work, continue with the following branch after project intake: workQueue order, re-run. A geometry mismatch is code-drift (restore the export) or converter-bug (repro filed, never retried). After maxFixAttempts (default 3) a finding is unresolved with its evidence. No runner: toolingUnavailable, carry on. -11. Never stop to wait: a decision mid-run goes to `devup_screen_plan` defer +11. Continue independent work: an ordinary choice mid-run goes to `devup_screen_plan` defer with the recommended option; take it with assume at the end (a destructive one stays unbuilt). 12. Done = zero fails at the drawn widths and no health or overflow fail at any width, or a filed converter bug, or listed as unresolved with evidence. Also every URL implemented, no data-figma-node-id in the - production build (strip plugin in vite.config, grep the output), `bun run build`, `bun run lint`, `bunx oxlint + production build (DevupUI strips attributes by default; `DEVUP_AUDIT=1` + keeps them). Do not change app build config for auditing or register a + strip plugin. Node attributes are off by default; `figmaNodeIds: true` + is opt-in only where supported by the export schema. `bun run build`, `bun run lint`, `bunx oxlint --deny-warnings`, `bun tsc --noEmit` in each changed app and `bun test` pass (`bun run test` adds cargo tarpaulin, which does not work on Windows), devup_ui_validate has no errors, site completeness filled. 13. Finish with the status finalReport and summary. + +User-owned decisions, before or after confirm, use the runtime question tool. +Show the evidence table first. Keep table approval and individual decisions as +separate entries in the same call, with headers up to 30 characters and two to +four options, recommended first and labelled "(Recommended)". Never ask for +numbers in chat. Record the chosen answer, decision id, affected model/endpoint/file +and rationale with existing defer/assume actions, not an invented ask action. +Update source models and re-confirm ERD changes before dependent implementation. +Without a question tool, report the limitation and leave that decision unresolved. diff --git a/crates/devup-mcp/src/server/compact.rs b/crates/devup-mcp/src/server/compact.rs index 70933a35..157cb401 100644 --- a/crates/devup-mcp/src/server/compact.rs +++ b/crates/devup-mcp/src/server/compact.rs @@ -415,6 +415,22 @@ pub fn pick(reply: &Value, options: &ResponseSelection) -> Result Result<(), DevupError> { + if !options.active() { return Ok(()); } + let picked = pick(reply, options)?; + if let Some(selections) = reply["selected"]["selections"].as_array_mut() { + for (selection, current) in selections.iter_mut().zip(picked["selections"].as_array().unwrap()) { + if !selection["path"].as_str().is_some_and(|path| path == "nodes" || path.starts_with("nodes[") || path.starts_with("nodes.")) + && current["state"] == "selected" { + *selection = current.clone(); + } + } + } else { + reply["selected"] = json!({"selections":picked["selections"]}); + } + Ok(()) +} + /// Standalone outlines keep the small data body inline and move unrelated /// full acquisition/projection evidence into the same bounded resource path. pub fn outline_response( diff --git a/crates/devup-mcp/src/server/delivery.rs b/crates/devup-mcp/src/server/delivery.rs index b83faacf..6f6835c3 100644 --- a/crates/devup-mcp/src/server/delivery.rs +++ b/crates/devup-mcp/src/server/delivery.rs @@ -203,17 +203,26 @@ pub fn choose_delivery_for_result( || outputs.iter().map(|o| o.bytes.len()).sum::() > MAX_INLINE_TOTAL_BYTES => { - Err(inline_size_error( + let mut error = inline_size_error( outputs, outputs.iter().map(|o| o.bytes.len()).sum(), Some(wire_bytes), - )) + ); + error.details["envelopeFields"] = envelope_field_sizes(result); + Err(error) } DeliveryMode::Inline => Ok(DeliveryDecision { inline: true }), DeliveryMode::Resource => Ok(DeliveryDecision { inline: false }), } } +pub(super) fn envelope_field_sizes(result: &Value) -> Value { + let mut sizes = result.as_object().into_iter().flatten() + .map(|(field, value)| (field, value.to_string().len())).collect::>(); + sizes.sort_by_key(|(_, bytes)| std::cmp::Reverse(*bytes)); + serde_json::json!(sizes.into_iter().take(8).map(|(field, bytes)| serde_json::json!({"field":field,"bytes":bytes})).collect::>()) +} + fn inline_size_error( outputs: &[ProjectedOutput], output_bytes: usize, @@ -275,6 +284,27 @@ pub(super) fn with_inline_recovery(mut error: DevupError, arguments: Value) -> D split.push(serde_json::json!({"tool":"devup_figma_export","arguments":args})); } } + if arguments["delivery"] == "resource" && error.details.get("envelopeFields").is_some() && split.is_empty() { + let mut narrowed = arguments.clone(); + if let Some(object) = narrowed.as_object_mut() { + object.remove("assetRequests"); + object.insert("responseFields".into(), serde_json::json!(["status", "quality"])); + } + error.details["recoveryState"] = serde_json::json!("available"); + error.details["recoveryReason"] = serde_json::json!( + "resource delivery was already requested; the response metadata itself (see envelopeFields) exceeds the inline limit, so repeating this call fails again." + ); + error.details["nextAction"] = + serde_json::json!({"tool":"devup_figma_export","arguments":narrowed}); + error.details["nextActionReason"] = serde_json::json!( + "Same artifact with responseFields (and outputPaths to write files). Details are then read from the linked compact-details resource. Alternatively export fewer frameIds per call." + ); + error.details["splitRequests"] = serde_json::json!([]); + error.details["splitReason"] = serde_json::json!( + "Split by frameIds (one section frame per call) or write outputs with outputPaths and select only the fields you need with responseFields." + ); + return error; + } error.details["recoveryState"] = serde_json::json!("available"); error.details["recoveryReason"] = serde_json::json!( "The acquisition is retained; resource delivery avoids the inline limit without calling Figma again. Resource storage limits still apply." @@ -356,6 +386,46 @@ mod r12_tests { use super::*; use serde_json::json; + #[test] + fn feedback_28_single_output_error_identifies_metadata_and_recovery() { + let result = json!({"tsx":"","projectThemeValidation":{"details":"x".repeat(800_000)}}); + let outputs = vec![ProjectedOutput::text("tsx", "text/typescript", b"".to_vec())]; + let error = choose_delivery_for_result(DeliveryMode::Inline, &result, &outputs).unwrap_err(); + assert_eq!(error.details["outputBytes"], 6); + assert_eq!(error.details["envelopeFields"][0]["field"], "projectThemeValidation"); + assert!(error.details["envelopeFields"][0]["bytes"].as_u64().unwrap() >= 800_000); + let args = json!({"artifactId":"retained","outputs":["tsx"],"delivery":"resource"}); + let recovered = with_inline_recovery(error, args.clone()); + assert_ne!(recovered.details["nextAction"]["arguments"], args); + assert_eq!(recovered.details["splitRequests"], json!([])); + let reason = recovered.details["splitReason"].as_str().unwrap(); + assert!(reason.contains("outputPaths") && reason.contains("responseFields") && reason.contains("frameIds")); + } + + #[test] + fn oversized_envelope_under_resource_delivery_never_repeats_the_failing_call() { + let mut error = choose_delivery( + DeliveryMode::Inline, + &[ProjectedOutput::text( + "tsx", + "text/typescript", + vec![b'x'; MAX_INLINE_TOTAL_BYTES + 1], + )], + ) + .unwrap_err(); + error.details["envelopeFields"] = json!([{"field":"projectionIssues","bytes":1_200_000}]); + let args = json!({"artifactId":"retained","outputs":["tsx"],"delivery":"resource", + "assetRequests":[{"assetId":"a","format":"svg","scale":1,"outputPath":"p.svg"}]}); + let recovered = with_inline_recovery(error, args.clone()); + assert_ne!(recovered.details["nextAction"]["arguments"], args); + assert_eq!( + recovered.details["nextAction"]["arguments"]["responseFields"], + json!(["status", "quality"]) + ); + assert_eq!(recovered.details["splitRequests"], json!([])); + assert!(recovered.details["envelopeFields"].is_array()); + } + #[test] fn r12_asset_mapping_recovery_keeps_coupled_outputs_together() { let output = ProjectedOutput::text( diff --git a/crates/devup-mcp/src/server/export_skill_gap_tests.rs b/crates/devup-mcp/src/server/export_skill_gap_tests.rs index 352afc15..ce992442 100644 --- a/crates/devup-mcp/src/server/export_skill_gap_tests.rs +++ b/crates/devup-mcp/src/server/export_skill_gap_tests.rs @@ -9,6 +9,33 @@ //! `std::fs::` in it at all. use super::*; + +#[test] +fn export_groups_prop_sorting_without_a_project_root() { + let project = scratch("lint-fix"); + let checked = with_project_checks( + json!({"tsx": ""}), + None, + &skills::Lookup::project_only(project.clone(), skills::Runtime::Codex), + ); + assert_eq!(checked["formatting"]["nextAction"]["fixable"], 1); + assert_eq!(checked["nextAction"]["command"], "bun run lint:fix"); + std::fs::remove_dir_all(project).unwrap(); +} + +#[test] +fn export_preserves_an_existing_tool_action_when_grouping_sorting() { + let project = scratch("lint-fix-action"); + let action = json!({"tool": "devup_figma_export", "arguments": {"jobId": "pending"}}); + let checked = with_project_checks( + json!({"frames": [{"nodeId": "1:2", "tsx": ""}], "nextAction": action}), + None, + &skills::Lookup::project_only(project.clone(), skills::Runtime::Codex), + ); + assert_eq!(checked["formatting"]["nextAction"]["fixable"], 1); + assert_eq!(checked["nextAction"], action); + std::fs::remove_dir_all(project).unwrap(); +} fn scratch(label: &str) -> std::path::PathBuf { let path = std::env::temp_dir().join(format!( "devup-export-gap-{label}-{}-{}", @@ -229,3 +256,33 @@ fn the_export_tool_description_still_says_to_call_devup_skills() { ); } } + +#[test] +fn r38_tsx_with_tokens_missing_from_the_project_theme_points_at_a_missing_only_sync() { + let project = scratch("theme-sync"); + std::fs::write( + project.join("devup.json"), + r##"{"theme":{"colors":{"default":{"primary":"#000"}}}}"##, + ) + .unwrap(); + let checked = with_project_checks( + json!({"status": "complete", "url": "https://www.figma.com/design/k/n?node-id=1-2", "tsx": ""}), + project.to_str(), + &skills::Lookup::project_only(project.clone(), skills::Runtime::Codex), + ); + let action = &checked["nextAction"]; + assert_eq!(action["tool"], "devup_figma_export"); + assert_eq!(action["arguments"]["outputs"], json!(["devupJson"])); + assert_eq!(action["arguments"]["devupJsonMode"], "missing-only"); + assert_eq!(action["arguments"]["projectRoot"], project.to_str().unwrap()); + assert!(action["how"].as_str().unwrap().contains("before using the tsx")); + assert_eq!(checked["projectThemeValidation"]["nextAction"], *action); + + let clean = with_project_checks( + json!({"status": "complete", "tsx": ""}), + project.to_str(), + &skills::Lookup::project_only(project.clone(), skills::Runtime::Codex), + ); + assert!(clean.get("nextAction").is_none()); + let _ = std::fs::remove_dir_all(&project); +} diff --git a/crates/devup-mcp/src/server/feedback_interactions_tests.rs b/crates/devup-mcp/src/server/feedback_interactions_tests.rs index 0540eb15..333704ed 100644 --- a/crates/devup-mcp/src/server/feedback_interactions_tests.rs +++ b/crates/devup-mcp/src/server/feedback_interactions_tests.rs @@ -174,6 +174,22 @@ fn feedback_shared_widgets_details_and_grouped_questions_require_review() { ); } +#[test] +fn feedback44_export_wiring_guidance_keeps_states_on_the_anchor() { + let mut result = json!({"tsx":"","deliverable":{"isFinal":true}}); + interactions::attach(&mut result, &design()); + let issue = result["projectionIssues"].as_array().unwrap().iter() + .find(|issue| issue["code"] == "DEVUP_CODEGEN_INTERACTION_UNMAPPED").unwrap(); + let guidance = issue["details"]["nextAction"].as_str().unwrap(); + assert!(guidance.contains("as={Link} props={{ href, 'aria-current'")); + for state in ["_hover={hoverStyles}", "_focusVisible={focusStyles}", "_active={activeStyles}"] { + assert!(guidance.contains(state), "{guidance}"); + } + assert!(guidance.contains("not on a child wrapped in Link")); + assert_eq!(result["interactionCoverage"]["wiredCount"], 0); + assert_eq!(result["deliverable"]["isFinal"], false); +} + #[tokio::test] async fn feedback_context_routes_reuse_env_names_and_no_secret_values() { let p = Project::new(); @@ -295,6 +311,31 @@ fn feedback_validation_catches_missing_routes_unmapped_actions_and_active_state( assert_eq!(report["coverage"]["runtimeVerified"], false); } +#[test] +fn a_primitive_rendered_as_link_with_props_href_is_wired() { + let inventory = json!({"found":true,"routes":[{"route":"/company","appliesTo":"."}]}); + let source = r#"import Link from 'next/link'; export function Header(){return <>회사소개없음전체 보기}"#; + let report = navigation::report(source, &inventory, None); + let findings = report["findings"].as_array().unwrap(); + let unmapped = findings + .iter() + .filter(|f| f["rule"] == "interaction-unmapped") + .count(); + assert_eq!(unmapped, 1, "{findings:?}"); + assert!(findings.iter().any(|f| f["rule"] == "missing-static-route" && f["href"] == "/missing")); + assert_eq!(report["sourceHrefs"]["/company"], 1); + let dynamic = r#"import Link from 'next/link'; const Menu=({items})=> <>{items.map((item)=> {item.label})}"#; + let report = navigation::report(dynamic, &inventory, None); + assert!( + !report["findings"] + .as_array() + .unwrap() + .iter() + .any(|f| f["rule"] == "interaction-unmapped"), + "{report}" + ); +} + #[test] fn feedback_fixed_navigation_underline_is_an_unverified_info_candidate() { let source = r#"import Link from 'next/link'; const Header=()=> "#; diff --git a/crates/devup-mcp/src/server/handlers/devup_figma_export.rs b/crates/devup-mcp/src/server/handlers/devup_figma_export.rs index 4ccb4686..3848fad4 100644 --- a/crates/devup-mcp/src/server/handlers/devup_figma_export.rs +++ b/crates/devup-mcp/src/server/handlers/devup_figma_export.rs @@ -11,6 +11,15 @@ impl DevupServer { Parameters(workflow): Parameters, ) -> Result { let mut input = workflow.input; + let manifest_added = !input.asset_requests.is_empty() + && !input + .outputs + .iter() + .any(|o| matches!(o.as_str(), "assetManifest" | "pageScaffold")) + ; + if manifest_added { + input.outputs.push("assetManifest".into()); + } if input.preset.as_deref() == Some("web-ready-images") { for output in ["assetManifest", "imageAudit"] { if !input.outputs.iter().any(|o| o == output) { @@ -228,19 +237,13 @@ impl DevupServer { input.previous_design_fingerprints.as_deref(), ) .map_err(to_mcp_error)?; - if !input.asset_requests.is_empty() - && !input - .outputs - .iter() - .any(|output| matches!(output.as_str(), "assetManifest" | "pageScaffold")) - { - return Err(to_mcp_error(DevupError::new( - ErrorCode::DevupSnapshotUnsupported, - "Using assetRequests requires assetManifest in outputs.", - false, - ))); - } + let reference_png_requested = input.outputs.iter().any(|output| output == "referencePng"); + if reference_png_requested && input.frame_ids.len() == 1 && !input.all_screens && input.artifact_id.is_none() { + let mut target = parse_link(input.url.as_deref()).map_err(to_mcp_error)?; + target.node_id = input.frame_ids.pop(); + input.url = Some(target.link(target.node_id.as_deref())); + } if reference_png_requested && (!input.frame_ids.is_empty() || input.all_screens) { let target = if let Some(url) = &input.url { FigmaTarget::parse(url).ok() @@ -351,6 +354,9 @@ impl DevupServer { // A frame the index does not describe leaves the question // open, and an open question is collected, not refused. if selected.len() == input.frame_ids.len() + && !crate::server::projection::responsive_groups::confirmed( + input.project_root.as_deref(), &input.frame_ids, + ).map_err(to_mcp_error)? && !devup_mcp_devup_ui::codegen::responsive::breakpoint_family_is_possible( &selected, ) @@ -402,6 +408,7 @@ impl DevupServer { theme_options: projection::theme_export::ThemeExportOptions { mode: input.devup_json_mode, project_root: input.project_root.clone(), + figma_node_ids: input.figma_node_ids, }, strict: input.strict, output_paths: input.output_paths, @@ -451,6 +458,7 @@ impl DevupServer { theme_options: projection::theme_export::ThemeExportOptions { mode: input.devup_json_mode, project_root: input.project_root.clone(), + figma_node_ids: input.figma_node_ids, }, strict: input.strict, output_paths: input.output_paths, @@ -475,7 +483,7 @@ impl DevupServer { ) .await .map_err(to_mcp_error)?; - return Ok(tool_result(with_project_checks( + let mut result = with_project_checks( result, input.project_root.as_deref(), &skills::Lookup::new( @@ -483,7 +491,14 @@ impl DevupServer { self.output_policy.primary_root(), self.client_name(), ), - ))); + ); + if manifest_added { + let warning = json!({"code":"DEVUP_ASSET_MANIFEST_ADDED","message":"assetManifest was automatically added to outputs for assetRequests."}); + if let Some(warnings) = result["warnings"].as_array_mut() { warnings.push(warning); } + else { result["warnings"] = json!([warning]); } + } + compact::refresh_reply_selection(&mut result, &input.response_selection).map_err(to_mcp_error)?; + return Ok(tool_result(result)); } let collection_scope = parse_collection_scope(&input.scope).map_err(to_mcp_error)?; @@ -558,6 +573,7 @@ impl DevupServer { theme_options: projection::theme_export::ThemeExportOptions { mode: input.devup_json_mode, project_root: input.project_root.clone(), + figma_node_ids: input.figma_node_ids, }, strict: input.strict, output_paths: input.output_paths, @@ -597,7 +613,7 @@ impl DevupServer { ok => ok, } .map_err(to_mcp_error)?; - Ok(tool_result(with_project_checks( + let mut result = with_project_checks( result, input.project_root.as_deref(), &skills::Lookup::new( @@ -605,6 +621,13 @@ impl DevupServer { self.output_policy.primary_root(), self.client_name(), ), - ))) + ); + if manifest_added { + let warning = json!({"code":"DEVUP_ASSET_MANIFEST_ADDED","message":"assetManifest was automatically added to outputs for assetRequests."}); + if let Some(warnings) = result["warnings"].as_array_mut() { warnings.push(warning); } + else { result["warnings"] = json!([warning]); } + } + compact::refresh_reply_selection(&mut result, &input.response_selection).map_err(to_mcp_error)?; + Ok(tool_result(result)) } } diff --git a/crates/devup-mcp/src/server/handlers/devup_figma_search.rs b/crates/devup-mcp/src/server/handlers/devup_figma_search.rs index 6bff8160..012336e9 100644 --- a/crates/devup-mcp/src/server/handlers/devup_figma_search.rs +++ b/crates/devup-mcp/src/server/handlers/devup_figma_search.rs @@ -16,7 +16,7 @@ impl DevupServer { // an out-of-range limit is owed. if !(1..=MATCH_CEILING).contains(&input.limit) { return Err(to_mcp_error(DevupError::new( - ErrorCode::DevupFigmaResponseTooLarge, + ErrorCode::DevupInvalidInput, "The search limit must be between 1 and 100 inclusive.", false, ))); @@ -42,11 +42,7 @@ impl DevupServer { } else { CollectionScope::File }; - let projected_limit = if scope.node_id.is_some() { - MATCH_CEILING - } else { - input.limit - }; + let projected_limit = MATCH_CEILING; let mut request = CollectionRequest::new(target, collection_scope); request.search = Some(SearchReadOptions { query: input.query.clone(), diff --git a/crates/devup-mcp/src/server/handlers/devup_screen_plan.rs b/crates/devup-mcp/src/server/handlers/devup_screen_plan.rs index 99106c12..1abb637a 100644 --- a/crates/devup-mcp/src/server/handlers/devup_screen_plan.rs +++ b/crates/devup-mcp/src/server/handlers/devup_screen_plan.rs @@ -10,7 +10,7 @@ impl DevupServer { &self, Parameters(input): Parameters, ) -> Result { - let result = match input.action.as_str() { + let mut result = match input.action.as_str() { "draft" => { let (screens, source) = self.plan_screens(&input).await.map_err(to_mcp_error)?; let mut assets = input.assets.clone(); @@ -40,6 +40,43 @@ impl DevupServer { )), } .map_err(to_mcp_error)?; + if input.action == "auditPlan" + && self.services.upstream.bridge_path_snapshot().await + .is_some_and(|bridge| bridge.attached_files.len() == 1) + { + prefer_bridge_reference_calls(&mut result); + } Ok(tool_result(result)) } } + +fn prefer_bridge_reference_calls(value: &mut Value) { + if value["tool"] == "devup_figma_export" + && let Some(url) = value["arguments"]["url"].as_str() + && let Some(node_id) = url.strip_prefix("')) + { + let node_id = node_id.to_owned(); + value["arguments"].as_object_mut().unwrap().remove("url"); + value["arguments"]["frameIds"] = json!([node_id]); + } + match value { + Value::Object(object) => object.values_mut().for_each(prefer_bridge_reference_calls), + Value::Array(array) => array.iter_mut().for_each(prefer_bridge_reference_calls), + _ => {} + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn feedback57_reference_recovery_prefers_explicit_bridge_frames() { + let mut result = json!({"missingReferences":[{"call":{"tool":"devup_figma_export", + "arguments":{"url":"","outputs":["referencePng"]}}}]}); + prefer_bridge_reference_calls(&mut result); + let arguments = &result["missingReferences"][0]["call"]["arguments"]; + assert_eq!(arguments["frameIds"], json!(["45:2066"])); + assert!(arguments.get("url").is_none()); + } +} diff --git a/crates/devup-mcp/src/server/handlers/devup_ui_validate.rs b/crates/devup-mcp/src/server/handlers/devup_ui_validate.rs index e962bb9d..b796a52a 100644 --- a/crates/devup-mcp/src/server/handlers/devup_ui_validate.rs +++ b/crates/devup-mcp/src/server/handlers/devup_ui_validate.rs @@ -200,6 +200,9 @@ impl DevupServer { .clone(), ); } + if let Some(action) = &report.next_action { + result["nextAction"] = action.clone(); + } // A violation is a located, proven gap in devup-ui knowledge, which // makes this the one moment where naming the skill is a measurement // rather than a nudge. Raised only when the skill is actually absent: diff --git a/crates/devup-mcp/src/server/mod_parts/acquisition.rs b/crates/devup-mcp/src/server/mod_parts/acquisition.rs index 5601c2c8..7c86630a 100644 --- a/crates/devup-mcp/src/server/mod_parts/acquisition.rs +++ b/crates/devup-mcp/src/server/mod_parts/acquisition.rs @@ -485,6 +485,18 @@ impl DevupServer { refresh: input.refresh, }) .await?; + let mut explored = explored; + if input.project_root.is_some() { + let target = self.bind_to_bridge(parse_link(input.url.as_deref())?, Unnamed::Selection, + &json!({"tool":"devup_screen_plan","arguments":{"action":"draft"}})).await?; + let mut request = CollectionRequest::new(target, CollectionScope::File); + request.variables_only = true; + request.resource_scope = ResourceScope::File; + let parts = self.run_direct(request, &PendingOperation::Collect, None).await?; + if let Some(variables) = parts.variables { + explored["figmaTheme"] = screen_plan::planning_theme(&variables)?; + } + } let candidates = explored["candidates"] .as_array() .cloned() @@ -517,6 +529,8 @@ impl DevupServer { "nodeId": explored["anchor"]["nodeId"], "anchorName": explored["anchor"]["name"], "anchorBreadcrumb": explored["anchor"]["breadcrumb"], + "nodePage": explored["nodePage"], + "figmaTheme": explored["figmaTheme"], "targetKind": explored["targetKind"], "fileKey": explored["source"]["fileKey"], "truncation": explored["truncation"], @@ -897,6 +911,11 @@ fn apply_search_scope( return response; }; let scanned = matches.len(); + let upstream_truncated = snapshot.nodes.values().any(|node| { + node.fields.get("searchCandidatesTruncated") == Some(&json!(true)) + }); + let candidates_truncated = upstream_truncated || scanned > scope.limit || scanned == MATCH_CEILING; + response["hasMore"] = json!(candidates_truncated); let node_id = match scope.node_id.as_deref() { None => { let mut kept = matches; @@ -908,6 +927,7 @@ fn apply_search_scope( "nodeId": Value::Null, "collectionScope": collection_scope, "scannedMatches": scanned, + "candidatesTruncated": candidates_truncated, "note": "The URL carried no node-id, so the whole file was searched. \ Put the node you care about in the URL to search only inside it.", }); @@ -931,7 +951,7 @@ fn apply_search_scope( "matchedInScope": found, "returned": inside.len(), "excludedOutOfScope": outside.len(), - "candidatesTruncated": found > inside.len(), + "candidatesTruncated": candidates_truncated || found > inside.len(), "note": "The URL carried a node-id, so only matches inside that node are \ returned. Remove the node-id to search elsewhere in the file.", }); @@ -954,4 +974,4 @@ fn apply_search_scope( response["matches"] = Value::Array(inside); response["scope"] = scope_report; response -} \ No newline at end of file +} diff --git a/crates/devup-mcp/src/server/mod_parts/exploration_and_responses.rs b/crates/devup-mcp/src/server/mod_parts/exploration_and_responses.rs index 277798be..cf608bf1 100644 --- a/crates/devup-mcp/src/server/mod_parts/exploration_and_responses.rs +++ b/crates/devup-mcp/src/server/mod_parts/exploration_and_responses.rs @@ -418,11 +418,6 @@ fn with_project_checks( .map(|tsx| (key.to_owned(), tsx.to_owned())) }) .collect(); - // A Section export answers under `frames`, one entry per selected frame, - // and nothing at the top level. Reading only the top level checked the - // single-node `url` case and silently skipped every `frameIds` call — - // which is every Section workflow, and so every screen of the Braillify - // Studio handover this exists for. if let Some(frames) = result.get("frames").and_then(Value::as_array) { for frame in frames { let node = frame @@ -444,9 +439,15 @@ fn with_project_checks( if produced_code { result = with_skill_gap(result, lookup); } + validation_guidance::attach_export_formatting(&mut result, &generated); let Some(project_root) = project_root else { return result; }; + match screen_plan::export_progress(project_root) { + Ok(progress) if !progress.is_null() => result["planProgress"] = progress, + Err(error) => result["planProgress"] = json!({"state": "unavailable", "reason": error.message}), + _ => {} + } if generated.is_empty() { // Resource delivery hands the code back as a link, so there is no // source here to check. Saying so is the point: an absent verdict @@ -516,8 +517,31 @@ fn with_project_checks( "Every token the generated TSX references exists in this project's devup.json." }, }); + if any_unknown { + let action = theme_sync_action(&result, project_root); + result["projectThemeValidation"]["nextAction"] = action.clone(); + if result.get("nextAction").is_none_or(Value::is_null) { + result["nextAction"] = action; + } + } result } +fn theme_sync_action(result: &Value, project_root: &str) -> Value { + let mut arguments = json!({ + "outputs": ["devupJson"], + "devupJsonMode": "missing-only", + "projectRoot": project_root, + "scope": "file", + }); + if let Some(url) = result.get("url").filter(|url| url.is_string()) { + arguments["url"] = url.clone(); + } + json!({ + "tool": "devup_figma_export", + "arguments": arguments, + "how": "The generated code references tokens missing from this project's devup.json. Sync devup.json with this call (additions only; existing tokens are kept) before using the tsx.", + }) +} fn section_candidate_as_explore(candidate: &SectionCandidate) -> ExploreCandidate { ExploreCandidate { diff --git a/crates/devup-mcp/src/server/mod_parts/state_and_services.rs b/crates/devup-mcp/src/server/mod_parts/state_and_services.rs index 4675934a..4362bbc2 100644 --- a/crates/devup-mcp/src/server/mod_parts/state_and_services.rs +++ b/crates/devup-mcp/src/server/mod_parts/state_and_services.rs @@ -2,6 +2,8 @@ pub mod artifacts; #[path = "../asset_guard.rs"] mod asset_guard; +#[path = "../asset_job_progress.rs"] +mod asset_job_progress; #[path = "../asset_jobs.rs"] mod asset_jobs; #[path = "../audit_plan.rs"] diff --git a/crates/devup-mcp/src/server/navigation.rs b/crates/devup-mcp/src/server/navigation.rs index 4e56bd76..fca5e819 100644 --- a/crates/devup-mcp/src/server/navigation.rs +++ b/crates/devup-mcp/src/server/navigation.rs @@ -131,7 +131,46 @@ impl<'a> Visit<'a> for Collector<'_> { } }) .collect(); - let href = attrs.get("href").and_then(|a| literal(a)); + let rendered_as = attrs.get("as").and_then(|a| match &a.value { + Some(JSXAttributeValue::StringLiteral(s)) => Some(s.value.to_string()), + Some(JSXAttributeValue::ExpressionContainer(c)) => match &c.expression { + JSXExpression::StringLiteral(s) => Some(s.value.to_string()), + JSXExpression::Identifier(i) => Some(i.name.to_string()), + _ => None, + }, + _ => None, + }); + let name = rendered_as.as_deref().unwrap_or(name); + let props_href = attrs.get("props").is_some_and(|a| match &a.value { + Some(JSXAttributeValue::ExpressionContainer(c)) => match &c.expression { + JSXExpression::ObjectExpression(o) => o.properties.iter().any(|p| { + matches!(p, ObjectPropertyKind::ObjectProperty(p) + if p.key.static_name().as_deref() == Some("href")) + }), + _ => false, + }, + _ => false, + }); + let has_href = attrs.contains_key("href") || props_href; + let href = attrs.get("href").and_then(|a| literal(a)).or_else(|| { + attrs.get("props").and_then(|a| match &a.value { + Some(JSXAttributeValue::ExpressionContainer(c)) => match &c.expression { + JSXExpression::ObjectExpression(o) => o.properties.iter().find_map(|p| match p { + ObjectPropertyKind::ObjectProperty(p) + if p.key.static_name().as_deref() == Some("href") => + { + match &p.value { + Expression::StringLiteral(s) => Some(s.value.to_string()), + _ => None, + } + } + _ => None, + }), + _ => None, + }, + _ => None, + }) + }); let is_link = name == "a" || self.link_names.contains(name); let native = matches!(name, "button" | "input" | "select" | "textarea") && !attrs @@ -218,7 +257,7 @@ impl<'a> Visit<'a> for Collector<'_> { && fixed_visual_marker(&attrs); if candidate || active || visual_marker { self.elements.push(json!({"element":name,"name":accessible_name.trim(),"line":line,"offset":element.span.start, - "candidate":candidate,"wired":wired || self.linked_ancestors>0,"href":href,"dynamicHref":attrs.contains_key("href") && href.is_none(), + "candidate":candidate,"wired":wired || self.linked_ancestors>0,"href":href,"dynamicHref":has_href && href.is_none(), "nodeId":attrs.get("data-figma-node-id").and_then(|a|literal(a)), "semanticControl":is_link || native,"nativeToggleOnly":native_toggle && !wired,"disabled":disabled, "staticActive":active,"nonSemanticClick":handler && matches!(name,"div"|"span"|"Box"|"Flex"|"Text"|"Center"|"Grid"), diff --git a/crates/devup-mcp/src/server/project_plan/erd.rs b/crates/devup-mcp/src/server/project_plan/erd.rs index 4dbe7f5d..7273e51a 100644 --- a/crates/devup-mcp/src/server/project_plan/erd.rs +++ b/crates/devup-mcp/src/server/project_plan/erd.rs @@ -6,6 +6,38 @@ pub(super) fn api(plan: &Value) -> bool { .to_ascii_lowercase() .contains("api") } +const COMPLEX_KINDS: [&str; 5] = ["varchar", "char", "numeric", "enum", "custom"]; +const SIMPLE_TYPES: [&str; 19] = [ + "small_int", + "integer", + "big_int", + "real", + "double_precision", + "text", + "boolean", + "date", + "time", + "timestamp", + "timestamptz", + "interval", + "bytea", + "uuid", + "json", + "inet", + "cidr", + "macaddr", + "xml", +]; +fn unsupported_type(t: &Value) -> Option { + match t { + Value::String(s) => (!SIMPLE_TYPES.contains(&s.as_str())).then(|| s.clone()), + Value::Object(_) => { + let kind = text(&t["kind"]); + (!COMPLEX_KINDS.contains(&kind)).then(|| kind.to_owned()) + } + _ => None, + } +} fn ident(s: &str) -> bool { !s.is_empty() && s.as_bytes()[0].is_ascii_lowercase() @@ -149,9 +181,9 @@ pub(super) fn draft(input: &ProjectPlanInput, plan: &mut Value) -> Result<(), De )); } plan["modelsDir"] = json!(dir); - if plan["modelsWorkingDirectory"].is_null() { - plan["modelsWorkingDirectory"] = json!("."); - } + plan["modelsWorkingDirectory"] = json!(Path::new(&dir).parent() + .filter(|parent| !parent.as_os_str().is_empty()) + .map_or_else(|| ".".to_owned(), |parent| parent.to_string_lossy().replace('\\', "/"))); let mut entities = if !input.entities.is_empty() { input.entities.clone() } else { @@ -234,9 +266,32 @@ pub(super) fn draft(input: &ProjectPlanInput, plan: &mut Value) -> Result<(), De "vespertide revision -m \"confirmed project plan\"", "vespertide export --orm seaorm" ]); + plan["backendNotes"] = json!([ + "Stop if vespertide diff reports a table or column deletion; preserve existing models and review the destructive change before generating SQL or a revision.", + "Before cargo check, make sure the API Cargo.toml depends on serde (derive) and serde_json; exported entities use them.", + "Add `mod models;` to the API main.rs; export does not wire the generated src/models.", + "Right after export, cargo clippy -- -D warnings reports never-constructed ModelEx structs until routes use them; that is expected before the route units." + ]); Ok(()) } pub(super) fn validate(entities: &[Value]) -> Result<(), DevupError> { + let mut violations = Vec::new(); + for (entity_index, entity) in entities.iter().enumerate() { + for (column_index, column) in array(&entity["columns"]).iter().enumerate() { + if unsupported_type(&column["type"]).is_some() { + violations.push(json!({"path":format!("/entities/{entity_index}/columns/{column_index}/type"), + "column":format!("{}.{}",text(&entity["name"]),text(&column["name"])), + "got":column["type"],"expected":{"simple":SIMPLE_TYPES,"complexKinds":COMPLEX_KINDS}, + "fix":if column["type"] == "jsonb" {"Use json"} else {"Use a supported Vespertide type"}})); + } + } + } + if !violations.is_empty() { + let mut error = invalid(format!("Unsupported Vespertide column types: {}; jsonb must use json", + violations.iter().map(|violation| text(&violation["column"])).collect::>().join(", "))); + error.details = json!({"violations":violations}); + return Err(error); + } let mut names = std::collections::BTreeSet::new(); for e in entities { let name = text(&e["name"]); @@ -254,6 +309,14 @@ pub(super) fn validate(entities: &[Value]) -> Result<(), DevupError> { "Columns need unique snake_case names, type and nullable", )); } + if let Some(bad) = unsupported_type(&c["type"]) { + let hint = if bad == "jsonb" { "; use json" } else { "" }; + return Err(invalid(format!( + "Column {}.{} has type {bad}, which vespertide cannot parse{hint}", + text(&e["name"]), + text(&c["name"]) + ))); + } if !c["foreign_key"].is_null() && c["index"].is_null() { return Err(invalid("Foreign keys require inline indexes")); } @@ -298,6 +361,17 @@ pub(super) fn validate(entities: &[Value]) -> Result<(), DevupError> { } Ok(()) } +pub(super) fn disk_report(plan: &Value, root: &str) -> Value { + let mut existing = Vec::new(); + if let Err(error) = scan_models(&Path::new(root).join(text(&plan["modelsDir"])), &mut existing) { + return json!({"error":error.message}); + } + let violations = validate(&existing).err().map(|error| error.details).unwrap_or(Value::Null); + let drift = existing.iter().filter(|model| { + !array(&plan["entities"]).iter().any(|entity| entity["name"] == model["name"] && entity["columns"] == model["columns"]) + }).map(|model| model["name"].clone()).collect::>(); + json!({"typeValidation":violations,"entityDrift":drift}) +} pub(super) fn write_models( tx: &mut OutputTransaction, policy: &OutputPolicy, @@ -312,6 +386,26 @@ pub(super) fn write_models( return Err(invalid("API plan requires a complete ERD")); } validate(entities)?; + let mut existing = Vec::new(); + scan_models(&Path::new(root).join(text(&plan["modelsDir"])), &mut existing)?; + let mut removed_columns = Vec::new(); + for model in &existing { + if let Some(entity) = entities.iter().find(|entity| entity["name"] == model["name"]) { + for column in array(&model["columns"]) { + if !array(&entity["columns"]).iter().any(|candidate| candidate["name"] == column["name"]) { + removed_columns.push(json!({"table":model["name"],"column":column["name"]})); + } + } + } + } + if !removed_columns.is_empty() { + let mut error = invalid("Confirm would remove existing model columns; redraft with the existing columns preserved before confirming"); + error.details = json!({"removedColumns":removed_columns, + "decision":{"id":"model-column-removal","destructive":true,"state":"pending", + "reason":"Existing source-model columns are absent from the proposed ERD", + "recommended":"Preserve existing columns and redraft"}}); + return Err(error); + } for e in entities { let file = format!("{}/{}.json", text(&plan["modelsDir"]), text(&e["name"])); let bytes = serde_json::to_vec_pretty(e).map_err(|e| invalid(e.to_string()))?; diff --git a/crates/devup-mcp/src/server/project_plan/mod.rs b/crates/devup-mcp/src/server/project_plan/mod.rs index 3300f3e4..57b41408 100644 --- a/crates/devup-mcp/src/server/project_plan/mod.rs +++ b/crates/devup-mcp/src/server/project_plan/mod.rs @@ -2,9 +2,11 @@ //! local evidence is collected before generating any unresolved questions. mod erd; mod rounds; +mod recovery; #[cfg(test)] mod tests; mod units; +mod wiring; use super::{ output::{OutputPolicy, OutputTransaction}, @@ -28,6 +30,10 @@ pub struct ProjectPlanInput { pub action: String, pub project_root: String, pub plan_id: Option, + #[serde(default)] + pub restart: bool, + #[serde(default)] + pub scope_exclusions: Vec, /// Facts read from Jira issues/epic children, Figma exploration, spec documents, /// and devup_project_context all scopes. Every fact includes its source. #[serde(default)] @@ -57,6 +63,14 @@ pub struct ProjectPlanInput { pub decisions: Vec, #[serde(default)] pub unit_updates: Vec, + /// Records the operationId each feature's pages wire to ("Wire to the API + /// now"); status checks every id against openapi.json. + #[serde(default)] + pub api_wiring: Vec, + /// summary (default) answers with state, open questions, next action, ERD and + /// unit DAG; full also returns the whole plan. + #[schemars(extend("enum" = ["summary", "full"]))] + pub detail: Option, } #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "camelCase", deny_unknown_fields)] @@ -76,6 +90,9 @@ pub struct Feature { pub screens: Vec, #[serde(default)] pub acceptance: Vec, + /// Tables this feature reads or writes; shared tables group domain workers. + #[serde(default)] + pub entities: Vec, } #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "camelCase", deny_unknown_fields)] @@ -113,15 +130,36 @@ pub struct Decision { pub recommended: String, #[serde(default)] pub destructive: bool, + pub state: Option, + pub kind: Option, } -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "camelCase", deny_unknown_fields)] #[schemars(extend("additionalProperties" = json!({"not": {}})))] pub struct UnitUpdate { pub id: String, + #[serde(default)] pub state: String, #[serde(default)] pub verification: Vec, + /// "shared-change-request": a worker asks the supervisor to change a stage 0 + /// file. Needs file and reason; state "resolved" closes requests for that file. + pub kind: Option, + pub file: Option, + pub reason: Option, + pub diff: Option, +} +/// Binds a feature to the API operation its pages call. `defer` records the +/// explicit decision to use no API yet; it is reported as unfinished. +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +#[schemars(extend("additionalProperties" = json!({"not": {}})))] +pub struct ApiWiring { + pub feature: String, + pub operation_id: Option, + #[serde(default)] + pub defer: bool, + pub reason: Option, } fn read(root: &str) -> Result { @@ -172,19 +210,276 @@ fn confirmed(plan: &Value) -> Result<(), DevupError> { } Ok(()) } -fn response(plan: Value) -> Value { +/// Saves decisions without dropping earlier ones; a decision with the same id +/// is replaced. Used by draft and confirm as well as defer/assume. +fn record_decisions( + plan: &mut Value, + decisions: &[Decision], + state: &str, +) -> Result<(), DevupError> { + for d in decisions { + if d.id.trim().is_empty() || d.reason.trim().is_empty() || d.recommended.trim().is_empty() + { + return Err(invalid("Decisions need id, reason and recommended option")); + } + let list = plan["decisions"].as_array_mut().unwrap(); + list.retain(|v| v["id"] != d.id); + let mut value = json!(d); + if d.state.as_deref().is_some_and(|state| !["pending", "confirmed"].contains(&state)) { + return Err(invalid("Decision state must be pending or confirmed")); + } + value["state"] = json!(d.state.as_deref().unwrap_or(state)); + list.push(value); + } + Ok(()) +} +fn figma_url(plan: &Value) -> String { + let figma = &plan["facts"]["figma"]; + figma + .as_str() + .or_else(|| array(figma).first().and_then(Value::as_str)) + .unwrap_or_default() + .to_owned() +} +fn screen_blockers(plan: &Value, root: &str) -> Vec { + if figma_url(plan).is_empty() { + return vec![]; + } + match screen_plan::read_plan(root) { + Ok(Some(s)) if s["state"] == "confirmed" || s["status"] == "confirmed" => vec![], + _ => vec!["screenPlan: not confirmed".to_owned()], + } +} +fn screen_plan_hint(plan: &Value, root: &str) -> String { + format!( + "Run {} first.", + json!({"tool":"devup_screen_plan","arguments":{"action":"draft","url":figma_url(plan),"projectRoot":root}}) + ) +} +fn next_action(plan: &Value, root: &str) -> Value { + let args = |action: &str| json!({"action":action, "planId":plan["planId"], "projectRoot":root}); + if matches!(plan["state"].as_str(), Some("intake" | "draft")) + && !screen_blockers(plan, root).is_empty() + { + return json!({ + "tool":"devup_screen_plan", + "arguments":{"action":"draft","url":figma_url(plan),"projectRoot":root}, + "how":"Figma sources need a confirmed screen plan before project confirm; run it first and ask its questions together with this plan's."}); + } + match plan["state"].as_str() { + Some("confirmed") if !units::open_requests(plan).is_empty() => json!({ + "tool":"devup_project_plan","arguments":args("status"), + "how":"Apply the open sharedChangeRequests to the stage 0 files, then send a unitUpdates entry of kind shared-change-request, state resolved and the file; merged units that depend on stage 0 go back to verifying."}), + Some("confirmed") if array(&plan["units"]).is_empty() => json!({ + "tool":"devup_project_plan","arguments":args("split"), + "how":"Models are written and unitDag is empty until split; run backendCommands in modelsWorkingDirectory first."}), + Some("draft") => json!({ + "tool":"devup_project_plan","arguments":args("confirm"), + "how":"Ask unanswered questions with the question tool, then confirm (acceptRecommended fills the rest)."}), + _ => Value::Null, + } +} +fn unit_rows(plan: &Value) -> Vec { + array(&plan["units"]) + .iter() + .map(|u| { + json!({"id":u["id"],"layer":u["layer"],"state":u["state"], + "dependencies":u["dependencies"], + "brief":format!(".devup/units/{}.md", text(&u["id"]))}) + }) + .collect() +} +/// Questions of an unconfirmed screen plan, so one round covers both plans. +fn open_screen_plan(root: &str) -> Option { + match screen_plan::read_plan(root) { + Ok(Some(s)) if s["state"] != "confirmed" && s["status"] != "confirmed" => Some(s), + _ => None, + } +} +fn open_screen_questions(root: &str) -> Vec { + open_screen_plan(root) + .map(|s| array(&s["questions"]).to_vec()) + .unwrap_or_default() +} +/// Answers addressed to screen-plan questions are not project-plan answers: +/// they are split off and returned as the devup_screen_plan confirm call that +/// carries them, so the user answers one merged round. +fn forward_screen_answers( + root: &str, + answers: &BTreeMap, + accept_recommended: bool, +) -> (BTreeMap, Value) { + let Some(screen) = open_screen_plan(root) else { + return (answers.clone(), Value::Null); + }; + let ids = array(&screen["questions"]) + .iter() + .map(|q| text(&q["id"]).to_owned()) + .collect::>(); + let (screen_answers, own): (BTreeMap<_, _>, BTreeMap<_, _>) = answers + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .partition(|(k, _)| ids.contains(k)); + if screen_answers.is_empty() && !(accept_recommended && !ids.is_empty()) { + return (own, Value::Null); + } + let forward = json!({"tool":"devup_screen_plan","arguments":{ + "action":"confirm","planId":screen["planId"],"projectRoot":root, + "answers":screen_answers,"acceptRecommended":accept_recommended}, + "how":"These answers belong to the screen plan: send them with this call. The user was asked once, in the merged proposal."}); + (own, forward) +} +fn without_screens(plan: &Value) -> Vec { + array(&plan["features"]) + .iter() + .filter(|f| array(&f["screens"]).is_empty()) + .map(|f| f["id"].clone()) + .collect() +} +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(deny_unknown_fields)] +#[schemars(extend("additionalProperties" = json!({"not": {}})))] +pub struct ScopeExclusion { + pub r#ref: String, + pub reason: String, +} +fn change_summary(before: &Value, after: &Value) -> Value { + let mut summary = json!({}); + for (field, key) in [("decisions", "id"), ("features", "id"), ("entities", "name"), ("answers", "")] { + let records = |plan: &Value| -> BTreeMap { + if key.is_empty() { + plan[field].as_object().into_iter().flatten().map(|(k, v)| (k.clone(), v.clone())).collect() + } else { + array(&plan[field]).iter().map(|v| (text(&v[key]).to_owned(), v.clone())).collect() + } + }; + let old = records(before); + let new = records(after); + let mut changes = json!({"added":[],"changed":[],"kept":[],"removed":[]}); + for (id, value) in &new { + let kind = match old.get(id) { + None => "added", + Some(previous) if previous == value => "kept", + Some(_) => "changed", + }; + changes[kind].as_array_mut().unwrap().push(json!(id)); + } + changes["removed"] = json!(old.keys().filter(|id| !new.contains_key(*id)).collect::>()); + summary[field] = changes; + } + summary +} +const DATA_UI: [&str; 9] = [ + "list", "detail", "form", "search", "inquiry", "filter", "pagination", "board", "table", +]; +/// Set when the project plan has screens that read or write data but its ERD is +/// not confirmed yet; page writes are refused until then. +pub(crate) fn erd_required(root: &str) -> Option { + let plan = read(root).ok()?; + if plan["state"] == "confirmed" || !erd::api(&plan) { + return None; + } + let data_ui = !array(&plan["entities"]).is_empty() + || array(&plan["features"]).iter().any(|f| { + let haystack = format!("{} {} {}", text(&f["scope"]), f["acceptance"], f["screens"]) + .to_lowercase(); + !array(&f["entities"]).is_empty() || DATA_UI.iter().any(|k| haystack.contains(k)) + }); + data_ui.then(|| json!({"planId":plan["planId"],"state":plan["state"]})) +} +fn blockers(plan: &Value, root: &str) -> Vec { + [screen_blockers(plan, root), wiring::blockers(plan, root)].concat() +} +fn extras(plan: &Value, root: &str) -> Value { + let no_screens = without_screens(plan); + let mut extra = json!({ + "writtenTo": plan["writtenTo"], + "decisionCount": array(&plan["decisions"]).len(), + "unitState": if array(&plan["units"]).is_empty() {"not-split"} else {"split"}, + "sharedChangeRequests": units::open_requests(plan), + "apiWiring": wiring::report(plan, root), + "backendChecks": wiring::backend_checks(plan, root), + "dataMappings": plan["dataMappings"], + "endpointContracts": plan["endpointContracts"], + }); + if erd::api(plan) && array(&plan["entities"]).is_empty() { + extra["erdDraftRequired"] = json!({ + "reason":"API scope has no entities; draft the ERD before approving it.", + "nextAction":{"tool":"devup_project_plan","arguments":{ + "action":"draft","projectRoot":root,"planId":plan["planId"]}, + "how":"Supply entities and relations from the recorded requirements."} + }); + } + if !no_screens.is_empty() { + extra["featuresWithoutScreens"] = json!({"features":no_screens, + "how":"These features list no screens. Pass features[].screens (page or route names) in draft; no screens question is asked."}); + } + extra +} +fn response(plan: Value, root: &str, full: bool) -> Value { + let extra = extras(&plan, root); + let models = erd::api(&plan).then(|| erd::disk_report(&plan, root)); + let sourced_defaults = array(&plan["questions"]).iter().filter(|question| !question["sourcedDefaults"].is_null()) + .map(|question| json!({"questionId":question["id"],"evidence":question["sourcedDefaults"]})).collect::>(); + let conflicts = array(&plan["questions"]).iter().filter(|question| { + text(&question["id"]).ends_with(".notifications") + && text(&question["sourcedDefaults"]["recommended"]) != "No notifications or integrations" + && plan["answers"][text(&question["id"])] == "No notifications or integrations" + }).map(|question| json!({"questionId":question["id"],"warning":"recommendationConflictsWithEvidence","evidence":question["sourcedDefaults"]})).collect::>(); + let mut out = base_response(plan, root, full); + out["sourcedDefaults"] = json!(sourced_defaults); + out["recommendationConflictsWithEvidence"] = json!(conflicts); + if let Some(models) = models { + out["modelDiagnostics"] = models; + } + if let (Some(o), Some(e)) = (out.as_object_mut(), extra.as_object()) { + o.extend(e.clone()); + } + out +} +fn base_response(plan: Value, root: &str, full: bool) -> Value { let questions = array(&plan["questions"]) .iter() .filter(|q| plan["answers"][text(&q["id"])].is_null()) .cloned() .collect::>(); + let screen_open = open_screen_questions(root); + let screen_ids = screen_open.iter().map(|q| q["id"].clone()).collect::>(); + let questions = [questions, screen_open].concat(); let proposal = screen_plan::proposal(&questions); + let instruction = if plan["state"] == "confirmed" { + include_str!("../text/mod-response-22d8f704.md") + } else { + screen_plan::ASK_INSTRUCTION + }; + if !full { + return json!({"planId":plan["planId"], "state":plan["state"], "detail":"summary", + "openQuestionCount":questions.len(), + "openQuestionIds":questions.iter().map(|q| q["id"].clone()).collect::>(), + "screenPlanQuestionIds":screen_ids, + "blockers":blockers(&plan, root), + "proposalMarkdown":screen_plan::proposal_markdown(&proposal), + "questionRounds":screen_plan::question_rounds(&questions, 4), + "instruction":instruction, + "nextAction":next_action(&plan, root), + "erdMermaid":erd::mermaid(array(&plan["entities"])), + "unitDag":units::dag(array(&plan["units"])), + "units":unit_rows(&plan), + "decisions":plan["decisions"], + "backendCommands":plan["backendCommands"], + "backendNotes":plan["backendNotes"], + "modelsWorkingDirectory":plan["modelsWorkingDirectory"], + "how":"Summary only. Pass detail \"full\" to read the whole plan."}); + } json!({"planId":plan["planId"], "state":plan["state"], + "blockers":blockers(&plan, root), "proposalMarkdown":screen_plan::proposal_markdown(&proposal), "proposal":proposal, + "screenPlanQuestionIds":screen_ids, "questions":screen_plan::ask_shape(&questions), "questionRounds":screen_plan::question_rounds(&questions, 4), - "instruction": if plan["state"] == "confirmed" { include_str!("../text/mod-response-22d8f704.md") } else { screen_plan::ASK_INSTRUCTION }, + "instruction":instruction, + "nextAction":next_action(&plan, root), "erdMermaid":erd::mermaid(array(&plan["entities"])), "unitDag":units::dag(array(&plan["units"])), "finalReport":{"units":plan["units"], "decisions":plan["decisions"], "completion":"unverified until supervisor reruns all verification and stack diff reports no drift"}, @@ -198,14 +493,32 @@ pub(super) async fn run( if input.project_root.trim().is_empty() { return Err(invalid("projectRoot is required")); } + if input + .detail + .as_deref() + .is_some_and(|d| !["summary", "full"].contains(&d)) + { + return Err(invalid("detail must be summary or full")); + } + let full = input.detail.as_deref() == Some("full"); // Apply the same root boundary to reads and writes, even for status. policy.resolve(&Path::new(&input.project_root).join(FILE).to_string_lossy())?; let mut tx = OutputTransaction::new(); if input.action == "intake" { - if Path::new(&input.project_root).join(FILE).exists() { - return Err(invalid( + let existing = Path::new(&input.project_root).join(FILE).exists() + .then(|| read(&input.project_root)).transpose()?; + if let Some(existing) = existing.as_ref().filter(|_| !input.restart) { + let mut error = invalid( "Project plan exists; use draft/status instead of replacing decisions", - )); + ); + error.details = json!({"existingPlan":{"planId":existing["planId"],"state":existing["state"], + "confirmedAt":existing["confirmedAt"],"writtenBy":existing["writtenBy"],"files":[FILE]}, + "nextAction":{"tool":"devup_project_plan","arguments":{"action":"status", + "projectRoot":input.project_root,"planId":existing["planId"]}}, + "choices":["Continue existing plan","Archive existing plan before restarting"], + "restartAction":{"tool":"devup_project_plan","arguments":{"action":"intake","projectRoot":input.project_root,"restart":true}}, + "warnings": if existing["writtenBy"]["buildId"].as_str().is_some_and(|id| id != env!("DEVUP_MCP_BUILD_ID")) {vec!["Existing plan was written by a different build"]} else {vec![]}}); + return Err(error); } let facts = rounds::facts(input)?; let id = sha256(format!("{}{}", input.project_root, now()).as_bytes()); @@ -213,25 +526,84 @@ pub(super) async fn run( "facts":facts,"evidence":input.evidence,"answers":{},"decisions":[],"units":[], "questions":rounds::intake(&facts),"entities":[],"relations":[],"features":[],"issues":[], "unitQuestions":"supervisor"}); + plan["writtenBy"] = json!({"commit":option_env!("DEVUP_MCP_GIT_COMMIT"),"buildId":env!("DEVUP_MCP_BUILD_ID")}); + plan["scopeExclusions"] = json!(input.scope_exclusions); rounds::answers(&mut plan, &input.answers)?; - write(&mut tx, policy, &input.project_root, &plan)?; - tx.commit()?; - return Ok(response(plan)); + let archive = if input.restart && existing.is_some() { + Some(recovery::archive(&input.project_root, policy)?) + } else { None }; + if let Some(existing) = existing + && input.scope_exclusions.is_empty() { + plan["scopeExclusions"] = existing["scopeExclusions"].clone(); + } + let persisted = write(&mut tx, policy, &input.project_root, &plan).and_then(|()| tx.commit().map(|_| ())); + if let Err(error) = persisted { + if let Some(archive) = archive.as_ref() { + recovery::restore(&input.project_root, archive)?; + } + return Err(error); + } + if let Some(archive) = archive { plan["archivedTo"] = json!(archive); } + return Ok(response(plan, &input.project_root, full)); } let mut plan = read(&input.project_root)?; - if input.plan_id.as_deref() != plan["planId"].as_str() { - return Err(invalid("planId is missing or stale")); + let previous = plan.clone(); + // status is a read: it may omit planId and reads it from the plan file. + let provided = input.plan_id.is_some() || input.action != "status"; + if provided && input.plan_id.as_deref() != plan["planId"].as_str() { + let mut error = invalid(format!( + "planId is missing or stale; current planId {} state {}", + text(&plan["planId"]), + text(&plan["state"]) + )); + error.details = json!({"planId":plan["planId"],"state":plan["state"], + "nextAction":{"tool":"devup_project_plan","arguments":{ + "action":"status","projectRoot":input.project_root,"planId":plan["planId"]}}}); + return Err(error); + } + if !input.scope_exclusions.is_empty() { + for exclusion in &input.scope_exclusions { + if exclusion.r#ref.trim().is_empty() || exclusion.reason.trim().is_empty() { + return Err(invalid("Scope exclusions require ref and reason")); + } + } + plan["scopeExclusions"] = json!(input.scope_exclusions); } + let (answers, forward) = if matches!(input.action.as_str(), "draft" | "confirm") { + let mut shared = BTreeMap::new(); + let fresh = rounds::facts(input)?; + for key in ["siteName", "siteUrl", "favicon", "ogImage", "motion"] { + let value = input.answers.get(key) + .or_else(|| plan["answers"].get(key)) + .or_else(|| fresh.get(key)) + .or_else(|| plan["facts"].get(key)); + if let Some(value) = value.filter(|v| v.as_str().is_some_and(|s| !s.trim().is_empty())) + && open_screen_questions(&input.project_root).iter().any(|q| q["id"] == key) + { + shared.insert(key.to_owned(), value.clone()); + } + } + shared.extend(input.answers.clone()); + forward_screen_answers(&input.project_root, &shared, input.accept_recommended) + } else { + (input.answers.clone(), Value::Null) + }; match input.action.as_str() { "draft" => { if plan["state"] == "confirmed" { return Err(invalid("Confirmed plans cannot be redrafted")); } - rounds::answers(&mut plan, &input.answers)?; + let previous_answers = answers.iter() + .filter(|(id, _)| array(&plan["questions"]).iter().any(|question| question["id"] == **id)) + .map(|(id, answer)| (id.clone(), answer.clone())) + .collect(); + rounds::answers(&mut plan, &previous_answers)?; if input.accept_recommended { rounds::accept_recommended(&mut plan)?; } - rounds::require_answers(&plan)?; + // Open questions no longer block draft: new evidence, features and + // decisions are saved first and only confirm requires every answer. + record_decisions(&mut plan, &input.decisions, "pending")?; for ev in &input.evidence { if ev.source.trim().is_empty() { return Err(invalid("Evidence needs a source")); @@ -261,18 +633,37 @@ pub(super) async fn run( plan["unitQuestions"] = json!(mode); } erd::draft(input, &mut plan)?; + wiring::draft(&mut plan); plan["questions"] = json!(rounds::detail(&plan, &input.extra_questions)?); + let new_answers = answers.into_iter() + .filter(|(id, _)| !previous_answers.contains_key(id)) + .collect(); + rounds::answers(&mut plan, &new_answers)?; + if input.accept_recommended { + rounds::accept_recommended(&mut plan)?; + } plan["state"] = json!("draft"); } "confirm" => { if plan["state"] != "draft" { return Err(invalid("Draft the complete plan before confirm")); } - rounds::answers(&mut plan, &input.answers)?; + rounds::answers(&mut plan, &answers)?; if input.accept_recommended { rounds::accept_recommended(&mut plan)?; } - rounds::require_answers(&plan)?; + rounds::require_answers(&plan).map_err(|mut error| { + error.details = json!({ + "missingQuestionIds": array(&plan["questions"]).iter() + .filter(|q| plan["answers"][text(&q["id"])].is_null()) + .map(|q| q["id"].clone()).collect::>(), + "nextAction":{"tool":"devup_project_plan","arguments":{ + "action":"confirm","projectRoot":input.project_root, + "planId":plan["planId"],"answers":{},"acceptRecommended":true}} + }); + error + })?; + record_decisions(&mut plan, &input.decisions, "pending")?; if plan["answers"] .as_object() .unwrap() @@ -287,15 +678,25 @@ pub(super) async fn run( // Figma remains its own confirmation gate and is retained in every brief. if let Some(screen) = screen_plan::read_plan(&input.project_root)? { if screen["state"] != "confirmed" && screen["status"] != "confirmed" { - return Err(invalid("Confirm the Figma screen plan first")); + return Err(invalid(format!( + "Confirm the Figma screen plan first. {}", + screen_plan_hint(&plan, &input.project_root) + ))); } plan["screenPlan"] = screen; - } else if !array(&plan["facts"]["figma"]).is_empty() { - return Err(invalid( - "Figma sources require a confirmed devup_screen_plan", - )); + } else if !figma_url(&plan).is_empty() { + return Err(invalid(format!( + "Figma sources require a confirmed devup_screen_plan. {}", + screen_plan_hint(&plan, &input.project_root) + ))); } + wiring::draft(&mut plan); erd::write_models(&mut tx, policy, &input.project_root, &plan)?; + plan["writtenTo"] = json!(if erd::api(&plan) { + array(&plan["entities"]).iter() + .map(|entity| format!("{}/{}.json", text(&plan["modelsDir"]), text(&entity["name"]))) + .collect::>() + } else { vec![] }); plan["state"] = json!("confirmed"); plan["confirmedAt"] = json!(now()); } @@ -345,7 +746,22 @@ pub(super) async fn run( )); } } + wiring::record(&mut plan, &input.api_wiring)?; write(&mut tx, policy, &input.project_root, &plan)?; tx.commit()?; - Ok(response(plan)) + let changes = (input.action == "draft").then(|| change_summary(&previous, &plan)); + let mut out = response(plan, &input.project_root, full); + if let Some(changes) = changes { + out["changeSummary"] = changes; + } + if input.action == "status" && !full + && let Some(summary) = out.as_object_mut() + { + summary.remove("questionRounds"); + summary.remove("proposalMarkdown"); + } + if !forward.is_null() { + out["screenPlanForward"] = forward; + } + Ok(out) } diff --git a/crates/devup-mcp/src/server/project_plan/recovery.rs b/crates/devup-mcp/src/server/project_plan/recovery.rs new file mode 100644 index 00000000..55761ff0 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/recovery.rs @@ -0,0 +1,33 @@ +use super::*; + +const FILES: [&str; 4] = ["project-plan.json", "screen-plan.json", "screen-plan.md", "units"]; + +pub(super) fn archive(root: &str, policy: &OutputPolicy) -> Result { + let relative = format!(".devup/archive/{}-{}", now().replace([':', '.'], "-"), rand::random::()); + let base = Path::new(root).join(".devup"); + let destination = Path::new(root).join(&relative); + for name in FILES { + policy.resolve(&base.join(name).to_string_lossy())?; + policy.resolve(&destination.join(name).to_string_lossy())?; + } + std::fs::create_dir_all(&destination).map_err(|error| invalid(error.to_string()))?; + for name in FILES { + let source = base.join(name); + if source.exists() && let Err(error) = std::fs::rename(&source, destination.join(name)) { + restore(root, &relative)?; + return Err(invalid(format!("Archive project plan: {error}"))); + } + } + Ok(relative) +} + +pub(super) fn restore(root: &str, archive: &str) -> Result<(), DevupError> { + let destination = Path::new(root).join(".devup"); + for name in FILES.into_iter().rev() { + let source = Path::new(root).join(archive).join(name); + if source.exists() { + std::fs::rename(source, destination.join(name)).map_err(|error| invalid(format!("Restore archived plan from {archive}: {error}")))?; + } + } + Ok(()) +} diff --git a/crates/devup-mcp/src/server/project_plan/rounds.rs b/crates/devup-mcp/src/server/project_plan/rounds.rs index d417380e..dabacee8 100644 --- a/crates/devup-mcp/src/server/project_plan/rounds.rs +++ b/crates/devup-mcp/src/server/project_plan/rounds.rs @@ -11,6 +11,10 @@ pub(super) fn facts(input: &ProjectPlanInput) -> Result { facts["parts"] = json!("front + admin"); facts["partsEvidence"] = json!("apps/admin exists"); } + let candidates = spec_candidates(root); + if !candidates.is_empty() { + facts["specCandidates"] = json!(candidates); + } for ev in &input.evidence { if ev.source.trim().is_empty() { return Err(invalid("Evidence requires a source")); @@ -21,6 +25,29 @@ pub(super) fn facts(input: &ProjectPlanInput) -> Result { } Ok(facts) } +fn spec_candidates(root: &Path) -> Vec { + const WORDS: [&str; 9] = [ + "요구사항", "기획", "정의서", "명세", "spec", "requirement", "prd", "srs", "brief", + ]; + let Ok(entries) = std::fs::read_dir(root) else { + return vec![]; + }; + let mut found = entries + .filter_map(Result::ok) + .filter(|e| e.path().is_file()) + .filter_map(|e| { + let name = e.file_name().to_string_lossy().into_owned(); + let lower = name.to_lowercase(); + let ext = Path::new(&lower).extension()?.to_str()?.to_owned(); + (["pdf", "docx", "md", "hwp", "txt"].contains(&ext.as_str()) + && WORDS.iter().any(|w| lower.contains(w))) + .then_some(name) + }) + .collect::>(); + found.sort(); + found.truncate(10); + found +} fn ask(id: &str, prompt: String, options: &[&str]) -> Value { question( id.into(), @@ -43,7 +70,7 @@ pub(super) fn intake(facts: &Value) -> Vec { let parts = text(&facts["parts"]); vec![ ask("workType", "What kind of work is this? Choose new project, existing feature, bug fix, Figma page implementation, or refactor (custom answer).".into(), &["new project", "feature on existing project", "bug fix", "Figma page implementation"]), - ask("sources", format!("Which optional sources should be read? Figma links, Jira issues/epics, Confluence URLs or files. Already read evidence: {facts}"), &["Use recorded sources", "No additional sources"]), + ask("sources", format!("Which optional sources should be read? Figma links, Jira issues/epics, Confluence URLs or files. Spec documents found in the project root: {}. Read them (extract PDF/DOCX text) and pass the text as evidence. Already read evidence: {facts}", facts["specCandidates"]), &["Use recorded sources", "No additional sources"]), ask("goal", format!("What should be built in one sentence? Source default: {}", text(&facts["goal"])), &[if facts["goal"].is_string() {text(&facts["goal"])} else {"Describe the goal"}, "Use source scope"]), ask("parts", format!("Which parts are in scope? Default evidence: {}", facts["partsEvidence"]), &[if parts.is_empty() {"front only"} else {parts}, "front + admin", "front + admin + API"]), ] @@ -106,7 +133,10 @@ pub(super) fn detail( plan: &Value, extra: &[screen_plan::ExtraQuestionInput], ) -> Result, DevupError> { - let mut questions = vec![]; + let mut questions = intake(&plan["facts"]) + .into_iter() + .filter(|question| plan["answers"][text(&question["id"])].is_null()) + .collect::>(); if array(&plan["features"]).is_empty() && array(&plan["issues"]).is_empty() { return Err(invalid( "draft needs features or Jira issues read from sources", @@ -120,23 +150,64 @@ pub(super) fn detail( .as_str() .or_else(|| feature["key"].as_str()) .unwrap_or("feature"); - for (topic, prompt) in [ - ("screens", "screens/routes and user roles"), - ("states", "empty, loading and error states"), - ("permissions", "permissions and ownership"), - ("forms", "forms and field validation"), - ( - "notifications", - "notifications and external integrations (payment, mail, maps, login providers)", - ), - ] { + if array(&plan["scopeExclusions"]).iter().any(|exclusion| exclusion["ref"] == id) { + continue; + } + let sources = array(&plan["evidence"]).iter().filter(|evidence| { + !array(&plan["scopeExclusions"]).iter().any(|exclusion| exclusion["ref"] == evidence["source"]) + }).filter_map(|evidence| evidence["facts"].as_object().map(|facts| { + facts.iter().filter(|(key, _)| key.starts_with(&format!("{id}."))) + .map(|(_, value)| value.to_string()).collect::>().join(" ") + })).collect::>().join(" "); + let haystack = format!("{} {} {sources}", text(&feature["scope"]), feature["acceptance"]).to_lowercase(); + let topics: [(&str, &str, &[&str], [&str; 3]); 4] = [ + ("states", "empty, loading and error states", &[], ["Use recorded feature acceptance criteria", "Standard empty/loading/error states", "Exclude this capability"]), + ("permissions", "permissions and ownership", &["admin", "auth", "login", "role", "permission", "owner", "member"], ["Admins only", "Signed-in users", "Public"]), + ("forms", "forms and field validation", &["form", "input", "inquiry", "contact", "signup", "register", "submit", "search", "write", "edit"], ["Required fields with inline validation", "Use recorded feature acceptance criteria", "Exclude this capability"]), + ("notifications", "notifications and external integrations (payment, mail, maps, login providers)", &["mail", "email", "smtp", "notif", "payment", "map", "sms", "alert", "analytics", "oauth"], ["No notifications or integrations", "SMTP email to a staff address", "Other integration (custom answer)"]), + ]; + for (topic, prompt, keywords, options) in topics { + let mut options = options; + if topic == "notifications" { + if ["mail", "smtp"].iter().any(|keyword| haystack.contains(keyword)) { + options.swap(0, 1); + } else if ["payment", "map", "oauth"].iter().any(|keyword| haystack.contains(keyword)) { + options.swap(0, 2); + } + } + let relevant = match topic { + "states" => true, + _ => keywords.iter().any(|k| haystack.contains(k)), + }; let key = format!("{id}.{topic}"); - if plan["facts"][&key].is_null() { - questions.push(ask(&key, format!("For {} ({id}), specify {prompt}. Screens: {}. Record a concrete decision or explicitly exclude the capability.", text(&feature["scope"]), feature["screens"]), &["Use recorded feature acceptance criteria", "Exclude this capability"])); + if array(&plan["scopeExclusions"]).iter().any(|exclusion| exclusion["ref"] == key) { + continue; + } + if relevant && plan["facts"][&key].is_null() { + let mut question = ask(&key, format!("For {} ({id}), specify {prompt}. Screens: {}. Acceptance: {}. Record a concrete decision or explicitly exclude the capability.", text(&feature["scope"]), feature["screens"], feature["acceptance"]), &options); + question["sourcedDefaults"] = json!({"source":format!("features[{id}].scope/acceptance and feature-keyed evidence"),"recommended":options[0]}); + questions.push(question); + } + } + } + let mut grouped: Vec = Vec::new(); + for mut question in questions { + let id = text(&question["id"]).to_owned(); + if let Some((feature, topic)) = id.rsplit_once('.') { + if let Some(existing) = grouped.iter_mut().find(|q| { + text(&q["id"]).rsplit_once('.').is_some_and(|(_, other)| other == topic) + && q["options"] == question["options"] + }) { + existing["features"].as_array_mut().unwrap().push(json!(feature)); + existing["question"] = json!(format!("{}\n{}", text(&existing["question"]), text(&question["question"]))); + continue; } + question["features"] = json!([feature]); } + grouped.push(question); } - if erd::api(plan) { + let mut questions = grouped; + if erd::api(plan) && !array(&plan["entities"]).is_empty() { for (key, topic) in [ ( "erd", @@ -158,7 +229,25 @@ pub(super) fn detail( ("storage", "Set file/image storage and nullable metadata"), ] { if plan["facts"][key].is_null() { - questions.push(ask(key, format!("{topic}. Draft ERD: {}. Supply changes as entities/relations with confirm; a prose correction requires redraft.", plan["entities"]), &["Approve recorded ERD", "Revise ERD before confirming"])); + let names = array(&plan["entities"]).iter().map(|e| text(&e["name"])).collect::>(); + let entities = names.join(", "); + let columns = array(&plan["entities"]).iter().flat_map(|e| { + array(&e["columns"]).iter().filter(|c| !c["index"].is_null() || !c["unique"].is_null()) + .map(|c| format!("{}.{}", text(&e["name"]), text(&c["name"]))) + }).collect::>().join(", "); + let choices = match key { + "erd" => vec![format!("Keep recorded columns and relations for {entities}"), "Revise ERD before confirming".into()], + "tenancy" => vec![format!("Single tenant for {entities}"), format!("Tenant ownership required for {entities}")], + "auth" => vec![format!("Use recorded auth and role columns for {entities}"), format!("External identity provider for {entities}")], + "lifecycle" => vec![format!("Keep recorded lifecycle for {entities}"), format!("Soft delete required for {entities}"), format!("Hard delete with recorded FK actions for {entities}")], + "indexes" => vec![format!("Keep recorded indexes: {columns}"), format!("Revise filter and sort indexes for {entities}")], + "storage" => vec![format!("Use recorded file metadata for {entities}"), format!("Object storage with nullable metadata for {entities}"), format!("No file storage for {entities}")], + _ => unreachable!(), + }; + let options = choices.iter().map(String::as_str).collect::>(); + let mut question = ask(key, format!("{topic}. Draft ERD: {}. Supply changes as entities/relations with confirm; a prose correction requires redraft.", plan["entities"]), &options); + question["entities"] = json!(names); + questions.push(question); } } } diff --git a/crates/devup-mcp/src/server/project_plan/tests.rs b/crates/devup-mcp/src/server/project_plan/tests.rs index cfbf45c6..026eeeb6 100644 --- a/crates/devup-mcp/src/server/project_plan/tests.rs +++ b/crates/devup-mcp/src/server/project_plan/tests.rs @@ -19,12 +19,17 @@ impl Drop for TestDir { } } use super::*; +mod feedback; +mod contracts; +mod inference; +mod recovery; fn input(root: &Path, action: &str) -> ProjectPlanInput { serde_json::from_value(json!({"action":action,"projectRoot":root})).unwrap() } async fn drafted(root: &Path, api: bool) -> (ProjectPlanInput, OutputPolicy, Value) { let policy = OutputPolicy::from_roots(vec![root.to_path_buf()]).unwrap(); let mut i = input(root, "intake"); + i.detail = Some("full".into()); i.evidence = vec![serde_json::from_str(include_str!("../../../tests/fixtures/project-plan/figma.json")).unwrap()]; let r = run(&i, &policy).await.unwrap(); i.plan_id = r["planId"].as_str().map(str::to_owned); @@ -47,6 +52,7 @@ async fn drafted(root: &Path, api: bool) -> (ProjectPlanInput, OutputPolicy, Val scope: "Post authoring".into(), screens: vec!["Post list".into()], acceptance: vec!["Authenticated authors publish posts".into()], + entities: vec![], }]; i.evidence.push(serde_json::from_value(json!({"source":"repo defaults","facts":{ "goal":"Source defaults cannot replace the selected goal", @@ -191,7 +197,7 @@ async fn split_three_issues_preserves_dag_and_briefs() { i.action = "split".into(); i.answers.clear(); let r = run(&i, &policy).await.unwrap(); - assert_eq!(array(&r["plan"]["units"]).len(), 3); + assert_eq!(array(&r["plan"]["units"]).len(), 4); assert_eq!(r["plan"]["units"][2]["dependencies"], json!(["DEV-2"])); let brief = std::fs::read_to_string(dir.path().join(".devup/units/DEV-3.md")).unwrap(); for required in [ @@ -216,16 +222,17 @@ async fn feature_split_and_decisions_and_state_gates() { i.action = "split".into(); i.answers.clear(); let r = run(&i, &policy).await.unwrap(); - assert_eq!(array(&r["plan"]["units"]).len(), 5); + assert_eq!(array(&r["plan"]["units"]).len(), 4); assert_eq!( - r["plan"]["units"][4]["dependencies"], - json!(["posts-client"]) + r["plan"]["units"][2]["dependencies"], + json!(["model-post"]) ); i.action = "status".into(); i.unit_updates.push(UnitUpdate { - id: "posts-api".into(), + id: "posts-domain".into(), state: "running".into(), verification: vec![], + ..Default::default() }); assert!(run(&i, &policy).await.is_err()); i.unit_updates.clear(); @@ -235,6 +242,8 @@ async fn feature_split_and_decisions_and_state_gates() { reason: "Destructive cleanup".into(), recommended: "Keep data".into(), destructive: true, + state: None, + kind: None, }); run(&i, &policy).await.unwrap(); i.action = "assume".into(); @@ -247,3 +256,131 @@ async fn feature_split_and_decisions_and_state_gates() { i.plan_id = Some("stale".into()); assert!(run(&i, &policy).await.is_err()); } +fn kept(decisions: &Value, id: &str) -> bool { + array(decisions) + .iter() + .any(|d| d["id"] == id && d["state"] == "pending") +} +fn decision(id: &str) -> Decision { + Decision { + id: id.into(), + reason: "Needs the user".into(), + recommended: "Keep".into(), + destructive: false, + state: None, + kind: None, + } +} +#[tokio::test] +async fn draft_keeps_decisions() { + let dir = TestDir::new(); + let (mut i, policy, _) = drafted(dir.path(), false).await; + i.action = "draft".into(); + i.answers.clear(); + i.decisions = vec![decision("d-draft")]; + let r = run(&i, &policy).await.unwrap(); + assert!(kept(&r["plan"]["decisions"], "d-draft")); +} +#[tokio::test] +async fn confirm_keeps_decisions() { + let dir = TestDir::new(); + let (mut i, policy, _) = drafted(dir.path(), false).await; + i.decisions = vec![decision("d-confirm")]; + let r = run(&i, &policy).await.unwrap(); + assert_eq!(r["state"], "confirmed"); + assert!(kept(&r["plan"]["decisions"], "d-confirm")); +} +#[tokio::test] +async fn status_works_without_plan_id_and_next_action_follows_confirm() { + let dir = TestDir::new(); + let (i, policy, _) = drafted(dir.path(), false).await; + let r = run(&i, &policy).await.unwrap(); + assert_eq!(r["nextAction"]["arguments"]["action"], "split"); + let mut status = i.clone(); + status.action = "status".into(); + status.plan_id = None; + status.answers.clear(); + let r = run(&status, &policy).await.unwrap(); + assert_eq!(r["plan"]["state"], "confirmed"); +} +#[test] +fn no_erd_questions_when_entities_are_empty() { + let plan = json!({"facts":{"parts":"front + admin + API"},"entities":[],"issues":[], + "features":[{"id":"news","scope":"News list","screens":["List"],"acceptance":[]}]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + assert!(questions.iter().all(|q| q["id"] != "erd" && q["id"] != "tenancy")); +} +#[test] +fn question_headers_have_no_leading_colon() { + for q in rounds::intake(&json!({})) { + assert!(!text(&q["header"]).starts_with(':'), "{}", q["header"]); + } +} + +#[tokio::test] +async fn status_lists_open_screen_plan_questions_in_the_proposal() { + let dir = TestDir::new(); + let (i, policy, _) = drafted(dir.path(), false).await; + let mut status = i.clone(); + status.action = "status".into(); + status.answers.clear(); + std::fs::create_dir_all(dir.path().join(".devup")).unwrap(); + std::fs::write( + dir.path().join(".devup/screen-plan.json"), + json!({"kind":"devup-screen-plan","schemaVersion":1,"state":"draft","questions":[ + {"id":"route:9:1","header":"Route","question":"Which URL?","options":[ + {"label":"/a (Recommended)","description":"a"},{"label":"/b","description":"b"}]} + ]}) + .to_string(), + ) + .unwrap(); + let r = run(&status, &policy).await.unwrap(); + assert_eq!(r["screenPlanQuestionIds"], json!(["route:9:1"])); + assert!(text(&r["proposalMarkdown"]).contains("Which URL?")); +} + +#[tokio::test] +async fn api_wiring_is_checked_against_openapi() { + let dir = TestDir::new(); + let (mut i, policy, _) = drafted(dir.path(), false).await; + run(&i, &policy).await.unwrap(); + i.action = "status".into(); + i.answers.clear(); + i.api_wiring = vec![ApiWiring { feature: "posts".into(), operation_id: Some("list_posts".into()), defer: false, reason: None }]; + let r = run(&i, &policy).await.unwrap(); + assert!(text(&r["blockers"][0]).contains("openapi.json not found")); + std::fs::write(dir.path().join("openapi.json"), json!({"paths":{"/posts":{"get":{"operationId":"list_posts"}}}}).to_string()).unwrap(); + i.api_wiring.clear(); + let r = run(&i, &policy).await.unwrap(); + assert!(array(&r["blockers"]).is_empty()); + assert_eq!(r["apiWiring"]["wired"][0]["operationId"], "list_posts"); + i.api_wiring = vec![ApiWiring { feature: "posts".into(), operation_id: None, defer: true, reason: Some("fixture for now".into()) }]; + let r = run(&i, &policy).await.unwrap(); + assert!(text(&r["blockers"][0]).starts_with("unfinished")); +} +#[tokio::test] +async fn shared_change_request_roundtrip() { + let dir = TestDir::new(); + let (mut i, policy, _) = drafted(dir.path(), false).await; + run(&i, &policy).await.unwrap(); + i.action = "split".into(); + i.answers.clear(); + run(&i, &policy).await.unwrap(); + i.action = "status".into(); + i.unit_updates = vec![UnitUpdate { id: "posts-front".into(), kind: Some("shared-change-request".into()), file: Some("layout.tsx".into()), reason: Some("needs nav".into()), ..Default::default() }]; + let r = run(&i, &policy).await.unwrap(); + assert_eq!(array(&r["sharedChangeRequests"]).len(), 1); + assert_eq!(r["nextAction"]["arguments"]["action"], "status"); + i.unit_updates = vec![UnitUpdate { id: "posts-front".into(), kind: Some("shared-change-request".into()), file: Some("layout.tsx".into()), state: "resolved".into(), ..Default::default() }]; + let r = run(&i, &policy).await.unwrap(); + assert!(array(&r["sharedChangeRequests"]).is_empty()); +} +#[tokio::test] +async fn erd_required_until_confirmed() { + let dir = TestDir::new(); + let (i, policy, _) = drafted(dir.path(), true).await; + let root = dir.path().to_string_lossy().into_owned(); + assert!(erd_required(&root).is_some()); + run(&i, &policy).await.unwrap(); + assert!(erd_required(&root).is_none()); +} diff --git a/crates/devup-mcp/src/server/project_plan/tests/contracts.rs b/crates/devup-mcp/src/server/project_plan/tests/contracts.rs new file mode 100644 index 00000000..d97d312f --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/tests/contracts.rs @@ -0,0 +1,196 @@ +use super::*; + +fn plan(scope: &str, columns: Value) -> Value { + json!({"facts":{"parts":"API"},"features":[{"id":"catalog","scope":scope,"entities":["post"],"screens":["1:1"]}], + "entities":[{"name":"post","columns":columns}]}) +} + +#[test] +fn resource_paths_pluralize_the_last_word() { + for (name, path) in [("inquiry","/inquiries"),("category","/categories"),("news","/news"),("series","/series"),("posts","/posts"),("status","/statuses"),("box","/boxes"),("press_release","/press-releases")] { + let mut plan = plan("list", json!([])); + plan["entities"][0]["name"] = json!(name); + plan["features"][0]["entities"] = json!([name]); + wiring::draft(&mut plan); + assert_eq!(plan["endpointContracts"][0]["path"], path, "{name}"); + } +} + +#[test] +fn list_contracts_draft_queries_only_from_relevant_evidence() { + let mut plan = plan("List pagination sort search filter", json!([ + {"name":"title","type":"text","nullable":false}, + {"name":"created_at","type":"timestamptz","nullable":false}, + {"name":"views","type":"integer","nullable":false}, + {"name":"body","type":"text","nullable":false}, + {"name":"category_id","type":"integer","nullable":false}, + {"name":"state","type":{"kind":"enum","values":["draft","published"]},"nullable":false} + ])); + wiring::draft(&mut plan); + let queries = array(&plan["endpointContracts"][0]["queryParams"]); + for name in ["page","pageSize","sort","q","categoryId","state"] { + assert!(queries.iter().any(|query| query["name"] == name), "{name}: {queries:?}"); + } + let sort = queries.iter().find(|query| query["name"] == "sort").unwrap(); + assert_eq!(sort["allowedKeys"], json!(["title","createdAt","views","categoryId"])); + let mut plain = plan.clone(); + plain["features"][0]["scope"] = json!("List"); + wiring::draft(&mut plain); + let plain_queries = array(&plain["endpointContracts"][0]["queryParams"]); + assert!(plain_queries.iter().any(|query| query["name"] == "state")); + assert!(!plain_queries.iter().any(|query| query["name"] == "page" || query["name"] == "sort" || query["name"] == "q")); +} + +#[test] +fn write_contracts_include_validation_and_delete_has_no_response_fields() { + let mut plan = plan("Create edit delete CMS", json!([ + {"name":"email","type":{"kind":"varchar","length":120},"nullable":false}, + {"name":"phone","type":"text","nullable":true}, + {"name":"website_link","type":"text","nullable":true}, + {"name":"privacy_consent","type":"boolean","nullable":false}, + {"name":"state","type":{"kind":"enum","values":["draft","sent"]},"nullable":false} + ])); + wiring::draft(&mut plan); + for operation in ["create","update"] { + let contract = array(&plan["endpointContracts"]).iter().find(|c| c["operation"] == operation).unwrap(); + let fields = array(&contract["requestFields"]); + let email = fields.iter().find(|field| field["name"] == "email").unwrap(); + assert_eq!(email["rules"]["maxLength"], 120); + assert_eq!(email["rules"]["format"], "email"); + assert_eq!(email["rules"]["required"], true); + assert_eq!(fields[1]["rules"]["format"], "phone"); + assert_eq!(fields[2]["rules"]["format"], "url"); + assert_eq!(fields[3]["rules"]["const"], true); + assert_eq!(fields[4]["rules"]["enum"], json!(["draft","sent"])); + } + let delete = array(&plan["endpointContracts"]).iter().find(|c| c["operation"] == "delete").unwrap(); + assert_eq!(delete["method"], "DELETE"); + assert_eq!(delete["path"], "/posts/{id}"); + assert_eq!(delete["responseFields"], json!([])); +} + +#[test] +fn structural_screens_supply_operations_and_form_field_candidates() { + let mut plan = plan("Catalog", json!([{"name":"email_address","type":"text","nullable":false}])); + plan["facts"]["screens"] = json!([{"nodeId":"1:1","url":"/catalog/[slug]","parts":["Tile","Tile","Tile"], + "children":[{"type":"TEXT_INPUT","label":"EmailAddress"},{"name":"TextField","label":"Unknown"}]}]); + wiring::draft(&mut plan); + let mapping = &plan["dataMappings"][0]; + for op in ["list","get","create"] { + assert!(array(&mapping["requiredOperations"]).contains(&json!(op)), "{mapping}"); + assert!(!array(&mapping["operationEvidence"][op]).is_empty()); + } + assert!(array(&mapping["formFields"]).iter().any(|field| field["label"] == "EmailAddress" && field["column"] == "email_address")); + assert!(array(&mapping["formFields"]).iter().any(|field| field["label"] == "Unknown" && field["status"] == "unmatched")); +} + +fn report_contracts(contracts: Value, doc: Value) -> Value { + let dir = TestDir::new(); + std::fs::write(dir.path().join("openapi.json"), doc.to_string()).unwrap(); + wiring::report(&json!({"endpointContracts":contracts}), &dir.path().to_string_lossy()) +} + +#[test] +fn openapi_requires_camel_case_fields_with_structural_paths_and_common_prefix() { + let report = report_contracts(json!([ + {"path":"/posts/{id}","method":"GET","responseFields":[{"name":"imageUrl","column":"image_url","type":"text"}]}, + {"path":"/posts","method":"GET","operation":"list","responseFields":[{"name":"imageUrl","column":"image_url","type":"text"}]} + ]), json!({"paths":{ + "/api/posts/{postId}/":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"imageUrl":{"type":"string"}}}}}}}}}, + "/api/posts":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"properties":{"imageUrl":{"type":"string"}}}}}}}}}} + }})); + assert_eq!(report["contractMissing"], json!([]), "{report}"); + assert_eq!(report["contractMatches"][0]["prefix"], "/api"); + assert_eq!(report["contractMatches"][0]["fields"][0]["openapiName"], "imageUrl"); +} + +#[test] +fn openapi_rejects_ambiguous_or_inconsistent_prefixes() { + for paths in [json!({"/api/posts":{"get":{}},"/cms/posts":{"get":{}}}), json!({"/api/posts":{"get":{}},"/cms/users":{"get":{}}})] { + let report = report_contracts(json!([{"path":"/posts","method":"GET"},{"path":"/users","method":"GET"}]), json!({"paths":paths})); + assert!(!array(&report["contractMissing"]).is_empty()); + } +} + +#[test] +fn openapi_checks_path_and_operation_query_parameters_with_refs() { + let report = report_contracts(json!([{"path":"/posts","method":"GET","queryParams":[{"name":"page"},{"name":"pageSize","aliases":["size"]},{"name":"q"},{"name":"sort"}]}]), + json!({"paths":{"/posts":{"parameters":[{"$ref":"#/components/parameters/Page"}],"get":{"parameters":[{"in":"query","name":"size"},{"in":"header","name":"q"}]}}}, + "components":{"parameters":{"Page":{"in":"query","name":"page"}}}})); + let reason = text(&report["contractMissing"][0]["reason"]); + assert!(reason.contains("queryParams missing q") && reason.contains("queryParams missing sort"), "{report}"); + assert!(!reason.contains("missing page")); +} + +#[test] +fn openapi_reads_composites_wrappers_refs_and_form_bodies() { + for media in ["multipart/form-data", "application/x-www-form-urlencoded"] { + let mut doc = json!({"paths":{"/posts":{"post":{"requestBody":{"content":{}},"responses":{"200":{"$ref":"#/components/responses/List"}}}}}, + "components":{"schemas":{"Post":{"allOf":[{"properties":{"id":{"type":"integer"}}},{"anyOf":[{"properties":{"title":{"$ref":"#/components/schemas/Title"}}},{"properties":{"publishedAt":{"type":["string","null"],"format":"date-time"}}}]}],"required":["id","title"]},"Title":{"type":"string"}}, + "responses":{"List":{"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}}}}}}}); + doc["paths"]["/posts"]["post"]["requestBody"]["content"][media] = json!({"schema":{"oneOf":[{"properties":{"title":{"type":"string"}},"required":["title"]}]}}); + let report = report_contracts(json!([{"path":"/posts","method":"POST","operation":"list","requestFields":[{"name":"title","type":"text","required":true,"nullable":false}], + "responseFields":[{"name":"id","type":"big_int","required":true,"nullable":false},{"name":"title","type":{"kind":"varchar","length":100},"required":true,"nullable":false},{"name":"publishedAt","column":"published_at","type":"timestamptz","nullable":true}]}]), doc); + assert_eq!(report["contractMissing"], json!([]), "{report}"); + } +} + +#[test] +fn drafts_emit_camel_case_names_with_erd_columns() { + let mut plan = plan("Create list sort filter pagination", json!([ + {"name":"image_url","type":"text","nullable":false}, + {"name":"created_at","type":"timestamptz","nullable":false}, + {"name":"category_id","type":"integer","nullable":false} + ])); + plan["facts"]["screens"] = json!([{"nodeId":"1:1","children":[{"type":"TEXT_INPUT","label":"image_url"}]}]); + wiring::draft(&mut plan); + for contract in array(&plan["endpointContracts"]) { + for field in array(&contract["requestFields"]).iter().chain(array(&contract["responseFields"])) { + if field["column"] == "image_url" { assert_eq!(field["name"], "imageUrl"); } + } + assert_eq!(contract["formFields"][0]["name"], "imageUrl"); + assert_eq!(contract["formFields"][0]["column"], "image_url"); + } + let create = array(&plan["endpointContracts"]).iter().find(|item| item["operation"] == "create").unwrap(); + assert_eq!(create["requestFields"][0]["name"], "imageUrl"); + assert_eq!(create["requestFields"][0]["column"], "image_url"); + let list = array(&plan["endpointContracts"]).iter().find(|item| item["operation"] == "list").unwrap(); + assert!(array(&list["queryParams"]).iter().any(|item| item["name"] == "categoryId" && item["column"] == "category_id")); +} + +#[test] +fn openapi_reports_field_casing_violations_in_touched_schemas() { + for spelling in ["image_url", "ImageUrl", "image-url"] { + let report = report_contracts(json!([{"path":"/posts","method":"GET","responseFields":[{"name":"imageUrl"}]}]), + json!({"paths":{"/posts":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{spelling:{"type":"string"}}}}}}}}}}})); + let reason = text(&report["contractMissing"][0]["reason"]); + assert!(reason.contains(&format!("casing violation field: expected imageUrl got {spelling}")), "{report}"); + assert!(reason.contains("#[serde(rename_all = \"camelCase\")]"), "{report}"); + assert_eq!(report["contractMatches"][0]["fields"], json!([])); + } + let report = report_contracts(json!([{"path":"/posts","method":"GET"}]), json!({"paths":{"/posts":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"nested":{"properties":{"created_at":{"type":"string"}}}}}}}}}}}}})); + assert!(text(&report["contractMissing"][0]["reason"]).contains("expected createdAt got created_at"), "{report}"); +} + +#[test] +fn openapi_requires_camel_case_query_parameters() { + for (name, passes) in [("page_size", false), ("pageSize", true)] { + let report = report_contracts(json!([{"path":"/posts","method":"GET","queryParams":[{"name":"pageSize"}]}]), + json!({"paths":{"/posts":{"get":{"parameters":[{"in":"query","name":name}]}}}})); + if passes { assert_eq!(report["contractMissing"], json!([]), "{report}"); } + else { assert!(text(&report["contractMissing"][0]["reason"]).contains("casing violation field: expected pageSize got page_size"), "{report}"); } + } +} + +#[test] +fn openapi_reports_type_format_nullability_and_required_mismatches() { + for (field, schema, required, fragment) in [ + (json!({"name":"value","type":"integer"}), json!({"type":"string"}), json!([]), "type mismatch value: expected integer got string"), + (json!({"name":"value","type":"date"}), json!({"type":"string","format":"date-time"}), json!([]), "expected string(date) got string(date-time)"), + (json!({"name":"value","type":"boolean","nullable":false}), json!({"type":["boolean","null"]}), json!([]), "nullable mismatch value"), + (json!({"name":"value","type":"text","required":true}), json!({"type":"string"}), json!([]), "required mismatch value") + ] { + let report = report_contracts(json!([{"path":"/posts","method":"GET","responseFields":[field]}]), json!({"paths":{"/posts":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"value":schema},"required":required}}}}}}}}})); + assert!(text(&report["contractMissing"][0]["reason"]).contains(fragment), "{report}"); + } +} diff --git a/crates/devup-mcp/src/server/project_plan/tests/feedback.rs b/crates/devup-mcp/src/server/project_plan/tests/feedback.rs new file mode 100644 index 00000000..77fe8072 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/tests/feedback.rs @@ -0,0 +1,510 @@ +use super::*; + +#[tokio::test] +async fn screen_data_contracts_survive_confirm_split_and_check_openapi_fields() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), true).await; + request.action = "draft".into(); + request.answers.clear(); + request.features = vec![Feature {id:"catalog".into(),scope:"Catalog".into(),screens:vec!["9:1".into()],acceptance:vec![],entities:vec![]}]; + request.evidence = vec![serde_json::from_value(json!({"source":"Figma","facts":{"screens":[ + {"nodeId":"9:1","name":"Post management","parts":["PostTable","DetailPanel","CreateForm","EditForm"]} + ]}})).unwrap()]; + let draft = run(&request, &policy).await.unwrap(); + assert_eq!(draft["dataMappings"][0]["candidateEntities"], json!(["post"])); + assert_eq!(array(&draft["endpointContracts"]).len(), 4); + request.action = "confirm".into(); + request.accept_recommended = true; + request.evidence.clear(); + request.detail = None; + let confirmed = run(&request, &policy).await.unwrap(); + assert_eq!(confirmed["endpointContracts"], draft["endpointContracts"]); + let create = array(&confirmed["endpointContracts"]).iter().find(|contract| contract["operation"] == "create").unwrap(); + assert_eq!(create["method"], "POST"); + assert_eq!(create["path"], "/posts"); + assert!(!array(&create["requestFields"]).iter().any(|field| field["name"] == "id")); + assert!(array(&create["requestFields"]).iter().any(|field| field["name"] == "title" && field["type"] == "text" && field["required"] == true)); + std::fs::write(dir.path().join("openapi.json"), json!({"paths":{ + "/posts":{"get":{"operationId":"listPosts","responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}}}}, + "post":{"operationId":"createPost","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}}}}}, + },"components":{"schemas":{"Post":{"type":"object","required":["id","title","body","userId"],"properties":{"id":{"type":"integer"},"title":{"type":"string"},"body":{"type":"string"},"userId":{"type":"integer"}}}}} + }).to_string()).unwrap(); + request.action = "split".into(); + let split = run(&request, &policy).await.unwrap(); + assert_eq!(array(&split["apiWiring"]["contractMissing"]).len(), 2); + let brief = std::fs::read_to_string(dir.path().join(".devup/units/catalog-domain.md")).unwrap(); + assert!(brief.contains("requestFields") && brief.contains("/posts/{id}")); + let mut doc: Value = serde_json::from_slice(&std::fs::read(dir.path().join("openapi.json")).unwrap()).unwrap(); + doc["components"]["schemas"]["Post"]["properties"].as_object_mut().unwrap().remove("title"); + std::fs::write(dir.path().join("openapi.json"), doc.to_string()).unwrap(); + request.action = "status".into(); + let status = run(&request, &policy).await.unwrap(); + assert!(array(&status["apiWiring"]["contractMissing"]).iter().any(|missing| text(&missing["reason"]).contains("title"))); +} + +#[tokio::test] +async fn split_groups_menu_and_entity_domains_and_supervises_repeated_parts() { + let dir = TestDir::new(); + let (request, policy, _) = drafted(dir.path(), true).await; + run(&request, &policy).await.unwrap(); + let mut plan = read(&request.project_root).unwrap(); + plan["features"] = json!([ + {"id":"news","scope":"News list","screens":["1:1"],"entities":["post"],"acceptance":["List news"]}, + {"id":"editor","scope":"Editor","screens":["1:2"],"entities":["post"],"acceptance":["Edit news"]}, + {"id":"history","scope":"History","screens":["2:1"],"acceptance":[]}, + {"id":"team","scope":"Team","screens":["2:2"],"acceptance":[]} + ]); + plan["facts"]["screens"] = json!([ + {"nodeId":"1:1","name":"News list","section":"news","parts":["PageHero","SubNav","SubNav"]}, + {"nodeId":"1:2","name":"Editor","section":"admin","parts":["PageHero"]}, + {"nodeId":"2:1","name":"History","menu":"company","parts":["SubNav"]}, + {"nodeId":"2:2","name":"Team","menu":"company","parts":["UniqueBlock"]} + ]); + let mut tx = OutputTransaction::new(); + units::split(&request, &mut plan, &mut tx, &policy).unwrap(); + tx.commit().unwrap(); + let workers = array(&plan["units"]).iter().filter(|u| u["stage"] == 1).collect::>(); + assert_eq!(workers.len(), 2); + assert_eq!(workers[0]["features"], json!(["news","editor"])); + assert_eq!(workers[1]["features"], json!(["history","team"])); + let shared = &plan["units"][0]; + assert_eq!(shared["sharedParts"], json!(["PageHero","SubNav"])); + assert_eq!(shared["stage"], 0); + assert_eq!(shared["owner"], "supervisor"); + assert!(std::fs::read_to_string(dir.path().join(".devup/units/shared.md")).unwrap().contains("PageHero")); + let start = ProjectPlanInput {unit_updates:vec![UnitUpdate {id:text(&workers[0]["id"]).into(),state:"running".into(),..Default::default()}],..request}; + assert!(units::update(&start, &mut plan).is_err()); +} + +#[test] +fn backend_checks_resolve_workspace_aliases_and_derive_features() { + let dir = TestDir::new(); + let api = dir.path().join("apis/api"); + std::fs::create_dir_all(api.join("src")).unwrap(); + std::fs::write(api.join("src/main.rs"), "mod models; fn main() {}").unwrap(); + let plan = json!({"state":"confirmed","modelsWorkingDirectory":"apis/api"}); + let root = dir.path().to_string_lossy(); + std::fs::write(dir.path().join("Cargo.toml"), "[workspace]\nmembers = [\"apis/api\"]\n[workspace.dependencies]\nserialization = { package = \"serde\", version = \"1\", features = [\"derive\"] }\njson = { package = \"serde_json\", version = \"1\" }\n").unwrap(); + std::fs::write(api.join("Cargo.toml"), "[dependencies]\nserialization.workspace = true\njson.workspace = true\n").unwrap(); + assert!(wiring::backend_checks(&plan, &root).is_empty()); + std::fs::write(api.join("Cargo.toml"), "[dependencies.serialization]\npackage = \"serde\"\nversion = \"1\"\n[dependencies.json]\npackage = \"serde_json\"\nversion = \"1\"\n").unwrap(); + let checks = wiring::backend_checks(&plan, &root); + assert_eq!(checks.len(), 1); + assert!(checks[0].contains("cargo add serde --features derive")); + std::fs::write(api.join("Cargo.toml"), "[dependencies]\nserde = { workspace = true }\nserde_json = { workspace = true }\n").unwrap(); + let checks = wiring::backend_checks(&plan, &root); + assert_eq!(checks.len(), 2, "unresolved workspace dependencies are missing"); + assert!(checks[0].contains("cargo add serde --features derive")); + assert!(checks[1].contains("cargo add serde_json")); + std::fs::write(api.join("Cargo.toml"), "[dependencies]\nserialization = { workspace = true, features = [\"derive\"] }\njson.workspace = true\n").unwrap(); + std::fs::write(dir.path().join("Cargo.toml"), "[workspace]\n[workspace.dependencies]\nserialization = { package = \"serde\", version = \"1\" }\njson = { package = \"serde_json\", version = \"1\" }\n").unwrap(); + assert!(wiring::backend_checks(&plan, &root).is_empty()); +} + +#[test] +fn api_contract_report_requires_bindings_and_real_http_operations() { + let dir = TestDir::new(); + std::fs::write(dir.path().join("openapi.json"), json!({"paths":{ + "/posts":{"get":{"operationId":"listPosts"},"parameters":{"operationId":"notAnOperation"}} + }}).to_string()).unwrap(); + let mut plan = json!({"features":[{"id":"news","entities":["post"]}],"apiWiring":[]}); + let root = dir.path().to_string_lossy(); + assert_eq!(wiring::report(&plan, &root)["missing"][0]["feature"], "news"); + plan["apiWiring"] = json!([{"feature":"news","operationId":"notAnOperation"}]); + assert_eq!(array(&wiring::report(&plan, &root)["missing"]).len(), 1); + plan["apiWiring"][0]["operationId"] = json!("listPosts"); + assert!(array(&wiring::report(&plan, &root)["missing"]).is_empty()); + assert_eq!(array(&wiring::report(&plan, &root)["wired"]).len(), 1); +} + +#[tokio::test] +async fn split_adds_supervisor_integration_after_all_workers() { + let dir = TestDir::new(); + let (request, policy, _) = drafted(dir.path(), false).await; + run(&request, &policy).await.unwrap(); + let mut plan = read(&request.project_root).unwrap(); + let mut tx = OutputTransaction::new(); + units::split(&request, &mut plan, &mut tx, &policy).unwrap(); + let integration = array(&plan["units"]).iter().find(|u| u["id"] == "integration").unwrap(); + assert_eq!(integration["stage"], 2); + assert_eq!(integration["owner"], "supervisor"); + assert_eq!(integration["dependencies"], json!(["posts-front"])); +} + +#[test] +fn backend_checks_require_runtime_dependencies_and_real_module() { + let dir = TestDir::new(); + std::fs::create_dir_all(dir.path().join("src")).unwrap(); + std::fs::write(dir.path().join("Cargo.toml"), "[dev-dependencies]\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\n").unwrap(); + std::fs::write(dir.path().join("src/main.rs"), "// mod models;\nfn main() {}\n").unwrap(); + let plan = json!({"state":"confirmed","modelsWorkingDirectory":"."}); + assert_eq!(wiring::backend_checks(&plan, &dir.path().to_string_lossy()).len(), 3); + std::fs::write(dir.path().join("Cargo.toml"), "[dependencies]\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\n").unwrap(); + std::fs::write(dir.path().join("src/main.rs"), "mod models;\nfn main() {}\n").unwrap(); + assert!(wiring::backend_checks(&plan, &dir.path().to_string_lossy()).is_empty()); +} + +#[tokio::test] +async fn split_scope_prioritizes_confirmed_feature_answers() { + let dir = TestDir::new(); + let (request, policy, _) = drafted(dir.path(), false).await; + run(&request, &policy).await.unwrap(); + let mut plan = read(&request.project_root).unwrap(); + plan["features"][0]["scope"] = json!("Posts with /ko prefix"); + plan["answers"]["posts.locale"] = json!("No locale prefix"); + let mut tx = OutputTransaction::new(); + units::split(&request, &mut plan, &mut tx, &policy).unwrap(); + let front = array(&plan["units"]).iter().find(|u| u["id"] == "posts-front").unwrap(); + assert_eq!(front["scopeOverrides"]["posts.locale"], "No locale prefix"); + assert_eq!(front["scopePrecedence"], json!(["answers", "decisions", "scope"])); +} + +#[tokio::test] +async fn split_briefs_contain_only_owned_route_and_worker_files() { + let dir = TestDir::new(); + let (request, policy, _) = drafted(dir.path(), false).await; + run(&request, &policy).await.unwrap(); + let mut plan = read(&request.project_root).unwrap(); + plan["features"][0]["screens"] = json!(["/posts"]); + plan["facts"]["posts.exports"] = json!(["exports/posts.tsx"]); + plan["facts"]["posts.assets"] = json!([{"path":"/posts.webp","url":"figma-bridge://current?node-id=1-2"}]); + plan["facts"]["posts.imports"] = json!(["@/components/common/PageHero"]); + plan["facts"]["protectedFiles"] = json!(["src/components/layout/Header.tsx"]); + plan["screenPlan"] = json!({"state":"confirmed","routes":[ + {"url":"/posts","nodeIds":["1:2"],"file":"src/app/posts/page.tsx"}, + {"url":"/unrelated","nodeIds":["3:4"],"file":"src/app/unrelated/page.tsx"} + ]}); + let mut tx = OutputTransaction::new(); + let mut split = request.clone(); + split.action = "split".into(); + units::split(&split, &mut plan, &mut tx, &policy).unwrap(); + tx.commit().unwrap(); + let unit = array(&plan["units"]).iter().find(|u| u["id"] == "posts-front").unwrap(); + assert_eq!(unit["contract"]["routes"].as_array().unwrap().len(), 1); + assert_eq!(unit["contract"]["exports"], json!(["exports/posts.tsx"])); + assert_eq!(unit["contract"]["imports"], json!(["@/components/common/PageHero"])); + assert_eq!(unit["contract"]["assets"][0]["path"], "/posts.webp"); + assert_eq!(unit["contract"]["protectedFiles"], json!(["src/components/layout/Header.tsx"])); + let brief = std::fs::read_to_string(dir.path().join(".devup/units/posts-front.md")).unwrap(); + assert!(brief.contains("exports/posts.tsx")); + assert!(!brief.contains("/unrelated")); +} + +#[tokio::test] +async fn project_facts_auto_fill_screen_answers_with_explicit_answer_precedence() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + std::fs::write(dir.path().join(".devup/screen-plan.json"), json!({ + "kind":"devup-screen-plan","schemaVersion":1,"planId":"screen","state":"draft", + "questions":[{"id":"siteName"},{"id":"siteUrl"}] + }).to_string()).unwrap(); + request.action = "draft".into(); + request.answers.clear(); + request.answers.insert("siteUrl".into(), json!("https://explicit.example")); + request.evidence = vec![serde_json::from_value(json!({"source":"spec","facts":{ + "siteName":"Chondrogen","siteUrl":"https://source.example" + }})).unwrap()]; + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["screenPlanForward"]["arguments"]["answers"], json!({"siteName":"Chondrogen","siteUrl":"https://explicit.example"})); + assert!(read(&request.project_root).unwrap()["answers"]["siteName"].is_null()); +} + +#[tokio::test] +async fn redraft_reports_added_changed_and_kept_records() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.action = "draft".into(); + request.answers.clear(); + request.decisions = vec![decision("keep"), decision("change")]; + run(&request, &policy).await.unwrap(); + request.decisions = vec![decision("new"), Decision {recommended:"Different".into(), ..decision("change")}]; + request.answers.insert("posts.states".into(), json!("Empty list")); + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["changeSummary"]["decisions"], json!({"added":["new"],"changed":["change"],"kept":["keep"],"removed":[]})); + assert_eq!(result["changeSummary"]["features"]["kept"], json!(["posts"])); + assert_eq!(result["changeSummary"]["answers"]["added"], json!(["posts.states"])); +} + +#[test] +fn populated_erd_choices_bind_entity_columns_and_lifecycle() { + let plan = json!({"facts":{"parts":"API"},"answers":{},"issues":[], + "features":[{"id":"news","scope":"News","acceptance":[]}], + "entities":[{"name":"post","columns":[{"name":"published_at","type":"timestamptz","nullable":true,"index":true}]}]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + let lifecycle = questions.iter().find(|q| q["id"] == "lifecycle").unwrap(); + let indexes = questions.iter().find(|q| q["id"] == "indexes").unwrap(); + assert_eq!(lifecycle["entities"], json!(["post"])); + assert_ne!(lifecycle["options"], indexes["options"]); + assert!(text(&indexes["resolve"][0]["action"]).contains("post.published_at")); + assert!(text(&lifecycle["resolve"][1]["action"]).contains("post")); +} + +#[test] +fn shared_feature_topics_are_one_question_with_concrete_choices() { + let plan = json!({"facts":{},"answers":{},"issues":[],"entities":[],"features":[ + {"id":"contact","scope":"Contact form with SMTP email","acceptance":[]}, + {"id":"signup","scope":"Signup form with SMTP email","acceptance":[]} + ]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + let forms = questions.iter().filter(|q| text(&q["id"]).ends_with(".forms")).collect::>(); + assert_eq!(forms.len(), 1); + assert_eq!(forms[0]["features"], json!(["contact", "signup"])); + let notifications = questions.iter().find(|q| text(&q["id"]).ends_with(".notifications")).unwrap(); + assert_eq!(array(¬ifications["options"]).len(), 3); + assert!(array(¬ifications["resolve"]).iter().any(|option| option["action"] == "SMTP email to a staff address")); +} + +#[tokio::test] +async fn confirm_missing_answers_returns_executable_recovery() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.answers.clear(); + let error = run(&request, &policy).await.unwrap_err(); + let details = error.details; + assert_eq!(details["nextAction"]["tool"], "devup_project_plan"); + assert!(!array(&details["missingQuestionIds"]).is_empty()); + let recovery: ProjectPlanInput = serde_json::from_value(details["nextAction"]["arguments"].clone()).unwrap(); + assert_eq!(run(&recovery, &policy).await.unwrap()["state"], "confirmed"); +} + +#[tokio::test] +async fn confirm_summary_counts_all_persisted_decisions() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.decisions = vec![decision("session-expiry"), decision("no-locale-prefix")]; + request.detail = None; + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["decisionCount"], 2); + let stored = read(&request.project_root).unwrap(); + assert!(kept(&stored["decisions"], "session-expiry")); + assert!(kept(&stored["decisions"], "no-locale-prefix")); +} + +#[tokio::test] +async fn api_without_entities_reports_erd_draft_guidance() { + let dir = TestDir::new(); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let mut request = input(dir.path(), "intake"); + request.evidence = vec![serde_json::from_value(json!({ + "source":"scope", "facts":{"parts":"front + API"} + })).unwrap()]; + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["erdDraftRequired"]["nextAction"]["arguments"]["action"], "draft"); + assert_eq!(result["erdDraftRequired"]["nextAction"]["arguments"]["planId"], result["planId"]); + assert!(text(&result["erdDraftRequired"]["reason"]).contains("API")); + request.action = "status".into(); + let result = run(&request, &policy).await.unwrap(); + assert!(result["erdDraftRequired"].is_object()); +} + +#[tokio::test] +async fn split_uses_one_shared_table_owner_and_skips_static_backend_layers() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), true).await; + request.action = "draft".into(); + request.features = vec![ + Feature {id:"layout".into(),scope:"Header and footer".into(),screens:vec!["Layout".into()],acceptance:vec![],entities:vec![]}, + Feature {id:"news".into(),scope:"Public news".into(),screens:vec!["News".into()],acceptance:vec![],entities:vec!["post".into()]}, + Feature {id:"admin-news".into(),scope:"Manage news".into(),screens:vec!["Editor".into()],acceptance:vec![],entities:vec!["post".into()]}, + ]; + run(&request, &policy).await.unwrap(); + request.action = "confirm".into(); + request.answers.clear(); + request.accept_recommended = true; + run(&request, &policy).await.unwrap(); + request.action = "split".into(); + let result = run(&request, &policy).await.unwrap(); + let units = array(&result["plan"]["units"]); + assert_eq!(units.iter().filter(|unit| unit["id"] == "model-post").count(), 1); + assert!(!units.iter().any(|unit| ["layout-api","layout-client","layout-models"].contains(&text(&unit["id"])))); + let news = units.iter().find(|unit| unit["id"] == "news-domain").unwrap(); + assert_eq!(news["dependencies"], json!(["model-post"])); + assert_eq!(news["features"], json!(["news", "admin-news"])); +} + +#[test] +fn static_features_only_ask_relevant_topics_and_sourced_answers_suppress_them() { + let mut plan = json!({"facts":{},"answers":{},"features":[ + {"id":"products","scope":"Product introduction","screens":["Products"],"acceptance":["Display descriptions"]} + ],"issues":[],"entities":[]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + assert!(!questions.iter().any(|question| ["products.forms","products.permissions","products.notifications"].contains(&text(&question["id"])))); + plan["features"][0] = json!({"id":"contact","scope":"Contact form with SMTP staff email","screens":["Contact"],"acceptance":["Validate email"]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + assert!(questions.iter().any(|question| question["id"] == "contact.forms")); + assert!(questions.iter().any(|question| question["id"] == "contact.notifications")); + plan["facts"]["contact.forms"] = json!("Required email"); + plan["facts"]["contact.notifications"] = json!("SMTP staff email"); + let questions = rounds::detail(&plan, &[]).unwrap(); + assert!(!questions.iter().any(|question| ["contact.forms","contact.notifications"].contains(&text(&question["id"])))); +} + +#[tokio::test] +async fn backend_checks_report_missing_serde_and_model_module() { + let dir = TestDir::new(); + let (request, policy, _) = drafted(dir.path(), true).await; + std::fs::create_dir_all(dir.path().join("src")).unwrap(); + std::fs::write(dir.path().join("Cargo.toml"), "[dependencies]\nsea-orm = \"2\"\n").unwrap(); + std::fs::write(dir.path().join("src/main.rs"), "fn main() {}\n").unwrap(); + let result = run(&request, &policy).await.unwrap(); + assert_eq!(array(&result["backendChecks"]).len(), 3); + std::fs::write(dir.path().join("Cargo.toml"), "[dependencies]\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\n").unwrap(); + std::fs::write(dir.path().join("src/main.rs"), "mod models;\nfn main() {}\n").unwrap(); + assert!(wiring::backend_checks(&read(&request.project_root).unwrap(), &request.project_root).is_empty()); +} + +#[test] +fn merged_screen_answers_are_forwarded_without_becoming_project_answers() { + let dir = TestDir::new(); + std::fs::create_dir_all(dir.path().join(".devup")).unwrap(); + std::fs::write(dir.path().join(".devup/screen-plan.json"), json!({ + "kind":"devup-screen-plan", "schemaVersion":1,"planId":"screen-id","state":"draft", + "questions":[{"id":"route:1:2"}] + }).to_string()).unwrap(); + let answers = BTreeMap::from([ + ("route:1:2".into(), json!("/contact")), + ("parts".into(), json!("front only")) + ]); + let (own, forwarded) = forward_screen_answers(&dir.path().to_string_lossy(), &answers, false); + assert_eq!(own, BTreeMap::from([("parts".into(), json!("front only"))])); + assert_eq!(forwarded["arguments"]["answers"], json!({"route:1:2":"/contact"})); + assert_eq!(forwarded["arguments"]["planId"], "screen-id"); + assert_eq!(forwarded["arguments"]["action"], "confirm"); +} + +#[tokio::test] +async fn figma_prerequisite_is_reported_at_intake_and_draft() { + let dir = TestDir::new(); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let mut request = input(dir.path(), "intake"); + let url = "https://www.figma.com/design/fixture/site?node-id=1-2"; + request.evidence = vec![serde_json::from_value(json!({"source":"Figma", "facts":{"figma":[url],"goal":"Company site"}})).unwrap()]; + let intake = run(&request, &policy).await.unwrap(); + assert_eq!(intake["nextAction"]["tool"], "devup_screen_plan"); + assert_eq!(intake["nextAction"]["arguments"]["url"], url); + request.plan_id = intake["planId"].as_str().map(str::to_owned); + request.action = "draft".into(); + request.features = vec![Feature {id:"home".into(),scope:"Company".into(),screens:vec!["Home".into()],acceptance:vec![],entities:vec![]}]; + let draft = run(&request, &policy).await.unwrap(); + assert!(array(&draft["blockers"]).contains(&json!("screenPlan: not confirmed"))); + assert_eq!(draft["nextAction"]["arguments"]["projectRoot"], request.project_root); +} + +#[tokio::test] +async fn confirm_reports_written_models_and_backend_commands_in_summary() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), true).await; + request.detail = None; + let confirmed = run(&request, &policy).await.unwrap(); + assert_eq!(confirmed["nextAction"]["arguments"]["action"], "split"); + assert_eq!(confirmed["writtenTo"], json!(["models/user.json", "models/post.json"])); + assert_eq!(confirmed["backendCommands"][0], "vespertide diff"); + assert_eq!(confirmed["modelsWorkingDirectory"], "."); + assert_eq!(confirmed["unitState"], "not-split"); + for path in array(&confirmed["writtenTo"]) { + assert!(dir.path().join(text(path)).is_file()); + } +} + +#[tokio::test] +async fn confirm_rejects_jsonb_before_writing_any_models() { + let dir = TestDir::new(); + let (mut request, policy, draft) = drafted(dir.path(), true).await; + request.entities = array(&draft["plan"]["entities"]).to_vec(); + request.entities[1]["columns"][1]["type"] = json!("jsonb"); + let error = run(&request, &policy).await.unwrap_err(); + assert!(error.message.contains("post.title")); + assert!(error.message.contains("jsonb")); + assert!(!dir.path().join("models").exists()); + assert_eq!(read(&request.project_root).unwrap()["state"], "draft"); +} + +#[tokio::test] +async fn draft_decisions_survive_an_answers_only_redraft() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.action = "draft".into(); + request.decisions = vec![decision("session-expiry"), decision("upload-limit")]; + run(&request, &policy).await.unwrap(); + request.decisions.clear(); + request.answers.clear(); + request.answers.insert("posts.states".into(), json!("Show an empty list")); + let draft = run(&request, &policy).await.unwrap(); + assert!(kept(&draft["plan"]["decisions"], "session-expiry")); + assert!(kept(&draft["plan"]["decisions"], "upload-limit")); +} + + +#[tokio::test] +async fn intake_discovers_korean_spec_documents_without_extracting_contents() { + let dir = TestDir::new(); + let spec = "동국대학교 콘드로젠 요구사항 정의서 ver 0.5.pdf"; + std::fs::write(dir.path().join(spec), b"pdf contents are not evidence").unwrap(); + std::fs::write(dir.path().join("unrelated.pdf"), b"not a spec").unwrap(); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let request = input(dir.path(), "intake"); + run(&request, &policy).await.unwrap(); + let saved = read(&request.project_root).unwrap(); + assert_eq!(saved["facts"]["specCandidates"], json!([spec])); + assert!(array(&saved["questions"]).iter().any(|question| question["id"] == "sources" && text(&question["question"]).contains(spec))); + assert!(array(&saved["evidence"]).is_empty()); +} + +#[tokio::test] +async fn new_feature_acceptance_and_answers_are_applied_in_one_draft() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.action = "draft".into(); + request.answers.insert("inquiry.forms".into(), json!("Require staff email")); + request.features = vec![Feature { + id:"inquiry".into(), scope:"Contact form".into(), screens:vec![], + acceptance:vec!["Validate email before submission".into()], entities:vec![], + }]; + let draft = run(&request, &policy).await.unwrap(); + assert_eq!(draft["plan"]["answers"]["inquiry.forms"], "Require staff email"); + assert!(!array(&draft["plan"]["questions"]).iter().any(|question| question["id"] == "inquiry.screens")); + assert_eq!(draft["featuresWithoutScreens"]["features"], json!(["inquiry"])); + let form = array(&draft["plan"]["questions"]).iter().find(|question| question["id"] == "inquiry.forms").unwrap(); + assert!(text(&form["question"]).contains("Validate email before submission")); +} + +#[tokio::test] +async fn status_summary_does_not_duplicate_questions_or_source_facts() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.action = "status".into(); + request.detail = None; + let summary = run(&request, &policy).await.unwrap(); + assert!(summary.get("plan").is_none()); + assert!(summary.get("questionRounds").is_none()); + assert!(summary.get("proposalMarkdown").is_none()); + assert!(summary["openQuestionCount"].as_u64().unwrap() > 0); + assert!(summary["nextAction"].is_object()); + assert!(serde_json::to_vec(&summary).unwrap().len() < 8192); +} + +#[tokio::test] +async fn draft_accepts_new_evidence_before_intake_answers_without_losing_them() { + let dir = TestDir::new(); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let mut request = input(dir.path(), "intake"); + let intake = run(&request, &policy).await.unwrap(); + request.plan_id = intake["planId"].as_str().map(str::to_owned); + request.action = "draft".into(); + request.features = vec![Feature { + id: "home".into(), scope: "Company introduction".into(), + screens: vec!["Home".into()], acceptance: vec![], entities: vec![], + }]; + request.evidence = vec![serde_json::from_value(json!({ + "source":"requirements.pdf", "facts":{"goal":"Publish the company site"} + })).unwrap()]; + let draft = run(&request, &policy).await.unwrap(); + assert_eq!(draft["state"], "draft"); + assert!(array(&draft["openQuestionIds"]).contains(&json!("parts"))); + assert_eq!(read(&request.project_root).unwrap()["facts"]["goal"], "Publish the company site"); + request.features.clear(); + request.evidence.clear(); + request.answers.insert("parts".into(), json!("front only")); + run(&request, &policy).await.unwrap(); + assert_eq!(read(&request.project_root).unwrap()["answers"]["parts"], "front only"); +} diff --git a/crates/devup-mcp/src/server/project_plan/tests/inference.rs b/crates/devup-mcp/src/server/project_plan/tests/inference.rs new file mode 100644 index 00000000..4ad83310 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/tests/inference.rs @@ -0,0 +1,39 @@ +use super::*; + +#[test] +fn split_infers_owned_exports_assets_and_shared_imports_from_app_evidence() { + let dir = TestDir::new(); + for app in ["front", "admin"] { std::fs::create_dir_all(dir.path().join(format!("apps/{app}/src/app"))).unwrap(); } + let mut plan = json!({"facts":{"parts":"front","screens":[ + {"nodeId":"1:1","parts":["Header","PageHero"],"assets":[{"assetId":"hero","path":"/hero.webp"}]}, + {"nodeId":"2:1","parts":["Header","PageHero"],"assets":[{"assetId":"unrelated"}]} + ]},"features":[{"id":"news","scope":"News","screens":["1:1"]}],"issues":[],"answers":{},"units":[], + "screenPlan":{"routes":[{"url":"/news/[id]","nodeIds":["1:1"],"app":"apps/front"},{"url":"/other","nodeIds":["2:1"],"app":"apps/admin"}]}}); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let mut tx = OutputTransaction::new(); + units::split(&input(dir.path(), "split"), &mut plan, &mut tx, &policy).unwrap(); + let contract = &array(&plan["units"]).iter().find(|unit| unit["id"] == "news-front").unwrap()["contract"]; + for path in ["apps/front/src/app/news/[id]/page.tsx","apps/front/src/components/pages/news/[id]/"] { + assert!(array(&contract["exports"]).iter().any(|item| item["path"] == path && item["inferred"] == true), "{contract}"); + } + assert_eq!(contract["assets"][0]["assetId"], "hero"); + assert_eq!(array(&contract["assets"]).len(), 1); + for path in ["apps/front/src/components/layout/Header.tsx","apps/front/src/components/common/PageHero.tsx"] { + assert!(array(&contract["imports"]).iter().any(|item| item["path"] == path && item["inferred"] == true), "{contract}"); + } + assert!(array(&contract["exports"]).iter().chain(array(&contract["assets"])).chain(array(&contract["imports"])).all(|item| item["evidence"].is_string())); +} + +#[test] +fn split_inference_honors_empty_explicit_facts_and_single_app() { + let dir = TestDir::new(); + std::fs::create_dir_all(dir.path().join("src/app")).unwrap(); + let mut plan = json!({"facts":{"parts":"front","news.assets":[],"news.imports":["explicit"]},"features":[{"id":"news","scope":"News","screens":["/news"]}],"issues":[],"answers":{},"units":[],"screenPlan":{"routes":[{"url":"/news"}]}}); + let policy = OutputPolicy::from_roots(vec![dir.path().to_path_buf()]).unwrap(); + let mut tx = OutputTransaction::new(); + units::split(&input(dir.path(), "split"), &mut plan, &mut tx, &policy).unwrap(); + let contract = &array(&plan["units"]).iter().find(|unit| unit["id"] == "news-front").unwrap()["contract"]; + assert_eq!(contract["assets"], json!([])); + assert_eq!(contract["imports"], json!(["explicit"])); + assert_eq!(contract["exports"][0]["path"], "src/app/news/page.tsx"); +} diff --git a/crates/devup-mcp/src/server/project_plan/tests/recovery.rs b/crates/devup-mcp/src/server/project_plan/tests/recovery.rs new file mode 100644 index 00000000..1df59d45 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/tests/recovery.rs @@ -0,0 +1,182 @@ +use super::*; + +#[tokio::test] +async fn scope_exclusions_survive_status_and_restart() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.action = "draft".into(); + request.answers.clear(); + request.scope_exclusions = vec![ScopeExclusion { r#ref: "posts".into(), reason: "Outside this release".into() }]; + run(&request, &policy).await.unwrap(); + request.scope_exclusions.clear(); + request.action = "status".into(); + let status = run(&request, &policy).await.unwrap(); + assert_eq!(status["plan"]["scopeExclusions"][0]["ref"], "posts"); + request.action = "intake".into(); + request.restart = true; + run(&request, &policy).await.unwrap(); + assert_eq!(read(&request.project_root).unwrap()["scopeExclusions"][0]["ref"], "posts"); +} + +#[test] +fn feature_keyed_source_facts_supply_integration_recommendations() { + let plan = json!({"facts":{},"answers":{},"entities":[],"issues":[], + "evidence":[{"source":"spec","facts":{"contact.delivery":"SMTP email"}}], + "features":[{"id":"contact","scope":"Contact","screens":[],"acceptance":[]}]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + let question = questions.iter().find(|question| question["id"] == "contact.notifications").unwrap(); + assert!(text(&question["options"][0]["label"]).starts_with("SMTP email")); + assert!(!question["sourcedDefaults"]["source"].is_null()); +} + +#[test] +fn excluded_features_do_not_supply_recommendations() { + let plan = json!({"facts":{},"answers":{},"entities":[],"issues":[], + "scopeExclusions":[{"ref":"contact","reason":"Not in release"}], + "features":[{"id":"contact","scope":"Send SMTP email","screens":[],"acceptance":[]}]}); + assert!(!rounds::detail(&plan, &[]).unwrap().iter().any(|question| text(&question["id"]).starts_with("contact."))); +} + +#[test] +fn smtp_evidence_recommends_email_instead_of_no_integration() { + let plan = json!({"facts":{},"answers":{},"entities":[],"issues":[], + "features":[{"id":"contact","scope":"Send SMTP email","screens":[],"acceptance":[]} ]}); + let questions = rounds::detail(&plan, &[]).unwrap(); + let question = questions.iter().find(|question| question["id"] == "contact.notifications").unwrap(); + assert!(text(&question["options"][0]["label"]).starts_with("SMTP email")); +} + +#[tokio::test] +async fn restart_archives_plan_screen_and_units_before_creating_new_intake() { + let dir = TestDir::new(); + let (_, policy, _) = drafted(dir.path(), false).await; + std::fs::write(dir.path().join(".devup/screen-plan.json"), "original screen").unwrap(); + std::fs::create_dir_all(dir.path().join(".devup/units")).unwrap(); + std::fs::write(dir.path().join(".devup/units/worker.md"), "original unit").unwrap(); + let mut request = input(dir.path(), "intake"); + request.restart = true; + request.detail = Some("full".into()); + let result = run(&request, &policy).await.unwrap(); + let archive = dir.path().join(text(&result["plan"]["archivedTo"])); + assert!(archive.join("project-plan.json").is_file()); + assert!(archive.join("screen-plan.json").is_file()); + assert!(archive.join("units/worker.md").is_file()); + assert!(!dir.path().join(".devup/screen-plan.json").exists()); + assert_eq!(result["state"], "intake"); +} + +#[tokio::test] +async fn existing_intake_returns_current_plan_and_status_recovery() { + let dir = TestDir::new(); + let (_, policy, draft) = drafted(dir.path(), false).await; + let request = input(dir.path(), "intake"); + let error = run(&request, &policy).await.unwrap_err(); + assert_eq!(error.details["existingPlan"]["planId"], draft["planId"]); + assert_eq!(error.details["existingPlan"]["state"], "draft"); + let recovery: ProjectPlanInput = serde_json::from_value(error.details["nextAction"]["arguments"].clone()).unwrap(); + assert_eq!(run(&recovery, &policy).await.unwrap()["planId"], draft["planId"]); +} + +#[test] +fn existing_model_diagnostics_report_type_errors_and_entity_drift() { + let dir = TestDir::new(); + std::fs::create_dir_all(dir.path().join("models")).unwrap(); + std::fs::write(dir.path().join("models/post.json"), json!({"name":"post","columns":[{"name":"body","type":"jsonb","nullable":false}]}).to_string()).unwrap(); + let report = erd::disk_report(&json!({"modelsDir":"models","entities":[]}), &dir.path().to_string_lossy()); + assert_eq!(report["entityDrift"], json!(["post"])); + assert_eq!(report["typeValidation"]["violations"][0]["got"], "jsonb"); +} + +#[test] +fn invalid_types_report_every_column_path() { + let error = erd::validate(&[json!({"name":"post","columns":[ + {"name":"first","type":"invalid_one","nullable":false}, + {"name":"second","type":"invalid_two","nullable":false} + ]})]).unwrap_err(); + assert_eq!(array(&error.details["violations"]).len(), 2); + assert_eq!(error.details["violations"][1]["path"], "/entities/0/columns/1/type"); +} + +#[test] +fn list_counts_supply_pagination_and_enum_filters() { + let mut plan = json!({"facts":{"parts":"API"},"entities":[{"name":"post","columns":[{"name":"category","type":{"kind":"enum","values":["a","b"]}}]}], + "features":[{"id":"posts","scope":"post 목록10","screens":[],"acceptance":[],"entities":["post"]}]}); + wiring::draft(&mut plan); + let queries = array(&plan["endpointContracts"][0]["queryParams"]); + for name in ["page", "pageSize", "category"] { + assert!(queries.iter().any(|query| query["name"] == name), "{name}"); + } +} + +#[test] +fn negated_korean_writes_do_not_become_operations() { + let mut plan = json!({"facts":{"parts":"API"},"entities":[{"name":"post","columns":[]}], + "features":[{"id":"posts","scope":"post 목록","screens":[],"acceptance":["등록·수정 불가", "미등록"],"entities":["post"]}]}); + wiring::draft(&mut plan); + assert_eq!(plan["dataMappings"][0]["requiredOperations"], json!(["list"])); +} + +#[tokio::test] +async fn confirm_accepts_explicit_confirmed_decision_state() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), false).await; + request.decisions = vec![serde_json::from_value(json!({"id":"scope","reason":"Approved scope","recommended":"Keep scope","state":"confirmed","kind":"scope-exclusion"})).unwrap()]; + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["plan"]["decisions"][0]["state"], "confirmed"); + assert_eq!(result["plan"]["decisions"][0]["kind"], "scope-exclusion"); +} + +#[test] +fn admin_label_does_not_imply_delete_operation() { + let mut plan = json!({"facts":{"parts":"API"},"entities":[{"name":"post","columns":[]}], + "features":[{"id":"posts","scope":"admin post list","screens":[],"acceptance":[],"entities":["post"]}]}); + wiring::draft(&mut plan); + assert!(!array(&plan["dataMappings"][0]["requiredOperations"]).contains(&json!("delete"))); +} + +#[tokio::test] +async fn explicit_nested_models_dir_selects_api_working_directory() { + let dir = TestDir::new(); + let (mut request, policy, _) = drafted(dir.path(), true).await; + request.models_dir = Some("apis/api/models".into()); + let result = run(&request, &policy).await.unwrap(); + assert_eq!(result["plan"]["modelsWorkingDirectory"], "apis/api"); +} + +#[tokio::test] +async fn confirm_refuses_to_drop_existing_columns_without_writing_models() { + let dir = TestDir::new(); + let (request, policy, draft) = drafted(dir.path(), true).await; + let mut post = array(&draft["plan"]["entities"]).iter().find(|entity| entity["name"] == "post").unwrap().clone(); + post["columns"].as_array_mut().unwrap().push(json!({"name":"category","type":"text","nullable":false})); + std::fs::create_dir_all(dir.path().join("models")).unwrap(); + let path = dir.path().join("models/post.json"); + let original = serde_json::to_vec(&post).unwrap(); + std::fs::write(&path, &original).unwrap(); + let error = run(&request, &policy).await.unwrap_err(); + assert_eq!(error.details["removedColumns"], json!([{"table":"post","column":"category"}])); + assert_eq!(error.details["decision"]["destructive"], true); + assert_eq!(std::fs::read(path).unwrap(), original); + assert!(!dir.path().join("models/user.json").exists()); + assert_eq!(read(&request.project_root).unwrap()["state"], "draft"); +} + +#[test] +fn empty_prefix_header_preserves_thirty_character_capacity() { + let name = "123456789012345678901234567890"; + assert_eq!(screen_plan::header("", name), name); + assert_eq!(screen_plan::header("Page", "Home"), "Page: Home"); +} + +#[tokio::test] +async fn stale_status_id_returns_current_plan_and_executable_recovery() { + let dir = TestDir::new(); + let (mut request, policy, draft) = drafted(dir.path(), false).await; + request.action = "status".into(); + request.plan_id = Some("stale".into()); + let error = run(&request, &policy).await.unwrap_err(); + assert_eq!(error.details["planId"], draft["planId"]); + assert_eq!(error.details["state"], "draft"); + let recovery: ProjectPlanInput = serde_json::from_value(error.details["nextAction"]["arguments"].clone()).unwrap(); + assert_eq!(run(&recovery, &policy).await.unwrap()["planId"], draft["planId"]); +} diff --git a/crates/devup-mcp/src/server/project_plan/units.rs b/crates/devup-mcp/src/server/project_plan/units.rs index 3f966e89..0466f82c 100644 --- a/crates/devup-mcp/src/server/project_plan/units.rs +++ b/crates/devup-mcp/src/server/project_plan/units.rs @@ -1,4 +1,5 @@ use super::*; +mod inference; fn unit( id: String, @@ -9,8 +10,132 @@ fn unit( ) -> Value { json!({"id":id,"scope":scope,"dependencies":dependencies,"acceptance":acceptance, "layer":layer,"state":"pending","verification":[], + "stage":if matches!(layer, "shared" | "models") {0} else {1}, "checklist":["build", "lint", "typecheck", "tests", "devup_ui_validate", "runtime/visual audit", "devup_stack_diff: zero drift"]}) } +pub(super) fn feature_entities(plan: &Value, feature: &Value) -> Vec { + if !erd::api(plan) { + return vec![]; + } + let explicit = array(&feature["entities"]) + .iter() + .map(|v| text(v).to_owned()) + .collect::>(); + if !explicit.is_empty() { + return explicit; + } + let haystack = format!( + "{} {} {} {}", + text(&feature["id"]), + text(&feature["scope"]), + feature["acceptance"], + json!(feature_screens(plan, feature)) + ) + .to_lowercase(); + array(&plan["entities"]) + .iter() + .map(|e| text(&e["name"]).to_owned()) + .filter(|name| haystack.contains(&name.to_lowercase())) + .collect() +} +fn belongs(key: &str, owner: &str) -> bool { + !key.contains('.') || key.starts_with(&format!("{owner}.")) +} +fn unit_owner(u: &Value) -> String { + let feature = text(&u["feature"]); + if feature.is_empty() { text(&u["id"]) } else { feature }.to_owned() +} +fn pick(source: &Value, owner: &str, only: &[&str]) -> Value { + let map = source.as_object().cloned().unwrap_or_default(); + Value::Object( + map.into_iter() + .filter(|(k, _)| belongs(k, owner) && (only.is_empty() || only.contains(&k.as_str()) || k.contains('.'))) + .collect(), + ) +} +fn slim_context(plan: &Value, u: &Value) -> Value { + let owner = unit_owner(u); + json!({ + "fullPlan": ".devup/project-plan.json", + "answers": pick(&plan["answers"], &owner, &[]), + "scopePrecedence": u["scopePrecedence"], + "scopeOverrides": u["scopeOverrides"], + "facts": pick(&plan["facts"], &owner, &["goal", "parts", "workType"]), + "decisions": plan["decisions"], + "backendCommands": plan["backendCommands"], + "backendNotes": plan["backendNotes"], + "modelsWorkingDirectory": plan["modelsWorkingDirectory"], + }) +} +fn unit_entities(plan: &Value, u: &Value) -> Vec { + let names = array(&u["entities"]); + array(&plan["entities"]) + .iter() + .filter(|e| names.is_empty() || names.contains(&e["name"])) + .cloned() + .collect() +} +fn slim_screens(screen: &Value, screens: &[Value]) -> Value { + if screen.is_null() { + return Value::Null; + } + let routes = array(&screen["routes"]) + .iter() + .filter(|route| screens.contains(&route["url"]) || array(&route["nodeIds"]).iter().any(|node| screens.contains(node))) + .map(|r| json!({"url": r["url"], "nodeIds": r["nodeIds"], "file": r["file"]})) + .collect::>(); + json!({"fullPlan": ".devup/screen-plan.json", "state": screen["state"], "routes": routes}) +} +pub(super) fn feature_screens(plan: &Value, feature: &Value) -> Vec { + array(&plan["facts"]["screens"]).iter() + .chain(array(&plan["screenPlan"]["screens"])) + .filter(|screen| ["nodeId", "name", "url"].iter().any(|key| { + !screen[*key].is_null() && array(&feature["screens"]).contains(&screen[*key]) + })).cloned().collect() +} +fn domain_keys(plan: &Value, feature: &Value) -> Vec { + let mut keys = feature_entities(plan, feature).iter().map(|name| format!("entity:{name}")).collect::>(); + for screen in feature_screens(plan, feature) { + for key in ["section", "menu"] { + if let Some(value) = screen[key].as_str().filter(|value| !value.is_empty()) { + keys.push(format!("{key}:{value}")); + } + } + } + keys +} +fn feature_groups(plan: &Value) -> Vec> { + let mut groups: Vec> = vec![]; + for feature in array(&plan["features"]) { + let mut group = vec![feature.clone()]; + let mut index = 0; + while index < groups.len() { + if groups[index].iter().any(|other| group.iter().any(|member| { + let keys = domain_keys(plan, member); + domain_keys(plan, other).iter().any(|key| keys.contains(key)) + })) { + let mut previous = groups.remove(index); + previous.extend(group); + group = previous; + index = 0; + } else { + index += 1; + } + } + groups.push(group); + } + groups +} +fn shared_parts(plan: &Value) -> Vec { + let mut parts: BTreeMap = BTreeMap::new(); + for screen in array(&plan["facts"]["screens"]).iter().chain(array(&plan["screenPlan"]["screens"])) { + let names = array(&screen["parts"]).iter().filter_map(Value::as_str).collect::>(); + for name in names { + *parts.entry(name.to_owned()).or_default() += 1; + } + } + parts.into_iter().filter_map(|(name, count)| (count > 1).then_some(name)).collect() +} fn safe_id(id: &str) -> bool { !id.is_empty() && id.len() <= 80 @@ -76,27 +201,55 @@ pub(super) fn split( json!(["Shared foundations verified"]), "shared", )); - for feature in array(&plan["features"]) { - let id = text(&feature["id"]); - let mut previous = "shared".to_owned(); - let layers = if erd::api(plan) { - vec!["models", "api", "client", "front"] - } else { - vec!["front"] - }; - for layer in layers { + units[0]["sharedParts"] = json!(shared_parts(plan)); + let mut model_units = std::collections::BTreeSet::new(); + for features in feature_groups(plan) { + let id = text(&features[0]["id"]); + let used = features.iter().flat_map(|feature| feature_entities(plan, feature)) + .collect::>().into_iter().collect::>(); + let mut previous = vec!["shared".to_owned()]; + if !used.is_empty() { + for name in &used { + let mid = format!("model-{name}"); + if model_units.insert(mid.clone()) { + let mut u = unit( + mid.clone(), + format!("Table {name}: model, migration and entity"), + vec!["shared".into()], + json!(["Model validates and migrates"]), + "models", + ); + u["entities"] = json!([name]); + units.push(u); + } + } + previous = used.iter().map(|n| format!("model-{n}")).collect(); + } + let layer = if used.is_empty() { "front" } else { "domain" }; + { let uid = format!("{id}-{layer}"); - units.push(unit( + let mut u = unit( uid.clone(), - format!("{}: {layer}", text(&feature["scope"])), - vec![previous], - feature["acceptance"].clone(), + features.iter().map(|feature| text(&feature["scope"])).collect::>().join("; "), + previous, + json!(features.iter().flat_map(|feature| array(&feature["acceptance"]).to_vec()).collect::>()), layer, - )); - previous = uid; + ); + u["feature"] = json!(id); + u["features"] = json!(features.iter().map(|feature| feature["id"].clone()).collect::>()); + u["screens"] = json!(features.iter().flat_map(|feature| array(&feature["screens"]).to_vec()).collect::>()); + u["entities"] = json!(used); + units.push(u); } } } + let dependencies = units.iter().filter(|unit| unit["stage"] == 1) + .map(|unit| text(&unit["id"]).to_owned()).collect(); + let mut integration = unit("integration".into(), "Supervisor integration and final verification".into(), + dependencies, json!(["All worker outputs integrated and verified"]), "integration"); + integration["stage"] = json!(2); + integration["owner"] = json!("supervisor"); + units.push(integration); validate(&units)?; let mut screen_context = plan["screenPlan"].clone(); if let Some(context) = screen_context.as_object_mut() { @@ -104,17 +257,34 @@ pub(super) fn split( context.remove(key); } } - for u in &units { + for u in &mut units { + if u["stage"] == 0 { + u["owner"] = json!("supervisor"); + } + let owner = unit_owner(u); + u["scopeOverrides"] = pick(&plan["answers"], &owner, &[]); + u["scopePrecedence"] = json!(["answers", "decisions", "scope"]); + let screens = array(&u["screens"]); + let screen_slice = slim_screens(&screen_context, screens); + let endpoints = array(&plan["endpointContracts"]).iter().filter(|contract| { + u["stage"] != 1 || array(&u["features"]).contains(&contract["feature"]) + }).cloned().collect::>(); + let contract = json!({"routes":screen_slice["routes"],"protectedFiles":plan["facts"]["protectedFiles"],"sharedParts":units_shared_parts(plan, u),"endpointContracts":endpoints}); + u["contract"] = contract; + let drafts = inference::drafts(plan, u, &input.project_root); + for field in ["exports", "assets", "imports"] { + u["contract"][field] = drafts[field].clone(); + } let brief = format!( include_str!("../text/units-split-bf50d8a5.md"), text(&u["id"]), text(&u["scope"]), u["dependencies"], text(&plan["unitQuestions"]), - json!({"answers":plan["answers"],"facts":plan["facts"],"decisions":plan["decisions"],"backendCommands":plan["backendCommands"],"modelsWorkingDirectory":plan["modelsWorkingDirectory"]}), - erd::mermaid(array(&plan["entities"])), - screen_context, - json!({"acceptance":u["acceptance"],"checklist":u["checklist"]}) + slim_context(plan, u), + erd::mermaid(&unit_entities(plan, u)), + screen_slice, + json!({"acceptance":u["acceptance"],"checklist":u["checklist"],"contract":u["contract"]}) ); stage( tx, @@ -127,9 +297,51 @@ pub(super) fn split( plan["units"] = json!(units); Ok(()) } +fn units_shared_parts(plan: &Value, unit: &Value) -> Value { + if unit["layer"] == "shared" {unit["sharedParts"].clone()} else {json!(shared_parts(plan))} +} +pub(super) fn open_requests(plan: &Value) -> Vec { + array(&plan["sharedChangeRequests"]) + .iter() + .filter(|r| r["state"] == "open") + .cloned() + .collect() +} +fn shared_request(plan: &mut Value, update: &UnitUpdate) -> Result<(), DevupError> { + let file = update.file.as_deref().unwrap_or_default().trim(); + if file.is_empty() { + return Err(invalid("shared-change-request needs file")); + } + if !plan["sharedChangeRequests"].is_array() { + plan["sharedChangeRequests"] = json!([]); + } + if update.state == "resolved" { + for r in plan["sharedChangeRequests"].as_array_mut().unwrap() { + if r["file"] == file && r["state"] == "open" { + r["state"] = json!("resolved"); + } + } + for u in plan["units"].as_array_mut().unwrap() { + if u["state"] == "merged" && u["stage"] == 1 { + u["state"] = json!("verifying"); + } + } + return Ok(()); + } + if update.reason.as_deref().is_none_or(|r| r.trim().is_empty()) { + return Err(invalid("shared-change-request needs reason")); + } + plan["sharedChangeRequests"].as_array_mut().unwrap().push(json!({ + "unit":update.id,"file":file,"reason":update.reason,"diff":update.diff,"state":"open"})); + Ok(()) +} pub(super) fn update(input: &ProjectPlanInput, plan: &mut Value) -> Result<(), DevupError> { for update in &input.unit_updates { confirmed(plan)?; + if update.kind.as_deref() == Some("shared-change-request") { + shared_request(plan, update)?; + continue; + } let current = array(&plan["units"]) .iter() .find(|u| u["id"] == update.id) diff --git a/crates/devup-mcp/src/server/project_plan/units/inference.rs b/crates/devup-mcp/src/server/project_plan/units/inference.rs new file mode 100644 index 00000000..55c64726 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/units/inference.rs @@ -0,0 +1,93 @@ +use super::*; + +fn apps(root: &Path) -> Vec { + let mut found = vec![]; + if root.join("src/app").is_dir() { found.push(String::new()); } + if let Ok(entries) = std::fs::read_dir(root.join("apps")) { + for entry in entries.filter_map(Result::ok) { + if entry.path().join("src/app").is_dir() { found.push(format!("apps/{}", entry.file_name().to_string_lossy())); } + } + } + found.sort(); + found +} + +fn app_for(route: &Value, apps: &[String]) -> Option { + for key in ["file", "app", "appRoot", "projectRoot"] { + if let Some(value) = route[key].as_str() { + let value = value.replace('\\', "/"); + if let Some(app) = apps.iter().filter(|app| !app.is_empty()).find(|app| value == **app || value.starts_with(&format!("{app}/")) || value.ends_with(&format!("/{app}")) || value.contains(&format!("/{app}/"))) { return Some(app.clone()); } + } + } + if apps.len() == 1 { apps.first().cloned() } else { None } +} + +fn annotated(path: String, evidence: &str) -> Value { + json!({"path":path,"inferred":true,"evidence":evidence}) +} + +fn owned(route: &Value, screens: &[Value]) -> bool { + screens.contains(&route["url"]) || array(&route["nodeIds"]).iter().any(|node| screens.contains(node)) +} + +fn assets(source: &Value, output: &mut Vec) { + for key in ["assets", "assetManifest"] { + let value = &source[key]; + let rows = if value.is_array() {array(value)} else {array(&value["assets"])}; + for asset in rows { + let mut asset = if asset.is_object() {asset.clone()} else {json!({"assetId":asset})}; + asset["inferred"] = json!(true); + asset["evidence"] = json!("owned screen/export asset facts"); + if !output.contains(&asset) { output.push(asset); } + } + } +} + +pub(super) fn drafts(plan: &Value, unit: &Value, root: &str) -> Value { + let apps = apps(Path::new(root)); + let mut result = json!({"exports":[],"assets":[],"imports":[]}); + let mut features = array(&unit["features"]).to_vec(); + if features.is_empty() { features.push(json!(unit_owner(unit))); } + for owner in features.iter().filter_map(Value::as_str) { + let feature = array(&plan["features"]).iter().find(|feature| feature["id"] == owner); + let screens = feature.map(|feature| array(&feature["screens"])).unwrap_or_else(|| array(&unit["screens"])); + let routes = array(&plan["screenPlan"]["routes"]).iter().filter(|route| owned(route, screens)).collect::>(); + let mut inferred = json!({"exports":[],"assets":[],"imports":[]}); + let mut imports = vec![]; + for route in &routes { + let Some(app) = app_for(route, &apps) else {continue}; + let prefix = if app.is_empty() {String::new()} else {format!("{app}/")}; + let segment = text(&route["url"]).trim_matches('/'); + let suffix = if segment.is_empty() {String::new()} else {format!("{segment}/")}; + if let Some(exports) = inferred["exports"].as_array_mut() { + exports.push(annotated(format!("{prefix}src/app/{suffix}page.tsx"), "owned route and detected App Router app")); + exports.push(annotated(format!("{prefix}src/components/pages/{suffix}"), "owned route; project page-component convention")); + } + for part in array(&unit["contract"]["sharedParts"]).iter().filter_map(Value::as_str) { + let directory = if ["header", "footer", "nav"].iter().any(|name| part.to_lowercase().contains(name)) {"layout"} else {"common"}; + let item = annotated(format!("{prefix}src/components/{directory}/{part}.tsx"), "sharedParts; project shared-component convention"); + if !imports.contains(&item) { imports.push(item); } + } + } + inferred["imports"] = json!(imports); + let mut asset_rows = vec![]; + if let Some(feature) = feature { + for screen in feature_screens(plan, feature) { assets(&screen, &mut asset_rows); } + } + for route in &routes { assets(route, &mut asset_rows); } + for export in array(&plan["facts"]["exports"]).iter().chain(array(&plan["screenPlan"]["exports"])) { + if screens.contains(&export["nodeId"]) || screens.contains(&export["screenId"]) || routes.iter().any(|route| array(&route["nodeIds"]).contains(&export["nodeId"])) { + assets(export, &mut asset_rows); + } + } + inferred["assets"] = json!(asset_rows); + for field in ["exports", "assets", "imports"] { + let explicit = plan["facts"].get(format!("{owner}.{field}")); + let values = explicit.unwrap_or(&inferred[field]); + if let Some(target) = result[field].as_array_mut() { + for value in array(values) { if !target.contains(value) { target.push(value.clone()); } } + } + } + } + result +} diff --git a/crates/devup-mcp/src/server/project_plan/wiring.rs b/crates/devup-mcp/src/server/project_plan/wiring.rs new file mode 100644 index 00000000..4bdec444 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/wiring.rs @@ -0,0 +1,171 @@ +use super::*; +mod draft; +mod contract; +mod schema; +mod names; +pub(super) use draft::draft; + + + +fn openapi_path(root: &str) -> Option { + let base = Path::new(root); + let mut candidates = vec![base.join("openapi.json")]; + if let Ok(entries) = std::fs::read_dir(base.join("apis")) { + candidates.extend( + entries + .filter_map(Result::ok) + .map(|e| e.path().join("openapi.json")), + ); + } + candidates.into_iter().find(|p| p.is_file()) +} + +fn operation_ids(path: &Path) -> std::collections::BTreeSet { + let oversized = std::fs::metadata(path).is_ok_and(|m| m.len() > 16 * 1024 * 1024); + let doc = std::fs::read(path) + .ok() + .filter(|_| !oversized) + .and_then(|bytes| serde_json::from_slice::(&bytes).ok()) + .unwrap_or(Value::Null); + doc["paths"] + .as_object() + .into_iter() + .flatten() + .flat_map(|(_, item)| item.as_object().into_iter().flatten()) + .filter(|(method, _)| matches!(method.as_str(), "get" | "post" | "put" | "patch" | "delete" | "head" | "options" | "trace")) + .filter_map(|(_, op)| op["operationId"].as_str().map(str::to_owned)) + .collect() +} + +pub(super) fn record(plan: &mut Value, wiring: &[ApiWiring]) -> Result<(), DevupError> { + for w in wiring { + let known = array(&plan["features"]); + if w.feature.trim().is_empty() || (!known.is_empty() && !known.iter().any(|f| f["id"] == w.feature)) { + return Err(invalid(format!("apiWiring names unknown feature {}", w.feature))); + } + let operation = w.operation_id.as_deref().map(str::trim).unwrap_or_default(); + if w.defer { + if w.reason.as_deref().is_none_or(|r| r.trim().is_empty()) { + return Err(invalid("A deferred API wiring needs a reason; it is reported as unfinished")); + } + } else if operation.is_empty() { + return Err(invalid("apiWiring needs operationId, or defer true with a reason")); + } + if !plan["apiWiring"].is_array() { + plan["apiWiring"] = json!([]); + } + let list = plan["apiWiring"].as_array_mut().unwrap(); + list.retain(|v| v["feature"] != w.feature); + list.push(json!(w)); + } + Ok(()) +} + +pub(super) fn report(plan: &Value, root: &str) -> Value { + let path = openapi_path(root); + let ids = path.as_deref().map(operation_ids).unwrap_or_default(); + let (mut wired, mut missing, mut deferred) = (vec![], vec![], vec![]); + for feature in array(&plan["features"]).iter().filter(|feature| !array(&feature["entities"]).is_empty() || !units::feature_entities(plan, feature).is_empty() || array(&plan["dataMappings"]).iter().any(|mapping| mapping["feature"] == feature["id"])) { + if !array(&plan["apiWiring"]).iter().any(|w| w["feature"] == feature["id"]) { + missing.push(json!({"feature":feature["id"],"operationId":null,"reason":"Data feature has no operationId binding"})); + } + } + for w in array(&plan["apiWiring"]) { + if w["defer"] == true { + deferred.push(json!({"feature":w["feature"],"reason":w["reason"]})); + } else if ids.contains(text(&w["operationId"])) { + wired.push(json!({"feature":w["feature"],"operationId":w["operationId"]})); + } else { + let why = if path.is_none() { + "openapi.json not found" + } else { + "operationId is not in openapi.json" + }; + missing.push(json!({"feature":w["feature"],"operationId":w["operationId"],"reason":why})); + } + } + let (contract_missing, contract_matches) = contract::report(plan, path.as_deref()); + json!({"openapi":path.map(|p| p.display().to_string()),"wired":wired,"missing":missing,"deferred":deferred,"contractMissing":contract_missing,"contractMatches":contract_matches}) +} + +pub(super) fn blockers(plan: &Value, root: &str) -> Vec { + let r = report(plan, root); + let missing = array(&r["missing"]).iter().map(|m| { + format!( + "apiWiring: {} -> {} ({})", + text(&m["feature"]), + text(&m["operationId"]), + text(&m["reason"]) + ) + }); + let deferred = array(&r["deferred"]).iter().map(|d| { + format!( + "unfinished: {} API wiring deferred ({})", + text(&d["feature"]), + text(&d["reason"]) + ) + }); + let contracts = array(&r["contractMissing"]).iter().map(|contract| format!("endpointContract: {} {} ({})", text(&contract["method"]), text(&contract["path"]), text(&contract["reason"]))); + missing.chain(deferred).chain(contracts).collect() +} + +fn cargo_document(path: &Path) -> Option { + std::fs::read_to_string(path).ok()?.parse().ok() +} + +fn workspace_document(base: &Path, cargo: &toml_edit::DocumentMut) -> Option { + if let Some(workspace) = cargo.get("package").and_then(|p| p.get("workspace")).and_then(toml_edit::Item::as_str) { + return cargo_document(&base.join(workspace).join("Cargo.toml")); + } + base.ancestors().find_map(|ancestor| { + cargo_document(&ancestor.join("Cargo.toml")).filter(|doc| doc.get("workspace").is_some()) + }) +} + +fn has_derive(dep: &toml_edit::Item) -> bool { + dep.get("features").and_then(toml_edit::Item::as_array) + .is_some_and(|features| features.iter().any(|feature| feature.as_str() == Some("derive"))) +} + +fn declares(cargo: &toml_edit::DocumentMut, workspace: Option<&toml_edit::DocumentMut>, name: &str) -> bool { + let mut tables = vec![cargo.get("dependencies")]; + if let Some(targets) = cargo.get("target").and_then(toml_edit::Item::as_table_like) { + tables.extend(targets.iter().map(|(_, target)| target.get("dependencies"))); + } + tables.into_iter().flatten().filter_map(toml_edit::Item::as_table_like) + .flat_map(|table| table.iter()).any(|(key, dep)| { + let inherited = dep.get("workspace").and_then(toml_edit::Item::as_bool) == Some(true); + let resolved = if inherited { + workspace.and_then(|doc| doc.get("workspace")?.get("dependencies")?.get(key)) + } else { Some(dep) }; + resolved.is_some_and(|resolved| { + let package = resolved.get("package").and_then(toml_edit::Item::as_str).unwrap_or(key); + package == name && (name != "serde" || has_derive(dep) || has_derive(resolved)) + }) + }) +} + +pub(super) fn backend_checks(plan: &Value, root: &str) -> Vec { + let dir = text(&plan["modelsWorkingDirectory"]); + if plan["state"] != "confirmed" || dir.is_empty() { + return vec![]; + } + let base = Path::new(root).join(dir); + let mut found = vec![]; + if let Some(cargo) = cargo_document(&base.join("Cargo.toml")) { + let workspace = workspace_document(&base, &cargo); + for (dep, command) in [("serde", "cargo add serde --features derive"), ("serde_json", "cargo add serde_json")] { + if !declares(&cargo, workspace.as_ref(), dep) { + found.push(format!("{dir}/Cargo.toml lacks {dep}{}; run `{command}` in {dir}", if dep == "serde" { " with derive" } else { "" })); + } + } + } else if base.join("Cargo.toml").is_file() { + found.push(format!("{dir}/Cargo.toml cannot be parsed as TOML; fix the manifest before checking exported entity dependencies")); + } + if let Ok(main) = std::fs::read_to_string(base.join("src/main.rs")) + && !syn::parse_file(&main).is_ok_and(|file| file.items.iter().any(|item| matches!(item, syn::Item::Mod(module) if module.ident == "models"))) + { + found.push(format!("{dir}/src/main.rs lacks `mod models;`; export does not wire src/models")); + } + found +} diff --git a/crates/devup-mcp/src/server/project_plan/wiring/contract.rs b/crates/devup-mcp/src/server/project_plan/wiring/contract.rs new file mode 100644 index 00000000..5f691bda --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/wiring/contract.rs @@ -0,0 +1,75 @@ +use super::*; + +fn suffix_prefix(actual: &str, expected: &str) -> Option { + let actual = actual.trim_matches('/').split('/').collect::>(); + let expected = expected.trim_matches('/').split('/').collect::>(); + if actual.len() < expected.len() { return None; } + let offset = actual.len() - expected.len(); + actual[offset..].iter().zip(expected).all(|(left, right)| left == &right || (left.starts_with('{') && left.ends_with('}') && right.starts_with('{') && right.ends_with('}'))) + .then(|| if offset == 0 {String::new()} else {format!("/{}", actual[..offset].join("/"))}) +} + +fn candidates<'a>(doc: &'a Value, contract: &Value) -> Vec<(&'a str, &'a Value, String)> { + let method = text(&contract["method"]).to_lowercase(); + let mut found = doc["paths"].as_object().into_iter().flatten().filter_map(|(path, item)| { + let prefix = suffix_prefix(path, text(&contract["path"]))?; + item[&method].is_object().then_some((path.as_str(), item, prefix)) + }).collect::>(); + if found.iter().any(|(_, _, prefix)| prefix.is_empty()) { found.retain(|(_, _, prefix)| prefix.is_empty()); } + found +} + +pub(super) fn report(plan: &Value, path: Option<&Path>) -> (Vec, Vec) { + let Some(path) = path else {return (vec![], vec![])}; + let doc = std::fs::read(path).ok().and_then(|bytes| serde_json::from_slice::(&bytes).ok()).unwrap_or(Value::Null); + let contracts = array(&plan["endpointContracts"]); + let prefixes = contracts.iter().map(|contract| candidates(&doc, contract).into_iter().map(|(_, _, prefix)| prefix).collect::>()).filter(|prefixes| !prefixes.is_empty()).reduce(|left, right| left.intersection(&right).cloned().collect()).unwrap_or_default(); + let (mut missing, mut matched) = (vec![], vec![]); + for contract in contracts { + let found = candidates(&doc, contract).into_iter().filter(|(_, _, prefix)| prefix.is_empty() || prefixes.len() == 1 && prefixes.contains(prefix)).collect::>(); + let mut reasons = vec![]; + let mut field_matches = vec![]; + let mut path_match = Value::Null; + if let [(path, item, prefix)] = found.as_slice() { + let operation = &item[text(&contract["method"]).to_lowercase()]; + let request = schema::fields(&doc, schema::body_schema(&doc, &operation["requestBody"]), false, 0); + reasons.extend(names::schema_violations(&doc, schema::body_schema(&doc, &operation["requestBody"]), 0)); + let mut response = BTreeMap::::new(); + for (status, body) in operation["responses"].as_object().into_iter().flatten().filter(|(status, _)| status.starts_with('2')) { + let _ = status; + reasons.extend(names::schema_violations(&doc, schema::body_schema(&doc, body), 0)); + for (name, field) in schema::fields(&doc, schema::body_schema(&doc, body), contract["operation"] == "list", 0) { + let entry = response.entry(name).or_default(); + entry.schemas.extend(field.schemas); + entry.required |= field.required; + } + } + for (key, fields) in [("requestFields", request), ("responseFields", response)] { + for field in array(&contract[key]) { + let name = text(&field["name"]); + if let Some(reason) = names::violation(name) { reasons.push(reason); } + if let Some((spelling, actual)) = fields.get_key_value(name) { + field_matches.push(json!({"kind":key,"name":name,"openapiName":spelling})); + reasons.extend(schema::compare(&doc, field, actual)); + } else { reasons.push(format!("{key} missing {name}")); } + } + } + let queries = array(&item["parameters"]).iter().chain(array(&operation["parameters"])).map(|parameter| schema::resolve(&doc, parameter)).filter(|parameter| parameter["in"] == "query").collect::>(); + for query in &queries { + if let Some(reason) = names::violation(text(&query["name"])) { reasons.push(reason); } + reasons.extend(names::schema_violations(&doc, &query["schema"], 0)); + } + for query in array(&contract["queryParams"]) { + let name = text(&query["name"]); + if let Some(reason) = names::violation(name) { reasons.push(reason); } + if let Some(actual) = queries.iter().find(|actual| actual["name"] == name || array(&query["aliases"]).contains(&actual["name"]) && names::violation(text(&actual["name"])).is_none()) { + field_matches.push(json!({"kind":"queryParams","name":name,"matchedName":actual["name"]})); + } else { reasons.push(format!("queryParams missing {name}")); } + } + path_match = json!({"feature":contract["feature"],"method":contract["method"],"path":contract["path"],"openapiPath":path,"prefix":prefix,"fields":field_matches}); + } else { reasons.push("HTTP method/path absent or ambiguous in openapi.json".to_owned()); } + if !reasons.is_empty() { missing.push(json!({"feature":contract["feature"],"method":contract["method"],"path":contract["path"],"reason":reasons.join("; ")})); } + if !path_match.is_null() { matched.push(path_match); } + } + (missing, matched) +} diff --git a/crates/devup-mcp/src/server/project_plan/wiring/draft.rs b/crates/devup-mcp/src/server/project_plan/wiring/draft.rs new file mode 100644 index 00000000..978b0a83 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/wiring/draft.rs @@ -0,0 +1,151 @@ +use super::*; + +pub(super) fn normalized(name: &str) -> String { + name.chars().filter(|ch| !matches!(ch, '_' | '-')).flat_map(char::to_lowercase).collect() +} + +fn resource(name: &str) -> String { + let name = name.replace('_', "-"); + let word = name.rsplit('-').next().unwrap_or(&name); + if matches!(word, "news" | "series" | "species") || (word.ends_with('s') && !word.ends_with("ss") && !word.ends_with("us")) { + name + } else if word.ends_with('y') && word.chars().rev().nth(1).is_some_and(|ch| !"aeiou".contains(ch)) { + format!("{}ies", name.strip_suffix('y').unwrap_or(&name)) + } else if ["s", "x", "z", "ch", "sh"].iter().any(|suffix| word.ends_with(suffix)) { + format!("{name}es") + } else { format!("{name}s") } +} + +fn contains(evidence: &str, words: &[&str]) -> bool { + words.iter().any(|word| evidence.contains(word)) +} + +fn structure(node: &Value, counts: &mut BTreeMap, labels: &mut Vec) { + if let Some(name) = node.as_str() { + *counts.entry(name.to_owned()).or_default() += 1; + if contains(&normalized(name), &["input", "textfield", "textarea", "select", "checkbox", "radio"]) { labels.push(name.to_owned()); } + return; + } + let name = node["componentName"].as_str().or_else(|| node["name"].as_str()).unwrap_or_default(); + if !name.is_empty() { + *counts.entry(name.to_owned()).or_default() += node["count"].as_u64().or_else(|| node["instanceCount"].as_u64()).unwrap_or(1); + } + let kind = format!("{} {} {}", name, text(&node["type"]), text(&node["nodeType"])); + if contains(&normalized(&kind), &["input", "textfield", "textarea", "select", "checkbox", "radio"]) { + labels.push(node["label"].as_str().or_else(|| node["fieldName"].as_str()).unwrap_or(name).to_owned()); + } + for key in ["parts", "children", "nodes", "instances"] { + for child in array(&node[key]) { structure(child, counts, labels); } + } + for key in ["repeatedInstances", "instanceCounts"] { + for (name, count) in node[key].as_object().into_iter().flatten() { + *counts.entry(name.clone()).or_default() += count.as_u64().unwrap_or(0); + } + } +} + +fn rules(column: &Value) -> Value { + let name = text(&column["name"]).to_lowercase(); + let mut rules = json!({"required":column["nullable"] == false && column["default"].is_null()}); + if let Some(length) = column["type"]["length"].as_u64().or_else(|| column["length"].as_u64()) { + rules["maxLength"] = json!(length); + } else if let Some(length) = text(&column["type"]).strip_prefix("varchar(").and_then(|value| value.strip_suffix(')')).and_then(|value| value.parse::().ok()) { + rules["maxLength"] = json!(length); + } + for (format, words) in [("email", vec!["email"]), ("phone", vec!["phone", "tel"]), ("url", vec!["url", "link"])] { + if contains(&name, &words) { rules["format"] = json!(format); break; } + } + if matches!(text(&column["type"]), "boolean" | "bool") && contains(&name, &["agree", "consent", "privacy", "동의"]) { + rules["const"] = json!(true); + } + if column["type"]["kind"] == "enum" { rules["enum"] = column["type"]["values"].clone(); } + rules +} + +fn queries(entity: &Value, evidence: &str) -> Vec { + let mut queries = vec![]; + if contains(evidence, &["pagination", "페이지", "page number"]) + || evidence.split("목록").skip(1).any(|suffix| suffix.starts_with(|character: char| character.is_ascii_digit())) { + queries.extend([json!({"name":"page","type":"integer"}), json!({"name":"pageSize","type":"integer","aliases":["size"]})]); + } + if contains(evidence, &["sort", "정렬"]) { + let keys = array(&entity["columns"]).iter().filter(|column| { + let kind = column["type"].as_str().or_else(|| column["type"]["kind"].as_str()).unwrap_or_default(); + contains(kind, &["int", "float", "real", "double", "decimal", "numeric", "date", "time"]) || text(&column["name"]).contains("title") + }).map(|column| json!({"name":names::camel_case(text(&column["name"])),"column":column["name"]})).collect::>(); + queries.push(json!({"name":"sort","type":"string","allowedKeys":keys.iter().map(|key| key["name"].clone()).collect::>(),"columns":keys})); + } + if contains(evidence, &["search", "검색"]) { queries.push(json!({"name":"q","type":"string"})); } + if contains(evidence, &["filter", "category", "필터", "카테고리", "탭"]) + || array(&entity["columns"]).iter().any(|column| column["type"]["kind"] == "enum") { + for column in array(&entity["columns"]) { + let name = text(&column["name"]); + if column["type"]["kind"] == "enum" || name.ends_with("_id") || contains(name, &["category", "카테고리"]) { + queries.push(json!({"name":names::camel_case(name),"column":name,"type":column["type"],"values":column["type"]["values"]})); + } + } + } + queries +} + +pub(in crate::server::project_plan) fn draft(plan: &mut Value) { + if !erd::api(plan) { return; } + let (mut mappings, mut contracts) = (vec![], vec![]); + for feature in array(&plan["features"]) { + let screens = units::feature_screens(plan, feature); + let evidence = format!("{} {} {} {}", feature["scope"], feature["screens"], feature["acceptance"], json!(screens)).to_lowercase(); + let operation_text = evidence.replace("등록·수정 불가", "").replace("미등록", ""); + let mut driven = BTreeMap::<&str, Vec>::new(); + for (op, words) in [ + ("list", vec!["list", "table", "search", "filter", "pagination", "목록", "검색", "표"]), + ("get", vec!["detail", "상세"]), + ("create", vec!["form", "create", "signup", "input", "textarea", "폼", "등록", "문의"]), + ("update", vec!["edit", "update", "수정"]), + ("delete", vec!["delete", "remove", "삭제"]), + ] { + for word in words { if operation_text.contains(word) { driven.entry(op).or_default().push(format!("keyword: {word}")); } } + } + let (mut counts, mut labels) = (BTreeMap::new(), vec![]); + for screen in &screens { + structure(screen, &mut counts, &mut labels); + for key in ["url", "route", "routePath", "proposedRoute"] { + if text(&screen[key]).split('/').any(|segment| segment.starts_with('[') && segment.ends_with(']')) { + driven.entry("get").or_default().push(format!("dynamic route: {}", text(&screen[key]))); + } + } + } + for route in array(&feature["screens"]).iter().filter_map(Value::as_str) { + if route.split('/').any(|segment| segment.starts_with('[') && segment.ends_with(']')) { driven.entry("get").or_default().push(format!("dynamic route: {route}")); } + } + for (name, count) in counts.iter().filter(|(_, count)| **count >= 3) { + driven.entry("list").or_default().push(format!("repeated component: {name} ({count})")); + } + if !labels.is_empty() { driven.entry("create").or_default().push(format!("form controls: {}", labels.join(", "))); } + let entities = units::feature_entities(plan, feature); + if driven.is_empty() && entities.is_empty() { continue; } + if driven.is_empty() { driven.insert("list", vec!["entity mapping".into()]); } + let operations = driven.keys().copied().collect::>(); + let columns = array(&plan["entities"]).iter().filter(|entity| entities.contains(&text(&entity["name"]).to_owned())).flat_map(|entity| array(&entity["columns"])).collect::>(); + let form_fields = labels.iter().map(|label| { + let column = columns.iter().find(|column| normalized(text(&column["name"])) == normalized(label)); + json!({"label":label,"name":names::camel_case(column.map(|column| text(&column["name"])).unwrap_or(label)),"column":column.map(|column| column["name"].clone()),"status":if column.is_some() {"matched"} else {"unmatched"}}) + }).collect::>(); + mappings.push(json!({"feature":feature["id"],"screens":feature["screens"],"candidateEntities":entities,"requiredOperations":operations,"operationEvidence":driven,"formFields":form_fields,"status":"draft"})); + for name in entities { + let Some(entity) = array(&plan["entities"]).iter().find(|entity| entity["name"] == name) else {continue}; + for op in &operations { + let method = match *op {"create" => "POST", "update" => "PATCH", "delete" => "DELETE", _ => "GET"}; + let resource = resource(&name); + let path = if matches!(*op, "get" | "update" | "delete") {format!("/{resource}/{{id}}") } else {format!("/{resource}")}; + let fields = array(&entity["columns"]).iter().map(|column| json!({"name":names::camel_case(text(&column["name"])),"column":column["name"],"type":column["type"],"nullable":column["nullable"],"required":column["nullable"] == false})).collect::>(); + let request_fields = if matches!(*op, "create" | "update") { + array(&entity["columns"]).iter().filter(|column| column["primary_key"].is_null() && column["default"].is_null()).map(|column| json!({"name":names::camel_case(text(&column["name"])),"column":column["name"],"type":column["type"],"nullable":column["nullable"],"required":*op == "create" && column["nullable"] == false,"rules":rules(column)})).collect::>() + } else {vec![]}; + contracts.push(json!({"feature":feature["id"],"entity":name,"operation":op,"method":method,"path":path,"queryParams":if *op == "list" {queries(entity, &evidence)} else {vec![]}, + "operationEvidence":driven[op],"formFields":form_fields,"requestFields":request_fields,"responseFields":if *op == "delete" {vec![]} else {fields},"status":"draft","pathEvidence":"entity-name convention; confirm API path before implementation"})); + } + } + } + plan["dataMappings"] = json!(mappings); + plan["endpointContracts"] = json!(contracts); +} diff --git a/crates/devup-mcp/src/server/project_plan/wiring/names.rs b/crates/devup-mcp/src/server/project_plan/wiring/names.rs new file mode 100644 index 00000000..c2645da2 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/wiring/names.rs @@ -0,0 +1,41 @@ +use super::*; + +pub(super) fn camel_case(name: &str) -> String { + let chars = name.chars().collect::>(); + let mut result = String::new(); + let mut uppercase = false; + for (index, ch) in chars.iter().copied().enumerate() { + if ch == '_' || ch == '-' || ch.is_whitespace() { + uppercase = !result.is_empty(); + continue; + } + let boundary = ch.is_uppercase() && index > 0 && + (chars[index - 1].is_lowercase() || chars.get(index + 1).is_some_and(|next| next.is_lowercase())); + if !result.is_empty() && (uppercase || boundary) { result.extend(ch.to_uppercase()); } + else { result.extend(ch.to_lowercase()); } + uppercase = false; + } + result +} + +pub(super) fn violation(name: &str) -> Option { + let expected = camel_case(name); + (name != expected).then(|| format!("casing violation field: expected {expected} got {name}; vespera request/response structs need #[serde(rename_all = \"camelCase\")]") ) +} + +pub(super) fn schema_violations(doc: &Value, schema: &Value, depth: usize) -> Vec { + if depth > 16 { return vec![]; } + let schema = schema::resolve(doc, schema); + let mut reasons = vec![]; + for (name, property) in schema["properties"].as_object().into_iter().flatten() { + if let Some(reason) = violation(name) { reasons.push(reason); } + reasons.extend(schema_violations(doc, property, depth + 1)); + } + for key in ["items", "additionalProperties"] { + if schema[key].is_object() { reasons.extend(schema_violations(doc, &schema[key], depth + 1)); } + } + for key in ["allOf", "oneOf", "anyOf"] { + for part in array(&schema[key]) { reasons.extend(schema_violations(doc, part, depth + 1)); } + } + reasons +} diff --git a/crates/devup-mcp/src/server/project_plan/wiring/schema.rs b/crates/devup-mcp/src/server/project_plan/wiring/schema.rs new file mode 100644 index 00000000..512d6956 --- /dev/null +++ b/crates/devup-mcp/src/server/project_plan/wiring/schema.rs @@ -0,0 +1,100 @@ +use super::*; + +pub(super) fn resolve<'a>(doc: &'a Value, value: &'a Value) -> &'a Value { + let mut current = value; + for _ in 0..16 { + let Some(reference) = current["$ref"].as_str().and_then(|reference| reference.strip_prefix('#')) else { break }; + let Some(target) = doc.pointer(reference) else { break }; + current = target; + } + current +} + +pub(super) fn body_schema<'a>(doc: &'a Value, body: &'a Value) -> &'a Value { + let content = &resolve(doc, body)["content"]; + ["application/json", "multipart/form-data", "application/x-www-form-urlencoded"].into_iter() + .find_map(|media| content.get(media).map(|value| &value["schema"])) + .unwrap_or(&Value::Null) +} + +#[derive(Default)] +pub(super) struct Field { + pub schemas: Vec, + pub required: bool, +} + +pub(super) fn fields(doc: &Value, schema: &Value, list: bool, depth: usize) -> BTreeMap { + if depth > 16 { return BTreeMap::new(); } + let schema = resolve(doc, schema); + if schema["type"] == "array" { return fields(doc, &schema["items"], false, depth + 1); } + let mut result = BTreeMap::::new(); + for (name, property) in schema["properties"].as_object().into_iter().flatten() { + let target = resolve(doc, property); + if list && ["items", "data", "results"].contains(&name.as_str()) { + let wrapped = fields(doc, target, true, depth + 1); + if !wrapped.is_empty() { result.extend(wrapped); continue; } + } + result.insert(name.clone(), Field {schemas:vec![target.clone()], required:array(&schema["required"]).contains(&json!(name))}); + } + for key in ["allOf", "oneOf", "anyOf"] { + for part in array(&schema[key]) { + for (name, field) in fields(doc, part, list, depth + 1) { + let entry = result.entry(name).or_default(); + entry.schemas.extend(field.schemas); + entry.required |= field.required; + } + } + } + for name in array(&schema["required"]).iter().filter_map(Value::as_str) { + if let Some(field) = result.get_mut(name) { field.required = true; } + } + result +} + +fn variants(doc: &Value, schema: &Value, depth: usize) -> Vec<(String, String)> { + if depth > 16 { return vec![]; } + let schema = resolve(doc, schema); + let mut result = vec![]; + let types = schema["type"].as_str().map(|kind| vec![kind]).unwrap_or_else(|| array(&schema["type"]).iter().filter_map(Value::as_str).collect()); + for kind in types { result.push((kind.to_owned(), text(&schema["format"]).to_owned())); } + if schema["nullable"] == true { result.push(("null".into(), String::new())); } + for key in ["allOf", "oneOf", "anyOf"] { + for part in array(&schema[key]) { result.extend(variants(doc, part, depth + 1)); } + } + result +} + +fn expected(field: &Value) -> (&str, &str) { + let kind = field["type"].as_str().or_else(|| field["type"]["kind"].as_str()).unwrap_or_default(); + match kind { + "integer" | "bigint" | "big_int" | "small_int" | "smallint" => ("integer", ""), + "float" | "real" | "double_precision" | "decimal" | "numeric" => ("number", ""), + "boolean" | "bool" => ("boolean", ""), + "date" => ("string", "date"), + "timestamp" | "timestamptz" | "datetime" => ("string", "date-time"), + "json" => ("object", ""), + "enum" => if array(&field["type"]["values"]).iter().any(|value| value["value"].is_number()) { ("integer", "") } else { ("string", "") }, + "text" | "varchar" | "char" | "uuid" | "string" => ("string", ""), + other if other.starts_with("varchar(") => ("string", ""), + _ => ("", ""), + } +} + +pub(super) fn compare(doc: &Value, field: &Value, actual: &Field) -> Vec { + let name = text(&field["name"]); + let (kind, format) = expected(field); + let types = actual.schemas.iter().flat_map(|schema| variants(doc, schema, 0)).collect::>(); + let mut reasons = vec![]; + if !kind.is_empty() && !types.is_empty() && !types.iter().any(|(found, found_format)| found == kind && (format.is_empty() || format == found_format)) { + let display = |kind: &str, format: &str| if format.is_empty() {kind.to_owned()} else {format!("{kind}({format})")}; + reasons.push(format!("type mismatch {name}: expected {} got {}", display(kind, format), types.iter().map(|(kind, format)| display(kind, format)).collect::>().join("|"))); + } + if let Some(nullable) = field["nullable"].as_bool() + && !types.is_empty() && nullable != types.iter().any(|(kind, _)| kind == "null") { + reasons.push(format!("nullable mismatch {name}: expected {nullable}")); + } + if let Some(required) = field["required"].as_bool() && required != actual.required { + reasons.push(format!("required mismatch {name}: expected {required} got {}", actual.required)); + } + reasons +} diff --git a/crates/devup-mcp/src/server/projection/asset_reference_names.rs b/crates/devup-mcp/src/server/projection/asset_reference_names.rs index fcc15f8f..6a2cc56e 100644 --- a/crates/devup-mcp/src/server/projection/asset_reference_names.rs +++ b/crates/devup-mcp/src/server/projection/asset_reference_names.rs @@ -16,8 +16,14 @@ fn with_host_safe_asset_paths(code: &str) -> String { }; let after = at + prefix.len(); safe.push_str(&rest[..after]); + let opener = rest[..at].chars().last().or_else(|| safe.chars().last()); + let terminators: &[char] = match opener { + Some('"') => &['"'], + Some('\'') => &['\''], + _ => &['"', '\'', ')'], + }; let mut end = rest[after..] - .find(['"', '\'', ')']) + .find(terminators) .map_or(rest.len(), |offset| after + offset); // srcSet contains several URLs followed by numeric density/width // descriptors. Keep each URL separate while retaining spaces inside diff --git a/crates/devup-mcp/src/server/projection/completion.rs b/crates/devup-mcp/src/server/projection/completion.rs index 5381b69d..697d939f 100644 --- a/crates/devup-mcp/src/server/projection/completion.rs +++ b/crates/devup-mcp/src/server/projection/completion.rs @@ -19,11 +19,13 @@ pub(super) async fn complete_operation( artifact_store, ) .await?; + response["artifactId"] = json!(artifact.artifact_id); if let Some(source) = response .get_mut("source") .filter(|source| source.is_object()) { attach_bridge_source(source, payload); + attach_node_page(source, payload); } // What this export wrote for each marked node, so the audit can tell // code drift from a converter bug later. @@ -97,10 +99,68 @@ fn attach_bridge_source(source: &mut Value, payload: &CollectedPayload) { } } source["fileName"] = json!(served.file_name); - source["pageName"] = json!(served.page_name); + // The page the user has open in Figma - not the page the node lives on. + // `nodePage` (when the snapshot reaches it) says where the node is. + source["viewerPageName"] = json!(served.page_name); source["bridgeReads"] = json!(served.reads); } +/// The page the requested node actually belongs to, walked up from the +/// snapshot's parent links, with a note when it is not the page the viewer has +/// open or when its name says trash/archive/draft. +fn attach_node_page(source: &mut Value, payload: &CollectedPayload) { + let Some(start) = payload.target.node_id.as_deref() else { + return; + }; + if let Some(reason) = devup_mcp_figma::node_excluded_reason(&payload.snapshot, start) { + source["excluded"] = json!(reason); + } + let mut current = Some(start.to_owned()); + let mut visited = std::collections::BTreeSet::new(); + let mut page: Option<(String, String)> = None; + while let Some(id) = current { + if !visited.insert(id.clone()) { + break; + } + let Some(node) = payload.snapshot.nodes.get(&id) else { + break; + }; + if node.node_type == "PAGE" { + page = Some(( + node.id.clone(), + node.typed_view().name().unwrap_or_default().to_owned(), + )); + break; + } + current = node.typed_view().string("parentId").map(str::to_owned); + } + let Some((id, name)) = page else { + return; + }; + source["nodePage"] = json!({"id": id, "name": name}); + let lowered = name.to_lowercase(); + if let Some(keyword) = [ + "trash", "archive", "draft", "copy", "pdf", "export", "휴지통", "보관", "초안", "복사", + "저장용", "출력", + ] + .iter() + .find(|keyword| lowered.contains(*keyword)) + { + source["nodePage"]["excluded"] = json!(format!("{keyword} ({name})")); + source["nodePageNote"] = json!(format!( + "The node lives on the page \"{name}\", whose name marks it as trash, archive or draft." + )); + } else if source + .get("viewerPageName") + .and_then(Value::as_str) + .is_some_and(|viewer| viewer != name) + { + source["nodePageNote"] = json!(format!( + "viewerPageName is the page open in Figma; the node itself lives on \"{name}\"." + )); + } +} + /// The file key an answer may state: the plugin's own report when the bridge /// read the file, and the requested key when Figma itself served it. fn vouched_file_key(payload: &CollectedPayload) -> Option<&str> { @@ -110,3 +170,90 @@ fn vouched_file_key(payload: &CollectedPayload) -> Option<&str> { } } + +#[cfg(test)] +mod node_page_tests { + use super::*; + use devup_mcp_figma::{ + CollectionScope, CollectionStats, FigmaTarget, PayloadCompleteness, RawNode, Snapshot, + }; + + fn payload_on_page(page_name: &str) -> CollectedPayload { + let nodes = [("0:1", "PAGE", page_name, None), ("1:1", "FRAME", "Home", Some("0:1"))] + .into_iter() + .map(|(id, node_type, name, parent)| { + ( + id.to_owned(), + RawNode { + id: id.to_owned(), + node_type: node_type.to_owned(), + fields: serde_json::from_value(json!({"name": name, "parentId": parent})) + .unwrap(), + extra: Default::default(), + field_errors: Default::default(), + }, + ) + }) + .collect(); + CollectedPayload { + target: FigmaTarget { + file_key: "k".into(), + node_id: Some("1:1".into()), + branch_key: None, + }, + scope: CollectionScope::Node, + metadata: json!({}), + snapshot: Snapshot { + file_key: "k".into(), + version: None, + roots: vec!["0:1".into()], + nodes, + diagnostics: vec![], + }, + variables: None, + styles: None, + completeness: PayloadCompleteness::ResolvedValuesOnly, + source_version: None, + stats: CollectionStats::default(), + assets: vec![], + reference_png: None, + failures: vec![], + } + } + + #[test] + fn a_trash_page_is_named_and_flagged() { + let mut source = json!({"viewerPageName": "Trash old"}); + attach_node_page(&mut source, &payload_on_page("Trash old")); + assert_eq!( + source["nodePage"], + json!({"id": "0:1", "name": "Trash old", "excluded": "trash (Trash old)"}) + ); + assert!(source["nodePageNote"].as_str().unwrap().contains("trash, archive or draft")); + } + + #[test] + fn a_trash_page_sets_the_excluded_marker_on_node_page() { + let mut source = json!({}); + attach_node_page(&mut source, &payload_on_page("PDF 저장용")); + assert!(source["nodePage"]["excluded"].as_str().unwrap().contains("pdf")); + let mut source = json!({}); + attach_node_page(&mut source, &payload_on_page("Screens")); + assert!(source["nodePage"].get("excluded").is_none()); + } + + #[test] + fn a_node_off_the_viewer_page_says_so() { + let mut source = json!({"viewerPageName": "Cover"}); + attach_node_page(&mut source, &payload_on_page("Screens")); + assert_eq!(source["nodePage"]["name"], "Screens"); + assert!(source["nodePageNote"].as_str().unwrap().contains("lives on \"Screens\"")); + } + + #[test] + fn the_viewer_page_needs_no_note() { + let mut source = json!({"viewerPageName": "Screens"}); + attach_node_page(&mut source, &payload_on_page("Screens")); + assert!(source.get("nodePageNote").is_none()); + } +} diff --git a/crates/devup-mcp/src/server/projection/component_projection.rs b/crates/devup-mcp/src/server/projection/component_projection.rs index e21aa9c5..2c5f86f3 100644 --- a/crates/devup-mcp/src/server/projection/component_projection.rs +++ b/crates/devup-mcp/src/server/projection/component_projection.rs @@ -1,8 +1,6 @@ /// Marks the page root, its top-level children (the sections), their /// children and every asset with `data-figma-node-id`, so the runtime audit captures a section -/// or an asset by the node it came from. Only for exports into a project -/// (`projectRoot`); `.devup/screen-plan.config.json` `figmaNodeIds: false` -/// turns it off. +/// or an asset by the node it came from. Only when `figmaNodeIds` is true. fn annotate_node_ids( output: &mut devup_mcp_devup_ui::codegen::CodegenOutput, snapshot: &devup_mcp_figma::Snapshot, @@ -58,43 +56,75 @@ fn generate_collected_component( node_id: &str, options: &CodegenOptions, ) -> Result { - if !options.inline_instances { + let snapshot = &payload.snapshot; + let root = snapshot.nodes.get(node_id); + let master = root.filter(|node| node.node_type == "INSTANCE").and_then(|node| { + let view = node.typed_view(); + view.string("mainComponentId") + .or_else(|| view.string("componentId")) + .or_else(|| view.string("mainComponent")) + .or_else(|| view.value("mainComponent").and_then(|value| value.get("id")).and_then(Value::as_str)) + }); + let target = master.and_then(|id| snapshot.nodes.get(id)).or(root); + let target = target.and_then(|node| { + let parent = node.typed_view().string("parentId") + .and_then(|id| snapshot.nodes.get(id)) + .filter(|parent| parent.node_type == "COMPONENT_SET"); + parent.or(Some(node)) + }); + if !options.inline_instances + && !target.is_some_and(|node| matches!(node.node_type.as_str(), "COMPONENT" | "COMPONENT_SET")) + { let mut pending = vec![node_id]; let mut visited = std::collections::BTreeSet::new(); while let Some(id) = pending.pop() { if !visited.insert(id) { continue; } - let Some(node) = payload.snapshot.nodes.get(id) else { + let Some(node) = snapshot.nodes.get(id) else { continue; }; let view = node.typed_view(); if view.bool("visible") == Some(false) { continue; } - if node.node_type == "INSTANCE" { - let component_id = view - .string("mainComponentId") + if node.node_type == "INSTANCE" + && let Some(component_id) = view.string("mainComponentId") .or_else(|| view.string("componentId")) .or_else(|| view.string("mainComponent")) - .or_else(|| { - view.value("mainComponent") - .and_then(|value| value.get("id")) - .and_then(Value::as_str) - }); - if let Some(component_id) = component_id - && !payload.snapshot.nodes.contains_key(component_id) - { - return Err(DevupError::with_details( - ErrorCode::DevupFigmaNodeNotFound, - "componentTsx needs a component master outside this snapshot. Re-collect the component master, or request tsx to inline the instance.", - false, - json!({"componentId":component_id,"instanceNodeId":id}), - )); - } + .or_else(|| view.value("mainComponent").and_then(|value| value.get("id")).and_then(Value::as_str)) + && !snapshot.nodes.contains_key(component_id) + { + return Err(DevupError::with_details( + ErrorCode::DevupFigmaNodeNotFound, + "componentTsx needs a component master outside this snapshot. Re-collect the component master, or request tsx to inline the instance.", + false, + json!({"componentId":component_id,"instanceNodeId":id}), + )); } pending.extend(view.child_ids()); } } - generate_component(&payload.snapshot, node_id, options) + generate_component(snapshot, target.map_or(node_id, |node| node.id.as_str()), options) +} + +fn component_definition_actions( + payload: &CollectedPayload, + tsx: &str, + result: &Map, +) -> Vec { + payload.snapshot.nodes.values() + .filter(|node| node.node_type == "COMPONENT_SET") + .filter_map(|node| { + let name = node.typed_view().name()?; + let name = devup_mcp_devup_ui::codegen::normalize_component_name(name); + tsx.contains(&format!("from \"@/components/{name}\"" )).then(|| json!({ + "name": name, "nodeId": node.id, + "nextAction": {"tool":"devup_figma_export", "arguments":{ + "artifactId":result["cache"]["artifactId"], + "frameIds":[node.id], "outputs":["componentTsx"] + }} + })) + }) + .collect() } diff --git a/crates/devup-mcp/src/server/projection/feedback_codegen_tests.rs b/crates/devup-mcp/src/server/projection/feedback_codegen_tests.rs new file mode 100644 index 00000000..d1b1825a --- /dev/null +++ b/crates/devup-mcp/src/server/projection/feedback_codegen_tests.rs @@ -0,0 +1,176 @@ +#[tokio::test] +async fn feedback36_confirmed_pair_merges_despite_different_names() { + let directory = std::env::temp_dir().join(format!("feedback36-{}", rand::random::())); + std::fs::create_dir_all(directory.join(".devup")).unwrap(); + std::fs::write(directory.join(".devup/screen-plan.json"), json!({ + "kind":"devup-screen-plan", "schemaVersion":1, "status":"confirmed", + "routes":[{"route":"/technology", "nodeIds":["1:1", "1:2"]}] + }).to_string()).unwrap(); + let mut data = responsive_payload(); + data.snapshot.nodes.get_mut("1:1").unwrap().fields.insert("name".into(), json!("Small technology")); + data.snapshot.nodes.get_mut("1:2").unwrap().fields.insert("name".into(), json!("Technology overview")); + let mut op = operation(&["responsiveTsx"]); + if let PendingOperation::Export { frame_ids, theme_options, .. } = &mut op { + *frame_ids = vec!["1:1".into(), "1:2".into()]; + theme_options.project_root = Some(directory.to_string_lossy().into_owned()); + } + let result = project(data, op).await.unwrap(); + assert!(result["responsiveTsx"].is_string(), "{result}"); + assert_eq!(result["responsiveSlots"], json!([0,4])); + std::fs::remove_dir_all(directory).unwrap(); +} + +#[tokio::test] +async fn feedback36_refusal_preserves_frame_files_and_artifact_recovery() { + let directory = std::env::temp_dir().join(format!("feedback36-files-{}", rand::random::())); + std::fs::create_dir_all(&directory).unwrap(); + let mut data = responsive_payload(); + data.snapshot.nodes.get_mut("1:2").unwrap().fields.insert("width".into(), json!(400)); + let mut op = operation(&["tsx", "responsiveTsx"]); + if let PendingOperation::Export { frame_ids, output_paths, .. } = &mut op { + *frame_ids = vec!["1:1".into(), "1:2".into()]; + output_paths.insert("frame:1:1:tsx".into(), directory.join("mobile.tsx").to_string_lossy().into_owned()); + } + let result = project(data, op).await.unwrap(); + assert!(std::fs::read_to_string(directory.join("mobile.tsx")).unwrap().contains("export")); + let failure = result["failures"].as_array().unwrap().iter().find(|failure| failure["output"] == "responsiveTsx").unwrap(); + assert_eq!(failure["details"]["frameReasons"].as_array().unwrap().len(), 2); + assert_eq!(failure["details"]["nextAction"]["arguments"]["artifactId"], result["cache"]["artifactId"]); + assert_eq!(failure["details"]["nextAction"]["arguments"]["outputs"], json!(["tsx"])); + assert_ne!(result["status"], "complete"); + std::fs::remove_dir_all(directory).unwrap(); +} + +fn feedback32_component_payload() -> CollectedPayload { + let mut data = payload(); + data.target.node_id = Some("set".into()); + data.snapshot = serde_json::from_value(json!({ + "fileKey":"W1Fixture","version":null,"roots":["set"],"diagnostics":[], + "nodes":{ + "set":{"id":"set","type":"COMPONENT_SET","fields":{ + "name":"Button","width":900,"height":600,"childrenIds":["default","hover"], + "componentPropertyDefinitions":{"effect":{"type":"VARIANT","defaultValue":"default","variantOptions":["default","hover"]}} + }}, + "default":{"id":"default","type":"COMPONENT","fields":{ + "name":"effect=default","parentId":"set","childrenIds":["label"], + "variantProperties":{"effect":"default"},"width":100,"height":40, + "fills":[{"type":"SOLID","color":{"r":1,"g":0,"b":0}}] + }}, + "hover":{"id":"hover","type":"COMPONENT","fields":{ + "name":"effect=hover","parentId":"set","childrenIds":["hover-label"], + "variantProperties":{"effect":"hover"},"width":100,"height":40, + "fills":[{"type":"SOLID","color":{"r":0,"g":0,"b":1}}] + }}, + "label":{"id":"label","type":"TEXT","fields":{"characters":"Submit","parentId":"default"}}, + "hover-label":{"id":"hover-label","type":"TEXT","fields":{"characters":"Submit","parentId":"hover"}} + } + })).unwrap(); + data +} + +#[tokio::test] +async fn feedback66_component_roots_export_despite_uncaptured_nested_master() { + for root in ["set", "default", "instance"] { + let mut data = feedback32_component_payload(); + data.snapshot.nodes.insert("nested".into(), serde_json::from_value(json!({ + "id":"nested","type":"INSTANCE","fields":{"name":"Icon","mainComponentId":"outside"} + })).unwrap()); + data.snapshot.nodes.get_mut("default").unwrap().fields.insert("childrenIds".into(), json!(["label","nested"])); + data.snapshot.nodes.insert("instance".into(), serde_json::from_value(json!({ + "id":"instance","type":"INSTANCE","fields":{"name":"Button","mainComponentId":"default"} + })).unwrap()); + data.target.node_id = Some(root.into()); + data.snapshot.roots = vec![root.into()]; + let directory = std::env::temp_dir().join(format!("feedback66-{}", rand::random::())); + std::fs::create_dir_all(&directory).unwrap(); + let path = directory.join("Button.tsx"); + let mut op = operation(&["componentTsx", "sourceMap"]); + if let PendingOperation::Export { output_paths, .. } = &mut op { + output_paths.insert("componentTsx".into(), path.to_string_lossy().into_owned()); + } + let result = project(data, op).await.unwrap(); + let code = result["componentTsx"].as_str().expect("component definition"); + assert!(code.contains("export function Button"), "{root}: {result}"); + assert_eq!(std::fs::read_to_string(path).unwrap(), code); + assert!(result["failures"].as_array().unwrap().is_empty(), "{root}: {result}"); + std::fs::remove_dir_all(directory).unwrap(); + } +} + +#[tokio::test] +async fn feedback32_component_set_has_no_canvas_coverage_failure() { + let result = project(feedback32_component_payload(), operation(&["tsx"])).await.unwrap(); + let code = result["tsx"].as_str().unwrap(); + assert_eq!(code.matches("export function Button").count(), 1); + assert!(!code.contains("900px"), "{code}"); + assert!(!code.contains("600px"), "{code}"); + assert!(code.contains("_hover="), "{code}"); + assert!(!code.contains("effect:"), "{code}"); + assert!(!code.contains("dashed"), "{code}"); + assert!(!result["projectionIssues"].as_array().into_iter().flatten().any(|issue| + issue["code"] == "DEVUP_CODEGEN_SECTION_COVERAGE" && issue["nodeId"] == "set" + ), "{result}"); +} + +#[tokio::test] +async fn feedback64_node_identity_requires_explicit_opt_in() { + for enabled in [false, true] { + let mut op = operation(&["tsx", "componentTsx", "sourceMap"]); + if let PendingOperation::Export { theme_options, .. } = &mut op { + theme_options.figma_node_ids = enabled; + } + let result = project(payload(), op).await.unwrap(); + for output in ["tsx", "componentTsx"] { + let code = result[output].as_str().unwrap(); + assert_eq!(code.contains("data-figma-node-id"), enabled, "{output}: {code}"); + } + assert!(result["sourceMap"].is_object(), "{result}"); + let mut op = operation(&["responsiveTsx"]); + if let PendingOperation::Export { theme_options, frame_ids, .. } = &mut op { + theme_options.figma_node_ids = enabled; + *frame_ids = vec!["1:1".into(), "1:2".into()]; + } + let result = project(responsive_payload(), op).await.unwrap(); + let code = result["responsiveTsx"].as_str().unwrap(); + assert_eq!(code.contains("data-figma-node-id"), enabled, "{code}"); + } +} + +#[tokio::test] +async fn feedback32_screen_reference_offers_component_export() { + let mut data = feedback32_component_payload(); + data.target.node_id = Some("screen".into()); + data.snapshot.roots = vec!["screen".into()]; + for (id, node) in [ + ("screen", json!({"id":"screen","type":"FRAME","fields":{"name":"Screen","childrenIds":["instance"]}})), + ("instance", json!({"id":"instance","type":"INSTANCE","fields":{"name":"Button","mainComponentId":"default","variantProperties":{"effect":"default"}}})), + ] { + data.snapshot.nodes.insert(id.into(), serde_json::from_value(node).unwrap()); + } + let result = project(data, operation(&["componentTsx"])).await.unwrap(); + assert!(result["componentTsx"].as_str().unwrap().contains("@/components/Button"), "{result}"); + let action = &result["componentDefinitions"][0]["nextAction"]; + assert_eq!(action["tool"], "devup_figma_export"); + assert_eq!(action["arguments"]["frameIds"], json!(["set"])); + assert_eq!(action["arguments"]["outputs"], json!(["componentTsx"])); + assert_eq!(action["arguments"]["artifactId"], result["cache"]["artifactId"]); +} + +#[tokio::test] +async fn feedback65_component_reference_uses_master_set_and_variant_props() { + let mut data = feedback32_component_payload(); + data.target.node_id = Some("screen".into()); + data.snapshot.roots = vec!["screen".into()]; + for (id, node) in [ + ("screen", json!({"id":"screen","type":"FRAME","fields":{"name":"Screen","childrenIds":["instance"]}})), + ("instance", json!({"id":"instance","type":"INSTANCE","fields":{"name":"Unrelated layer name","mainComponentId":"default","variantProperties":{"size":"sm","effect":"default"}}})), + ] { + data.snapshot.nodes.insert(id.into(), serde_json::from_value(node).unwrap()); + } + let result = project(data, operation(&["componentTsx"])).await.unwrap(); + let code = result["componentTsx"].as_str().unwrap(); + assert!(code.contains("import { Button } from \"@/components/Button\""), "{code}"); + assert!(code.contains("